endbr64:
push rbp
mov rbp,rsp
push rbx
sub rsp,0x18
mov DWORD PTR [rbp-0x14],edi
cmp DWORD PTR [rbp-0x14],0x0
je 0x1185 <fib+28>
cmp DWORD PTR [rbp-0x14],0x1
jne 0x118c <fib+35>
mov eax,0x1
jmp 0x11aa <fib+65>
mov eax,DWORD PTR [rbp-0x14]
sub eax,0x1
mov edi,eax
call 0x1169 <fib>
mov ebx,eax
mov eax,DWORD PTR [rbp-0x14]
sub eax,0x2
mov edi,eax
call 0x1169 <fib>
add eax,ebx
add rsp,0x18
pop rbx
pop rbp
ret
main:
endbr64
push rbp
rbp,rsp
mov rax,QWORD PTR [rip+0x2e50] # 0x4010 <stdout@@GLIBC_2.2.5>
mov esi,0x0
mov rdi,rax
call 0x1060 <setbuf@plt>
mov edi,0x1c
call 0x1169 <fib>
mov esi,eax
lea rdi,[rip+0xe24] # 0x2004
mov eax,0x0
call 0x1070 <printf@plt>
mov eax,0x0
pop rbp
ret
PTR
是MASM语法,最初不受NASM支持(主要是因为MASM语法不一致且难以阅读(。
最近,NASM开发人员添加了代码来检测是否使用了PTR
,并在使用时警告人们,这样,如果人们在汇编程序期望使用NASM语法时错误地尝试使用MASM语法,他们就可以更好地了解出错的原因。默认情况下会启用此警告。如果您希望出现问题,则可以禁用警告(-w-ptr
(。
有两种解决方案是有意义的:
a( 将代码转换为NASM语法(例如mov DWORD PTR [rbp-0x14],edi
将变为mov [rbp-0x14],edi
(。
b( 启用(新的、实验性的、部分的(";masm兼容性";包(将%use masm
指令放在代码的开头(。这可能不太好用,因为有些事情(例如mov eax,foo
(取决于符号是如何定义的,而这不是NASM跟踪的信息(一致的语法意味着它一开始就不需要这些信息(,这使得它变得模糊(可能组装错误(。