как этот сборочный процесс не падает? - PullRequest
3 голосов
/ 25 июня 2011

У меня есть этот код Linux Nasm, который не падает.С инструкцией ret 80 в конце printString эта программа не должна аварийно завершить работу?

bits 32

section .data
    hello:     db 'Hello Linux assembly!!!!!!!!!!!!!!!!!!!',10,0    
    helloLen:  equ $-hello  

    anotherString db "hello im another string!!!!",10,0
    anotherStringlen equ $-anotherString

section .text
    global _start

_start:
    push hello
    push helloLen
    call printString

;;;; should i pop the two paramters I pushed?
;;;; does the ret instruction do it for me?

    push anotherString
    push anotherStringlen
    call printString

    call exit

printString:
    push ebp
    mov ebp, esp

    mov eax, 4
    mov ebx, 1
    mov ecx, [ebp+12] 
    mov edx, [ebp+8]
    int 80h

    pop ebp
    ret 60 ;;;;; How does this not make printString crash?

exit:
    mov eax,1            
    mov ebx,0            
    int 80h

1 Ответ

5 голосов
/ 25 июня 2011

Неправильное выполнение действий на языке ассемблера никоим образом не гарантирует, что вы получите сбой.

Инструкция ret 60 выдает неправильное количество значений из стека после возврата.Однако следующие вещи, которые вы не делаете, не предполагают, что в стеке есть какие-либо значения использования.Например, функция exit не будет заботиться о том, что стек перегружен, и все равно выйдет из вашего процесса.

...