Assembler nasm, Zahlen addieren
*Markus
- sonstiges
Hallo,
bei allen Assemblertutorials findet man ständig eine gewisse Datei namens asm_io.inc die eingebunden wird, um grundlegende Ausgaben einfach realisieren zu können. Diese Datei besitze ich leider nicht und weiters gehört sie ohnehin nicht zum Standardinventar von nasm, wie ich recherchiert habe.
Jedenfalls wollte ich ohne diese Datei versuchen, 2 Zahlen miteinander zu addieren, was aber nach der Eingabe der 2. Zahl mit einem "Segmentation Fault" endet. Ich weiß, dass es daran liegt, einen Integer einzulesen bzw auszugeben, aber wie macht man das? So sieht es bisher aus:
section .bss
zahl1 resb 10 ;10 bytes reservieren
zahl2 resb 10 ;10 bytes reservieren
ergebnis resb 20
section .data
msg1 db "Gib eine Zahl ein:", 0x0A
len1 equ $-msg1
msg2 db "Gib eine zweite Zahl ein:", 0x0A
len2 equ $-msg2
section .text
global _start
_start:
;string 1 ausgeben
mov al, 4 ;syscall write
mov ebx, 1; 1 = stdout
mov ecx, msg1
mov edx, len1
int 0x80 ; kernelaufruf
;string lesen
mov al, 3 ;syscall read
mov ebx, 0 ; von stdin lesen
mov ecx, zahl1
mov edx, 10
int 0x80
;string2 ausgeben
mov ax, 4
mov ebx, 1
mov ecx, msg2
mov edx, len2
int 0x80
;string lesen
mov al, 3
mov ebx, 0 ; von stdin lesen
mov ecx, zahl2
mov edx, 10
int 0x80
;addieren
mov eax, zahl1
mov ebx, zahl2
add eax, ebx
mov [ergebnis], eax
;Summe ausgeben
mov al, 4
mov ebx, 1
mov ecx, ergebnis
mov edx, 20
;exit aufrufen
mov al, 1
mov ebx, 0
int 0x80
Markus.
Mir scheint, da fehlt ein bischen was:
Du liest die Zahlen von stdin ein, konvertierst sie aber nicht von ascii nach Binärformat, addierst die Adressen der beiden Zahlenpuffer und schreibst anschließend die binäre Summe in die ersten 4 Ergebnispuffer-Bytes. Die für Ausgabe werden dann zwar die Parameter in die Register geladen, aber der Systemcall fehlt. Dann folgt das exit.
Ich würde an Deiner Stelle mal einen Assemblerdebugger zu Rate ziehen, dann siest Du, wo es knallt und warum.