【发布时间】:2011-07-22 14:49:07
【问题描述】:
我有一个简单的 NASM 程序,它只调用 sys_exit:
segment .text
global _start
_start:
mov eax, 1 ; 1 is the system identifier for sys_exit
mov ebx, 0 ; exit code
int 0x80 ; interrupt to invoke the system call
第一次写的时候搞错了,忘了int和0x80之间的空格:
int0x80
...但是程序仍然编译没有问题!
[prompt]> nasm -f elf MyProgram.asm
[prompt]> ld -o MyProgram MyProgram.o
我运行它时它只是给了我一个分段错误!
[prompt]> ./MyProgram
Segmentation fault
那么这个程序 - 我写的原始程序,缺少空格 - 做什么? int0x80(没有空格)在 NASM 中是什么意思?
segment .text
global _start
_start:
mov eax, 1
mov ebx, 0
int0x80 ; no space...
【问题讨论】:
-
如果
int 0x80被调用后会发生什么? -
@pst - 好主意! * 试试看 * 好像执行正常!即使我添加了
sys_write系统调用以使其成为“Hello World”程序......就像int0x80甚至不存在:O -
你的意思是分割错误消失了?
-
@BoltClock - 是的! seg 错误可能是因为
int0x80没有中断,因此没有调用系统调用sys_exit...所以执行继续超过程序的末尾进入未知的内存区域,导致seg 错误。但这仍然留下了一个问题:int0x80是什么,它不应该编译吗?
标签: assembly syntax interrupt nasm