Assembly 这是一个函数的汇编代码,我没有完全理解这两行代码的含义和结果
这是两行汇编代码 0x0000000000400e8e:mov-0x8(%rbx),%eaxAssembly 这是一个函数的汇编代码,我没有完全理解这两行代码的含义和结果,assembly,x86-64,reverse-engineering,att,Assembly,X86 64,Reverse Engineering,Att,这是两行汇编代码 0x0000000000400e8e:mov-0x8(%rbx),%eax 0x0000000000400e91:添加-0x4(%rbx),%eax 以下是整个汇编代码和打印的寄存器,其中左侧的箭头表示代码当前所处的位置: Dump of assembler code for function phase_2: 0x0000000000400e6c <+0>: push %rbp 0x0000000000400e6d <+1>:
0x0000000000400e91:添加-0x4(%rbx),%eax 以下是整个汇编代码和打印的寄存器,其中左侧的箭头表示代码当前所处的位置:
Dump of assembler code for function phase_2:
0x0000000000400e6c <+0>: push %rbp
0x0000000000400e6d <+1>: push %rbx
0x0000000000400e6e <+2>: sub $0x28,%rsp
0x0000000000400e72 <+6>: mov %rsp,%rsi
0x0000000000400e75 <+9>: callq 0x401391 <read_six_numbers>
0x0000000000400e7a <+14>: cmpl $0x0,(%rsp)
0x0000000000400e7e <+18>: jne 0x400e87 <phase_2+27>
0x0000000000400e80 <+20>: cmpl $0x1,0x4(%rsp)
0x0000000000400e85 <+25>: je 0x400ea8 <phase_2+60>
0x0000000000400e87 <+27>: callq 0x40136f <explode_bomb>
0x0000000000400e8c <+32>: jmp 0x400ea8 <phase_2+60>
=> 0x0000000000400e8e <+34>: mov -0x8(%rbx),%eax
0x0000000000400e91 <+37>: add -0x4(%rbx),%eax
0x0000000000400e94 <+40>: cmp %eax,(%rbx)
0x0000000000400e96 <+42>: je 0x400e9d <phase_2+49>
0x0000000000400e98 <+44>: callq 0x40136f <explode_bomb>
0x0000000000400e9d <+49>: add $0x4,%rbx
0x0000000000400ea1 <+53>: cmp %rbp,%rbx
0x0000000000400ea4 <+56>: jne 0x400e8e <phase_2+34>
0x0000000000400ea6 <+58>: jmp 0x400eb4 <phase_2+72>
0x0000000000400ea8 <+60>: lea 0x8(%rsp),%rbx
0x0000000000400ead <+65>: lea 0x18(%rsp),%rbp
0x0000000000400eb2 <+70>: jmp 0x400e8e <phase_2+34>
0x0000000000400eb4 <+72>: add $0x28,%rsp
0x0000000000400eb8 <+76>: pop %rbx
0x0000000000400eb9 <+77>: pop %rbp
0x0000000000400eba <+78>: retq
End of assembler dump.
功能阶段2的汇编程序代码转储:
0x0000000000400e6c:推送%rbp
0x0000000000400e6d:推送%rbx
0x0000000000400e6e:子$0x28,%rsp
0x0000000000400e72:mov%rsp,%rsi
0x0000000000400e75:callq 0x401391
0x0000000000400e7a:cmpl$0x0,(%rsp)
0x0000000000400e7e:jne 0x400e87
0x0000000000400e80:cmpl$0x1,0x4(%rsp)
0x0000000000400e85:je 0x400ea8
0x0000000000400e87:callq 0x40136f
0x0000000000400e8c:jmp 0x400ea8
=>0x0000000000400e8e:mov-0x8(%rbx),%eax
0x0000000000400e91:添加-0x4(%rbx),%eax
0x0000000000400e94:cmp%eax,(%rbx)
0x0000000000400e96:je 0x400e9d
0x0000000000400e98:callq 0x40136f
0x0000000000400e9d:添加$0x4,%rbx
0x0000000000400ea1:cmp%rbp,%rbx
0x0000000000400ea4:jne 0x400e8e
0x0000000000400ea6:jmp 0x400eb4
0x0000000000400ea8:lea 0x8(%rsp),%rbx
0x0000000000400ead:lea 0x18(%rsp),%rbp
0x0000000000400eb2:jmp 0x400e8e
0x0000000000400eb4:添加$0x28,%rsp
0x0000000000400eb8:弹出%rbx
0x0000000000400eb9:弹出%rbp
0x0000000000400eba:retq
汇编程序转储结束。
这是用于组装的AT&T
mov
指令具有一般语法:
mov source, dest
%
用作寄存器的前缀,以区别于相同名称的符号/标签1
另外,(%reg)
意味着使用寄存器reg
的内容值访问内存
此外,类似于-0x8(%rbx)
的内容表示通过从rbx
寄存器中的值减去8而获得的地址处的内存内容
因此,第一条指令意味着将地址[rbx
-8]处的内存内容移动到寄存器eax
在类似的行中,add
指令意味着将地址[rbx
-4]处的内存内容添加到寄存器eax
脚注1:例如,
mov%eax,eax
是使用绝对寻址模式将eax寄存器内容存储到C全局变量int eax
。通常在64位代码中,您会使用mov%eax、varname(%rip)
进行静态存储,但绝对寻址是可能的,并且是在32位代码中直接使用符号地址的唯一选项。请注意,在到达加载+添加指令之前运行的lea0x8(%rsp),%rbx
。所以它只是得到一个指向堆栈上数组的指针,对于该数组上的指针增量循环。你能说得更具体一些吗?例如,你明白但看不出这些说明是如何适用的?否则,只需阅读一本关于AT&T语法如何工作的手册,以及mov和add的功能,并使用您已经使用的GDB单步实现asm。