Программирование NASM - `int0x80` против` int 0x80` - PullRequest
6 голосов
/ 25 марта 2011

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

6 голосов
/ 25 марта 2011

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 голосов
/ 14 сентября 2014

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

Segment .text:

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