我有一个简单的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
那么这个程序 - 我写的原始程序,缺少的空间 - 是做什么的?在NASM中int0x80
(没有空格)是什么意思?
segment .text
global _start
_start:
mov eax, 1
mov ebx, 0
int0x80 ; no space...
答案 0 :(得分:6)
NASM正在给我这个警告:
警告:在没有冒号的行上单独标记可能会出错
显然,拼写错误被视为标签,您可以像往常一样在程序中引用新的int0x80
标签:
segment .text
global _start
_start:
mov eax, 1 ; 1 is the system identifier for sys_exit
mov ebx, 0 ; exit code
int0x80 ; interrupt to invoke the system call
jmp int0x80 ; jump to typo indefinitely
NASM支持不带冒号的标签,我经常将其用于数据声明:
error_msg db "Ooops", 0
flag db 0x80
nullpointer dd 0
答案 1 :(得分:0)
你需要在这一行的末尾放一个冒号:
Segment .text:
global _start
_start:
mov eax, 1
mov ebx, 0
int0x80 ; no space...