为什么 syscall 在 NASM 32 位输出中编译,而 popa 在 64 位中不编译?
Why does syscall compile in NASM 32 bit output while popa does not compile in 64 bit?
Intel manual 说:
syscall
指令对于兼容模式(32 位)无效
popa
对 64 位模式无效
所以有没有理由 NASM:
如果我将 popa
与 -f elf64
一起使用,- 会出现编译错误
instruction not supported in 64-bit mode
如果我将 syscall
与 -f elf32
一起使用, - 不会给出编译错误。如果我 运行 可执行文件,我会按预期得到
Illegal instruction (core dumped)
。
为什么要区别对待这两种情况?
在 Ubuntu 14.04 上使用 NASM 版本 2.10.09 进行了测试(应该 OS 不可知论)。
因为 syscall
指令在 32 位模式的 AMD 处理器上也存在(并且有效)。从历史上看,Intel 使用 sysenter
指令,但是当 AMD 提出 64 位扩展时,他们使用了自己的 syscall
,因此当 Intel 接管扩展时,他们也开始支持 syscall
, 但仅限于 64 位模式。
Intel manual 说:
syscall
指令对于兼容模式(32 位)无效popa
对 64 位模式无效
所以有没有理由 NASM:
-
如果我将
- 会出现编译错误
instruction not supported in 64-bit mode
如果我将syscall
与-f elf32
一起使用, - 不会给出编译错误。如果我 运行 可执行文件,我会按预期得到
Illegal instruction (core dumped)
。
popa
与 -f elf64
一起使用,为什么要区别对待这两种情况?
在 Ubuntu 14.04 上使用 NASM 版本 2.10.09 进行了测试(应该 OS 不可知论)。
因为 syscall
指令在 32 位模式的 AMD 处理器上也存在(并且有效)。从历史上看,Intel 使用 sysenter
指令,但是当 AMD 提出 64 位扩展时,他们使用了自己的 syscall
,因此当 Intel 接管扩展时,他们也开始支持 syscall
, 但仅限于 64 位模式。