【发布时间】:2018-04-11 20:44:52
【问题描述】:
最近我一直在学习 NASM x86 汇编。在编写代码时,每当我使用 int 21h 或 int 80h 或任何中断时,它都会返回分段错误。整个程序是:
section .data
msg: dw 'Hello World!', 10
section .text
global _main
_main:
mov eax, 4
mov ebx, 1
mov ecx, msg
int 80h
非常感谢任何关于我可以在哪里了解更多关于 NASM 的帮助或提示。
【问题讨论】:
-
您正在为什么操作系统编程?你在为什么架构编程?请注意,系统调用仅适用于为其设计的操作系统,因此使用
int 21h将无法在 Linux 上运行,而使用int 80h将无法在 DOS 上运行。 -
还有,你的程序在write系统调用后没有代码,所以即使系统调用成功也会崩溃。
-
如果你使用的是win10的“linux in windows”(不知道具体是怎么调用的),那么那个内核只有64位,所以
int 0x80不起作用,你必须构建 elf64 二进制文件并使用正确的 64b 系统 ABI 来调用服务(使用syscall指令)...要拥有 32b 兼容内核,您必须将完整的 linux 安装到某些 VM 中。 -
@AlexDukhan 您不能只在末尾添加
syscall指令并期望它能够正常工作。使用syscall指令的 Linux 系统调用适用于 amd64,并且工作方式不同。我建议你坚持一个教程并在实际的 Linux 上运行你的代码,而不是 WSL。您似乎陷入了试图从多个教程中复制代码而不了解其实际作用的陷阱,然后当它不起作用时感到沮丧。 -
@AlexDukhan 请在您的问题中添加您尝试过的确切程序以及您键入的用于组装和运行该程序的确切命令 - 无论您如何组装,您刚刚发布的程序都无法工作,因为它实际上不包含要终止的代码,因此它只会在 write 系统调用后崩溃。此外,
_main是编写 Linux 程序时的错误入口点。做错事的方式有很多,所以对你来说,具体一点很重要,否则很难帮助你。