我正在检查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]
答案 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)” 的起始地址是不同的(尽管不读取来自该不同地址的值)。