首页 > 解决方案 > 当我尝试编译此代码时,以下代码的输出是什么,它会生成错误 - 警告:`PTR' is not a NASM keyword [-w+ptr]

问题描述

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 

标签: assemblynasm

解决方案


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 跟踪的信息(一致的语法意味着它从不需要该信息开始)使其模棱两可(可能组装错误)。


推荐阅读