这是一个函数的汇编代码,我不太明白这两行的意思和结果
Posted
技术标签:
【中文标题】这是一个函数的汇编代码,我不太明白这两行的意思和结果【英文标题】:This is the assembler code for a function, I did not quite get the meaning and the result of these two lines 【发布时间】:2021-07-18 19:15:26 【问题描述】:这是两行汇编代码。
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.
【问题讨论】:
注意lea 0x8(%rsp),%rbx
在这些加载+添加指令到达之前运行。所以它只是获取一个指向堆栈上数组的指针,用于对该数组进行指针增量循环。你能更具体一点吗,例如您做了解但看不到这些说明如何融入其中的任何事情?否则,只需阅读有关 AT&T 语法如何工作以及 mov 和 add 做什么的手册,然后将 asm 与您已经在使用的 GDB 单步执行。
【参考方案1】:
那是 AT&T syntax 用于组装。
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 位代码中直接使用符号地址的唯一选择。
【讨论】:
以上是关于这是一个函数的汇编代码,我不太明白这两行的意思和结果的主要内容,如果未能解决你的问题,请参考以下文章