assembly - 当我尝试编译此代码时,以下代码的输出是什么,它会生成错误 - 警告:`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
解决方案
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 跟踪的信息(一致的语法意味着它从不需要该信息开始)使其模棱两可(可能组装错误)。
推荐阅读
- performance - 如何加速theano扫描模块?
- php - 升级到 Wordpress 5.6.3 和 5.7.1 - 找不到变量:Backbone
- flutter - 尽管有 Scaffold 和 MaterialApp,但没有找到 Overlay 小部件
- django - 如何解决这个问题:parallel_offset 不再起作用
- javascript - formGroup 在角度上被贬低了?
- angular - Ionic 5(Angular9)-错误:未捕获(承诺):错误:无法匹配任何路由。URL 段:“个人资料”
- python - 如何通过python拆分与其中每个主题或标题相关的pdf文件?
- javascript - 从给定数组和 JavaScript 中选择的时间计算时间
- excel - 值不为 0 且不为空时的 IF 条件
- ios - iOS 上的 Ionic5 自动播放音频