NASM编程 - “int0x80”与“int 0x80”

时间:2011-03-25 02:06:39

标签: assembly syntax interrupt nasm

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

2 个答案:

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