这是一个函数的汇编代码,我不太明白这两行的意思和结果

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 位代码中直接使用符号地址的唯一选择。

【讨论】:

以上是关于这是一个函数的汇编代码,我不太明白这两行的意思和结果的主要内容,如果未能解决你的问题,请参考以下文章

我不明白这是啥意思:+“在重新定位处理期间要评估的函数”

这是一些 Keras 代码。我不明白“(x)”是啥意思

显示提到的这两行的 css 属性的类型错误

java的数组问题感觉不太明白,谁能详细给我讲解下。

汇编的问题

使用 TYPE 指令汇编 MASM x86