Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 这是一个函数的汇编代码,我没有完全理解这两行代码的含义和结果_Assembly_X86 64_Reverse Engineering_Att - Fatal编程技术网

Assembly 这是一个函数的汇编代码,我没有完全理解这两行代码的含义和结果

Assembly 这是一个函数的汇编代码,我没有完全理解这两行代码的含义和结果,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>:

这是两行汇编代码

0x0000000000400e8e:mov-0x8(%rbx),%eax
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。