Seite 1 von 1

Negative Zahlen in ASM?

Verfasst: 04.06.2005 20:24
von Norbie
Hi, ich hab nen Übersetzer gebaud, just for fun, und will dem nun beibringen, 2-1 zu rechnen:

Zur Zeit spuckt er aus:

Code: Alles auswählen

.386
jmp start

buffer1 dd 0
buffer2 dd 0
test dd 0

proc ausgabe_dl_char
push ax
push bx
push cx
push dx
mov ah,2
int 21h
pop dx
pop cx
pop bx
pop ax
ret
endp

proc ausgabe_eax_zahl
push eax
push ebx
push ecx
push edx
mov ebx,10
mov ecx,0
anfang_ausgabe_ax_zahl:
mov edx,0
idiv ebx
add edx,48
inc ecx
push edx
cmp eax,0
jne anfang_ausgabe_ax_zahl
mitte_ausgabe_ax_zahl:
pop edx
call ausgabe_dl_char
dec ecx
cmp ecx,0
jne mitte_ausgabe_ax_zahl
pop edx
pop ecx
pop ebx
pop eax
ret
endp

start:
mov eax, 1
mov DWORD buffer1, eax
mov eax, 2
mov DWORD buffer2, eax
mov eax, buffer1
sub eax,buffer2
mov buffer1, eax
mov eax, buffer1
mov test, eax
mov eax, test
mov DWORD buffer1, eax
mov eax, buffer1
call ausgabe_eax_zahl
mov ah, 4Ch
int 21h
Und das Ergebnis davon ist 255!

Was muss man ändern, dass er -1 oder zumindes nur 1 ausgibt? :mrgreen:

Das ganze ist ein Tinymodel und für Dos.
Danke für eure Hilfe :allright:

Verfasst: 05.06.2005 08:58
von Laurin

Code: Alles auswählen

start:
mov eax, 1
mov DWORD buffer1, eax ; buffer1 = 1
mov eax, 2
mov DWORD buffer2, eax ; buffer2 = 2
mov eax, buffer1 ; eax = buffer1
sub eax,buffer2 ; eax = eax - buffer2, anders geschrieben buffer1 = buffer1 - buffer2
mov buffer1, eax
mov eax, buffer1
mov test, eax
mov eax, test
mov DWORD buffer1, eax
mov eax, buffer1
call ausgabe_eax_zahl
mov ah, 4Ch
int 21h 
Dein Programm rechnet nicht 2-1 sondern 1-2.

:wink:
Greetz Laurin

Verfasst: 05.06.2005 13:05
von Norbie
Oh mein Fehler! Meinte natürlich es soll 1-2 rechen. Sonst wäre das Ergebnis ja nicht negativ :)

Verfasst: 05.06.2005 18:45
von Laurin
Es kommt kein negativer Wert raus, weil du mit Zahlen rechnest, die unsigned (ohne Vorzeichen) sind. Sorg dafür, dass du vorzeichenbehaftete Zahlen verwendest.

Greetz Laurin

Verfasst: 05.06.2005 18:51
von remi_meier
In PB:

Code: Alles auswählen

v = 1
MOV eax, DWord[v_v]
ADD eax, -2
MOV DWord[v_v], eax
Debug v

Re: Negative Zahlen in ASM?

Verfasst: 06.06.2005 08:30
von Danilo
Norbie hat geschrieben:Was muss man ändern, dass er -1 oder zumindes nur 1 ausgibt? :mrgreen:
Du musst eine 'proc ausgabe_eax_zahl' schreiben die Zahlen als
vorzeichenbehaftet behandelt.