Программирование NASM - `int0x80` против` int 0x80`

У меня есть простая программа 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...

2 ответа

Решение

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

Вам нужно поставить двоеточие в конце этой строки:

Segment .text:

global _start
_start:
    mov eax, 1
    mov ebx, 0
    int0x80 ; no space...
Другие вопросы по тегам