NASM编程 - `int0x80`与`int 0x80`的区别

6

我有一个简单的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

当我第一次写它时,我犯了一个错误,忘记在int0x80之间加上空格:

        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...

如果在之后调用 int 0x80 会发生什么? - user166390
@pst - 好主意!尝试一下它似乎正常执行!即使我添加了一个sys_write系统调用,使它成为一个“Hello World”程序...就好像int0x80根本不存在一样 :O - Richard JP Le Guen
你的意思是分段错误消失了吗? - BoltClock
2
@BoltClock - 是的!段错误可能是因为int0x80没有中断,因此不会调用系统调用sys_exit...所以执行继续超出程序结束进入未知的内存区域,导致段错误。但仍然有一个问题:int0x80是什么,它不应该无法编译吗? - Richard JP Le Guen
2个回答

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

0
你需要在这行末尾加上一个冒号:
Segment .text:

global _start
_start:
    mov eax, 1
    mov ebx, 0
    int0x80 ; no space...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接