linux - 为 x64 系统调用编译的 x32 ASM(使用 NASM)不起作用

标签 linux assembly nasm system-calls

系统调用如下:

1 - 退出
3 - 阅读
4 - 写入

它们工作正常。但是,调用如下:

11 - 执行 29 - 暂停

它们不起作用。我试过同时使用十六进制和十进制(只是为了确保我没有搞砸那一端)。请帮忙!

一些简单的东西:

SECTION .text
    global _start
_start:
    xor eax, eax
    xor ebx, ebx
    mov al, 29
    int 80h

这是我编译的方式。我正在运行 x64 位 Arh Linux 并使用 NASM 进行编译以模拟 i386:

nasm -f elf32 -o temp.o file.asm
ld -s -m elf_i386 -o exec temp.o
rm temp.o
./exec

我什么也没得到,而不是暂停或任何东西。它只是停止(不,它不是暂停)。我可以打字,我可以按回车键,我可以做任何我想做的事。一旦我 ctrl+c,它就会关闭。但这不是暂停。

最佳答案

这似乎适用于 x86_64 Archlinux。你怎么确定它不是 pause()ing?

strace'ing 对我来说表明 pause() 确实被调用并产生与您上面描述的相同的特征。从另一个终端向该进程发送 SIGHUP 也会为我恢复执行。

请提供 strace 输出。

关于linux - 为 x64 系统调用编译的 x32 ASM(使用 NASM)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21007991/

相关文章:

cmake - 为什么 nasm 找不到来自 cmake 的包含语句

linux - 持有信号量的代码可以被抢占是什么意思

linux - 将子域重定向到 .htaccess 中的父域

assembly - _SFR_IO8(0x04) 是做什么的?调压器

linux - 奇怪的 Nasm 错误 : invalid combination of opcode and operands

assembly - 无法在 INT 10h/AH = 0Ch 的情况下在 Y 轴上绘制像素

纯 C 中的并发编程 - Windows/Linux

linux - 需要在来自远程 ssh 的文件末尾的特定行插入一个单词

assembly - 操作码和操作数的无效操作

assembly - 如何在编译时检测 NASM 中的体系结构以获得 x64 和 x86 的一个源代码?