Программирование 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...