使用 NASM 在 64 位模式下不支持 pop 指令?
Posted
技术标签:
【中文标题】使用 NASM 在 64 位模式下不支持 pop 指令?【英文标题】:pop Instruction not supported in 64-bit mode using NASM? 【发布时间】:2012-06-12 18:47:20 【问题描述】:我正在使用 NASM following this tutorial(第 4 节)开发一个更深入的 hello world。本教程主要教您如何处理命令行输入。 这是相关代码的sn-p:
section .text
global _start
_start:
pop ebx ; arg count
pop ebx ; arg[0] the program name
pop ebx ; arg[1-n] the remainder of the args
; must each be indiviually popped
error: instruction not supported in 64-bit mode
在编译过程中出现代码错误,参考上面的 3 条弹出指令。 Upon viewing the docs 看来此代码仅适用于 32 位系统。
是否有 64 位 pop
指令?有人有使用pop
的 64 位教程吗?
【问题讨论】:
您知道本教程是针对 32 位的吗?我相信您可以通过将输出格式设置为elf32
而不是 elf
来生成 32 位代码,这应该让您即使在 64 位机器上也可以遵循本教程...
@Aedin - 是的,如果遵循该教程,您应该保持 32 位模式。使用 64 位时不仅寄存器名称不同,调用约定也不同。仅替换 pop
不太可能奏效。
【参考方案1】:
是的,64 位 pop
指令是... POP。 :-) 不过,您需要对 64 位寄存器使用它(例如 rbx
)。
【讨论】:
当我替换为POP.
时,出现此错误:“error: parser: instruction expected”我正在使用nasm -f elf64 myfile.asm
myfile 包含这一行:POP. eax;
@hasany 删除“。”因为它导致语法错误。它应该只是“POP EAX”
@hasany 您在该指令之前可能有语法错误。或者您可能缺少必需的汇编程序指令。我建议您在此站点上打开您自己的问题,其中包含导致错误所需的最少源代码。【参考方案2】:
基本上您可以通过将 eax 替换为 rax 将其转换为 64 位(所有其他寄存器也是如此)
【讨论】:
以上是关于使用 NASM 在 64 位模式下不支持 pop 指令?的主要内容,如果未能解决你的问题,请参考以下文章
NASM x86_64在32位模式下组装:为什么该指令产生RIP相对寻址代码?
为啥英特尔微处理器的 64 位模式不支持 MOV AH,1?
Ubuntu 16.04使用NASM编译时用ld链接程序出现:i386 架构于输入文件 sandbox.o 与 i386:x86-64 输出不兼容(I386 architecture in the i