2011-03-25 11 views
6

Tengo un sencillo programa de NASM que sólo invoca sys_exit:programación NASM - `` int int0x80` frente 0x80`

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 

La primera vez que escribí, he cometido un error y se olvidó el espacio entre int y 0x80 :

 int0x80 

... pero el programa aún se compiló sin problemas.

[prompt]> nasm -f elf MyProgram.asm 
[prompt]> ld -o MyProgram MyProgram.o 

¡Me acabo de dar un error de segmentación cuando lo ejecuté!

[prompt]> ./MyProgram 
Segmentation fault 

Entonces, ¿qué hace este programa - el original que escribí, con el espacio faltante - hacer? ¿Qué significa int0x80 (sin espacio) en NASM?

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

¿Qué pasa si 'int 0x80 'se llama después? –

+0

@pst - ¡Buena idea! * lo intenta * Parece ejecutarse normalmente! Incluso si agrego una llamada al sistema 'sys_write' para que sea un programa de" Hello World "... es como si' int0x80' ni siquiera estuviera allí: O –

+0

¿Quiere decir que el error de segmentación desaparece? – BoltClock

Respuesta

6

NASM me está dando esta advertencia:

advertencia: etiqueta solo en una línea sin dos puntos podrían estar en el error

Al parecer el error tipográfico es tratado como una etiqueta y se puede hacer referencia a la nueva etiqueta int0x80 en su programa como de costumbre:

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 soporta etiquetas sin los dos puntos, a menudo uso que por las declaraciones de datos:

error_msg db "Ooops", 0 
flag  db 0x80 
nullpointer dd 0 
0

Es necesario poner dos puntos al final de esta línea:

Segment .text: 

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