переход в конец main не выполняется с int 0x80 - PullRequest
0 голосов
/ 09 мая 2019

Итак, у меня есть этот базовый код hello world

SECTION .data       ; data section
msg:    db "Hello World",10 ; the string to print, 10=cr
len:    equ $-msg       ; "$" means "here"
                ; len is a value, not an address
msg2:    db "test" ; the string to print, 10=cr
len2:    equ $-msg2       ; "$" means "here"
                ; len is a value, not an address                

SECTION .text       ; code section
        global main     ; make label available to linker 
main:               ; standard  gcc  entry point
    mov edx,len     ; arg3, length of string to print
    mov ecx, msg   ; arg2, pointer to string
    mov ebx,1       ; arg1, where to write, screen
    mov eax,4       ; write sysout command to int 80 hex
    int 0x80        ; interrupt 80 hex, call kernel
    mov ebx,0       ; exit code, 0=normal
    mov eax,1       ; exit command to kernel
    int 0x80        ; interrupt 80 hex, call kernel
    JMP l2



l2:
    mov edx,len2     ; arg3, length of string to print
    mov ecx,msg2     ; arg2, pointer to string
    mov ebx,1       ; arg1, where to write, screen
    mov eax,4       ; write sysout command to int 80 hex
    int 0x80        ; interrupt 80 hex, call kernel

    mov ebx,0       ; exit code, 0=normal
    mov eax,1       ; exit command to kernel
    int 0x80        ; interrupt 80 hex, call kernel

Когда я помещаю переход в конец основного, он не работает, но если я поставлю его перед последней строкой, вот так:

main:               ; standard  gcc  entry point
    mov edx,len     ; arg3, length of string to print
    mov ecx, msg   ; arg2, pointer to string
    mov ebx,1       ; arg1, where to write, screen
    mov eax,4       ; write sysout command to int 80 hex
    int 0x80        ; interrupt 80 hex, call kernel
    mov ebx,0       ; exit code, 0=normal
    mov eax,1       ; exit command to kernel
    JMP l2
    int 0x80        ; interrupt 80 hex, call kernel

Прыжки работают.Почему это не работает в первом случае?

1 Ответ

2 голосов
/ 09 мая 2019

Последний int 0x80 - это системный вызов, который просит ядро ​​(Linux?) Завершить процесс.

В C это будет , как :

     exit(0);
     goto somewhere;   // Never executed because the process no longer exists
...