假设我们有一个call foo语句。因此,当汇编程序遇到call语句时,它会将其分解为-
push ip + 6
jmp <addr of foo>
我有寄存器ebx里的寄存器地址。现在我想找出“foo的地址”。我该怎么做呢?我想确认push语句出现在jmp之前。内存映射会是这样的吗?
-------
push (what will be the value stored in this byte?? opcode ??)
-------
jmp (what will be the value stored in this byte?? opcode ??)
-------
jmp
如果我使用这个操作码
JMP
Jump to New Location
(PC+1) -> PCL
(PC+2) -> PCH
N Z C I D V
- - - - - -
addressing assembler opc bytes cycles
absolute JMP oper 4C 3 3
并给它一个十六进制值,比如0x0604,它会跳到那个位置,执行在那里的东西,然后继续直到它返回到JMP语句,或者它会在0x0604处执行什么,然后在JMP之后执行下一个指令
我设法获得了词法分析器、语法检查器和语义,现在我想转到中间代码生成。问题是我不知道如何处理逻辑表达式。我读到了一些关于E.true和E.false的东西。这个例子无处不在,但我不理解它。
例如,如果我有以下代码
if x>y and x<y or x == 1 then
//super duper code here
x = x+1
else
//super duper wow code here
y = y+1
endif
结果必须是这样的
1: > x y 3
2: jmp _ _ 9
3: < x y 7
4: jmp _
我正在linux中调试一个崩溃,并正在遍历函数的程序集。
崩溃发生在似乎无法到达的源行上:
cmp %edx,%esi // f >= &funcs->fns[0]
jae 0xb6e17b88 // enter for loop
jmp 0xb6e17c08 // exit for loop
lea 0x0(%esi,%eiz,1),%esi // crashes here - how do we even get here since there is a
我想通过LLVM在目标程序中插入一个跳转指令。我知道分支可以用来实现LLVM中基本块的跳转。但我想要实现的是在同一个基本块中跳转指令(假设我知道跳转的目的地地址)。我该怎么做?伊涅斯姆?你能给我举个例子吗?
例如,在C语言中,我可以实现这一点:
// before insert jmp
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a<b)
{
printf("hh\n");
printf("jump hh\n")
我正在尝试从编写引导加载程序。编写的代码是
BITS 16
start:
mov ax, 07C0h ; Set up 4K stack space after this bootloader
add ax, 288 ; (4096 + 512) / 16 bytes per paragraph
mov ss, ax
mov sp, 4096
mov ax, 07C0h ; Set data segment to where we're loaded
mov ds, ax
mov si, t
当我使用jmp时,我有一个分割错误。
第一次,我只使用jmp 0x30,我得到了分割错误。
我使用gdb对我的程序进行了调试,我看到在调用jmp之后,它跳到了一个绝对地址。
(gdb) b main
Breakpoint 1 at 0x80483b7: file f.c, line 3.
(gdb) r
Starting program: /root/work/f
Breakpoint 1, main () at f.c:3
3 __asm__("jmp 0x30\n"
(gdb) n
0x00000030 in ?? ()
(gdb)
我认为它可能是一个相对地址
我正在编写一些Lua代码,它可以读取string.dump()函数生成的字节码。我假设(因为它允许一些优化和更少的编码),所有OP_JMP指令在用于if语句时都会增加指令指针的前向。从技术上讲,它们可以向后跳转,因为它们使用了sBx值(可以是负值)。我只对来自标准Lua5.1实现的if语句的字节码感兴趣。
我使用了 (很棒的工具btw)来查看几个示例的字节码。
下面是一个基本的if语句:
a, b = 1, 2
if a == b then
print '='
elseif a < b then
print '<'
else
print
我被告知要尝试使用'jmp‘而不是'call',但是'jmp’不喜欢我..当我跳转的时候,它不会返回(所以它永远不会退出,这是不愉快的日子),但调用返回和退出是正常的。
我很高兴使用'call‘,但我真的有理由尝试克服'jmp’吗?
这段简单的代码只是显示了当我jmp时,它永远不会返回和退出。
_start:
jmp _Print
jmp _Exit
ret
_Exit:
; normal exit
ret
_Print
; print something
ret
还有..。如果有什么改变的话
我正在编写一个开发工具,从零开始生成一个shell。(即用于缓冲区溢出)。我面临的问题之一是如何使jmp语句正常工作。我的理解是jmp指令相对于ip。但是,当我试图在内联程序集中运行以下内容时,我会跳转到一个绝对地址。
jmp 0x28 #in inline GCC will jump to address 0x28 not 0x28 relative to the ip
其中一种方法是使用IP作为指令的一部分,如下所示:
jmp *0x28(%rip) #will jump to address 0x28 relative to the ip
然而,当我这样做时,我会得到jmp上的一个分段错
我正在进行组装项目(使用tasm),在跳转时遇到了一个非常奇怪的问题,我得到的错误是:相对跳出(数字)字节,据我理解,当您尝试跳转太多行时,下面是(我认为)相关代码:
IDEAL
MODEL small
STACK 100h
proc keyUsagePaint
mov bx,[playerSize]
mov ah,[byte ptr keyHolder]
push [playerX]
pop [tempX]
push [playerY]
pop [tempY]
;Checking the key and jumping ac
我查看了c代码的反汇编,发现指向函数的指针实际上指向jmp指令,而不是指向内存中函数的真正开始(不指向代表函数帧开始的push ebp指令)。
我有下面的函数(它基本上什么也不做,它只是一个例子):
int func2(int a, int b)
{
return 1;
}
我尝试打印函数的地址- printf("%p", &func2);
我查看了代码的反汇编,发现打印的地址是汇编代码中jmp指令的地址。我想要获取代表函数帧开始的地址。有没有办法从jmp指令的给定地址来计算它?此外,我还有代表jmp指令的字节。
011A11EF E9 CC 08 00 00
我目前正在学习程序集x86,我为自己做了一个小任务。
C代码:
if (a == 4711) { a = a + 2 } else
{ a = a - 2 }
汇编程序代码(eax是一个寄存器,cmp是比较的,jne是跳转,如果不相等,jmp是跳转):
mov eax, a
cmp eax, 4711
jmp equal
equal: add eax, 2
jne unequal
unequal: sub eax, 2
我认为比这更有效率:
mov eax, a
我试图使用内联程序集插入一个JMP指令,但是我看到一个错误:
“预期表达”
// Allocate a place in memory for the bytes
BYTE *jmp = (BYTE*)malloc(len + 5);
// Copy the bytes of original + length to the allocated memory place:
memcpy(jmp, orig, len);
// Next we want to insert a jump back to the original + length
jmp += len; // increm
我试图跳过不使用标签的1条指令,使用标签的一个例子是:
cmp r12, r13
je dest ; skip the jmp
jmp whatever
dest:
nop
但是,我的限制是我不能使用标签,所以我假设我必须创建一个相对于RIP寄存器的跳转。例如(伪):
cmp r12, r13
je rip+0x05 ; this would obviously depend on the length of the next instruction
jmp whatever
nop
然而,我缺乏知识来产生任何有用的东西,而且据我所知,没有黑客就不可能读/写RIP寄存器。
编辑:我只熟悉英特尔
我尝试使用EdSim51仿真器在DAC输出上创建一个斜坡:
CLR P0.7 ; enable the DAC WR line
loop:
MOV P1, A ; move data in the accumulator to the ADC inputs (on P1)
ADD A, #8 ; increase accumulator by 8
JMP loop ; jump back to loop
而且效果很好。然而,03H-30H的ROM是。关于这一点,我编码
JMP 30h ; starts at address 0, 2B instruction
; rese
我目前正在做我的任务,但我有一些问题。
这是任务
就像现在一样,当我写“CC”的时候,我只会回来
Feed me(2 hex digits with the bits prsseeee):CC
Fall Semester
Total Fees = $ 97
当我应该回来的时候
Feed me(2 hex digits with the bits prsseeee): CC
Fall Semester
12 units
CA Resident
Parking
Total Fees = $ 688
这是我到目前为止所做的。
我也只被允许使用
**
到目前为止
program S
我试图计算出在一个C函数的disas中的什么地方实现了% 4。这是一个未经优化编译的程序。下面是C语言中的函数:
uint function (uint len, int* intArray) {
uint i; uint sum = 0;
for (i = 0; i < len-2; i++)
switch (i % 4)
{
case 0 :
sum += countPairsUpTo(len-2,intArray,8,6);
break;
case 1 :
sum += coun
我想编辑第一条指令并将其更改为jmp 100h (给或取几个字节),mov edi,edi取2个字节,jmp 100h取5个字节(如果我错了,请纠正我)
我将机器码编辑为jmp 100h,并添加一个nop将其舍入为6个字节。
.text:08048DD5 mov edi, edi
.text:08048DD7 mov edi, edi
.text:08048DD9 mov edi, edi
.text:08048DDB mov edi,