Autor Thema: «push ax» Problem  (Gelesen 3111 mal)

üäpöol

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« am: 10. July 2012, 21:22 »
Hallo, ich habe ein seltsames Assembler (NASM) Problem.
main:
mov ax, 'H'
call _Test
hlt

_Test:
push ebp
mov ebp, esp
mov al, byte [ebp+8]
mov byte [0xB8000], al
mov byte [0xB8001], 0xF
mov esp, ebp
pop ebp
ret
Das führt dazu, dass Q bzw. 0x51 ausgegeben wird. Es ist egal, was ax beinhaltet...
Wird etwas direkt gepushed, funktioniert alles problemlos. Woran liegt's?

oern

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 10. July 2012, 21:38 »
Falls du die C-Calling-Convention verwendest (was du anscheinend tust), musst du den Operanden auf den Stack legen (und zwar den, den du in C als erstes angeben würdest als letztes).

Gruß,
oern

üäpöol

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 10. July 2012, 21:42 »
Tut mir Leid, der Code stimmt natürlich nicht. Ich habe den richtigen gerade  nicht hier und den falschen aus dem Kopf ungefähr geschrieben. Vor dem call steht natürlich noch ein push ax. So tritt der Fehler auch nicht auf, erst wenn es mehrere Parameter gibt. Ich versuche jetzt mal an den Code zu kommen.
EDIT:
Ich habe ihn gefunden:
main:
mov ax, 'H'
push ax
mov ax, 48
push ax
push ax
mov ax, 0xF
push ax
call _Test
hlt

_Test:
push ebp
mov ebp, esp
mov al, byte [ebp+20]
mov byte [0xB8000], al
mov byte [0xB8001], 0xF
mov al, byte [ebp+16]
mov byte [0xB8002], al
mov byte [0xB8003], 0xF
mov al, byte [ebp+12]
mov byte [0xB8004], al
mov byte [0xB8005], 0xF
mov al, byte [ebp+8]
mov byte [0xB8006], al
mov byte [0xB8007], 0xF
mov esp, ebp
pop ebp
ret
Es wird Folgendes ausgegeben: " Q0►"
Das letzte Zeichen wird leider nicht ganz richtig im Browser ausgegeben, im Emulator aber schon.
Wenn ich alles direkt pushe wird alles korrekt ausgeben.
« Letzte Änderung: 10. July 2012, 21:50 von üäpöol »

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 10. July 2012, 23:22 »
push ax pushd dir 16 Bit (ax) auf den Stack. Du gehst in deinem Code aber von 32 Bit (ebp + 4 + n*4).
Versuch also entweder push eax oder (ebp + 4 + n*2).

Bei push 42 wird Standard mäßig die volle Wortbreite (hier 32 Bit) benutzt. Alternativ dürfte push word 42 nur 16 Bit pushen
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

üäpöol

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 11. July 2012, 12:09 »
Ah, vielen Dank. Beide Lösungen funktionieren perfekt. :)

 

Einloggen