如何解决为什么有一个 8 字节的偏移量来存储整数?
我正在尝试学习汇编,我正在遵循一本书的指南,在这本书中,作者反汇编了一个非常简单的 C 程序,并逐行完成了汇编。我正在做同样的事情,但我得到的结果略有不同。我使用的 /debugger 与作者不同(他使用的是 gdb,我使用的是 lldb),所以我确信这会导致差异,但我想知道是否有人可以解释这个示例中的差异。>
我们正在分析的 C 程序是这样的:
main()
{
int i;
for(i = 0; i < 10; i++)
{
puts("Hello,world!");
}
return 0;
}
这是我的反汇编代码(我使用的是 lldb)
a.out`main:
0x100000f40 <+0>: push rbp
0x100000f41 <+1>: mov rbp,rsp
0x100000f44 <+4>: sub rsp,0x10
0x100000f48 <+8>: mov dword ptr [rbp - 0x4],0x0
-> 0x100000f4f <+15>: mov dword ptr [rbp - 0x8],0x0
0x100000f56 <+22>: cmp dword ptr [rbp - 0x8],0xa
0x100000f5a <+26>: jge 0x100000f7d ; <+61> at firstprog.c
0x100000f60 <+32>: lea rdi,[rip + 0x3f] ; "Hello,world!"
0x100000f67 <+39>: call 0x100000f86 ; symbol stub for: puts
0x100000f6c <+44>: mov dword ptr [rbp - 0xc],eax
0x100000f6f <+47>: mov eax,dword ptr [rbp - 0x8]
0x100000f72 <+50>: add eax,0x1
0x100000f75 <+53>: mov dword ptr [rbp - 0x8],eax
0x100000f78 <+56>: jmp 0x100000f56 ; <+22> at firstprog.c:6:15
0x100000f7d <+61>: xor eax,eax
0x100000f7f <+63>: add rsp,0x10
0x100000f83 <+67>: pop rbp
0x100000f84 <+68>: ret
为什么箭头为 rbp
的直线上的偏移量为 0x8
?在书中的示例中,它只有 0x4
,而且我知道我将要存储一个 int
,所以它应该是 0x4
。我看到它也为 0x4
提供了一个偏移量,但为什么要继续使用 0x8
?我是汇编方面的初学者,如果这是一个明显的问题,我深表歉意。
解决方法
如果您想学习汇编 - 不要从 -O0
(无优化)汇编输出中学习。
通过对程序集的优化,输出更加合乎逻辑:
.LC0:
.string "Hello,world!"
main:
push rbx
mov ebx,10
.L2:
mov edi,OFFSET FLAT:.LC0
call puts
sub ebx,1
jne .L2
xor eax,eax
pop rbx
ret
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。