使用 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?

Yasm 使用 intel 语法编译 64 位代码

Ubuntu 16.04使用NASM编译时用ld链接程序出现:i386 架构于输入文件 sandbox.o 与 i386:x86-64 输出不兼容(I386 architecture in the i

拼命尝试使用 wprintf 在 64 位 NASM x86 程序集中打印 unicode

将两个32位数相乘并将64位结果打印为十进制NASM程序集