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
.
'lesen' verursacht keinen segfault, es gibt einen Fehler zurück. –
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. –