2017-12-24 6 views
1

Ich bin neu in Assembly Programmierung und Experimentieren mit einfachen Beispielen und gdb. Hier ist das Programm, das ich schrieb:Warum habe ich keinen Segmentierungsfehler bekommen?

1.asm

section .text 
    global _start 
    extern _print_func 

_start: 
    push str 
    movzx rdx, byte [str_len] 
    push dx ; <--- typo here, should be rdx 
    call _print_func 

    mov rax, 60 
    syscall 

section .data 
    str: db 'Some data',0x0A,0x0D 
    str_len: db $ - str 

2.asm

section .text 
    global _print_func 

_print_func: 
    pop rbx 
    pop rdx 
    pop rsi 
    mov rax, 0x01 
    mov rdi, 0x01 
    syscall 
    push rbx 
    ret 

section .data 
    str: db 'Some string',0x0A,0x0D 
    str_len: db $ - str 

Nach dem Kompilieren, Verknüpfen (mit ld) und die Ausführung des Programms es nichts nur gedruckt. Also habe ich den Inhalt der Register vor dem syscall überprüft.

(gdb) info registers 
rax   0x1  1 
rbx   0x4000c5 4194501 
rcx   0x0  0 
rdx   0x6000e4000b  412331802635 ; <-- obviously wrong 
rsi   0x10000 65536 
rdi   0x1  1 
rbp   0x0  0x0 
rsp   0x7fffffffdcc6 0x7fffffffdcc6 

So sollte die syscall versuchen 412331802635 Bytes lesen bei 0x10000 Start, die ich dachte, sollte Segmentierungsfehler verursacht haben, da das Programm nicht erlaubt ist, alle Bytes zuzugreifen.

Aber es druckte nichts lautlos. Warum? Warum wurde Segmantation Fault nicht ausgelöst? War das eine Art undefiniertes Verhalten? Ich verwende unter intel core i5.

+1

'lesen' verursacht keinen segfault, es gibt einen Fehler zurück. –

+0

Führen Sie Ihr Programm unter "strace" aus, um die Argumente zu dekodieren und die Werte der Systemaufrufe zurückzugeben. Siehe auch den unteren Teil von https://stackoverflow.com/tags/x86/info für weitere Tipps zum Debuggen. –

Antwort

4

löst keinen segfault, es gibt nur einen -EFAULT Fehlercode zurück. Sie sollten das in rax nach der syscall endet sehen. Siehe auch man 2 write

+0

Habe es einfach ausprobiert und habe 'rax 0xfffffffffffffff2 -14' bekommen. Jetzt verstanden, vielen Dank. –

Verwandte Themen