为什么有多个举动而不是一个?

时间:2019-01-16 15:02:49

标签: assembly x86

我正在检查gdb中的反汇编程序,我发现了这些行,但不明白为什么要这么做...

0x00000000004005ef <+50>:   mov    rax,QWORD PTR [rbp-0x10]
0x00000000004005f3 <+54>:   add    rax,0x8
0x00000000004005f7 <+58>:   mov    rax,QWORD PTR [rax]

为什么它没有这样做?

0x00000000004005ef <+50>:   mov    rax,QWORD PTR [rbp-0x8]

2 个答案:

答案 0 :(得分:4)

[rbp-0x8][rbp-0x10]是两个不同的局部变量。您的代码与反汇编代码完全不同。

具有以下c代码,

{
  int64_t a;    // [rbp-0x8] is a
  int64_t *p;   // [rbp-0x10] is p; not *p
  ...
}

程序将*(p+1)中的RAX(1 int64的大小为8个字节)插入。

MOV  RAX, [rbp-0x10]  ; RAX <-- p
ADD  RAX, 8           ; RAX <-- p + 1
MOV  RAX, [RAX]       ; RAX <-- *(p + 1) 

您的代码将获得完全不同的变量a

MOV  RAX, [rbp-0x8]   ; RAX <-- a

答案 1 :(得分:-1)

我不这样认为:

a)

0x00000000004005ef <+50>: mov rax,QWORD PTR [rbp-0x10] ; move the 8bytes starting at the address 
                                                       ; [rbp-0x10] to rax
0x00000000004005f3 <+54>: add rax,0x8                  ; rax = rax + 0x08 
0x00000000004005f7 <+58>: mov rax,QWORD PTR [rax]      ; move the 8bytes starting at the address 
                                                       ; [rax] to rax

b)

0x00000000004005ef <+50>: mov rax,QWORD PTR [rbp-0x8]  ; move the 8bytes starting at the address 
                                                       ; [rbp-0x8] to rax

“ a)” 看起来像是代码的一部分,该代码加载地址,应用(整数)偏移量并取消引用地址。但是,“ b)” 的起始地址是不同的(尽管不读取来自该不同地址的值)。