Seite 1 von 4
ASM
Verfasst: 18.07.2006 19:54
von unix
Da ich ein Buch über Assembler gelesen habe habe ich folgende Fragen:
Wie kann ich im Inline ASM eine Variable übergeben?
So??
Code: Alles auswählen
Global Var_0.b = 10
Global Var_1.b = 7
Global Var_2.b = 0
! mov ax, Var_0
! mov bx, Var_1
! add bx
! mov Var_2, ax
Debug Var_2
Var_2 sollte nun 17 sein
und wie ist das mit dem High und Low Byte aus, da ja neuere Prozessoren 32 bzw. 64 Bit Register haben??
Und gildet diese schreibweiße überhaupt noch, da sich mein Buch auf einen alten Prozessor aufgebaut ist!?
Danke für die Antworten!!!
Verfasst: 18.07.2006 20:49
von Helle
Damit Du wenigstens mal das richtige Ergebnis siehst:
Code: Alles auswählen
Global Var_0.w = 10
Global Var_1.w = 7
Global Var_2.w = 0
! mov ax, [v_Var_0]
! mov bx, [v_Var_1]
! add bx,ax
! mov [v_Var_2], bx
Debug Var_2
Begriffe wie Low-/High-Byte gelten natürlich weiterhin, egal wie alt Dein Buch ist (solange es sich mit x86-CPU´s beschäftigt).
Wenn Du die 16-Bit-Register (AX,BX) verwendest, solltest Du auch die zu verarbeitenden Variablen als="Word" deklarieren (ohne Feinheiten gibts sonst natürlich ´ne Fehlermeldung).
Gruss
Helle
Verfasst: 18.07.2006 20:51
von Deeem2031
So muss das aussehen:
Code: Alles auswählen
Global Var_0.b = 10
Global Var_1.b = 7
Global Var_2.b = 0
! mov eax, dword[v_Var_0]
! mov ebx, dword[v_Var_1]
! add eax ,ebx
! mov dword[v_Var_2], eax
Debug Var_2
32-Bit register haben ein "e" am anfang. ax und bx gibts noch, sind aber 16-bit register.
Verfasst: 18.07.2006 21:10
von Eric
>So muss das aussehen:
Die Variablen und Register sollten aber schon gleich groß sein.
also so: (oder die Variablen als .w und als Register ax,bx,cx oder die Variablen als .l und als Register eax,ebx,ecx...)
Code: Alles auswählen
Global Var_0.b = 10
Global Var_1.b = 7
Global Var_2.b = 0
! mov al, byte[v_Var_0]
! mov cl, byte[v_Var_1]
! add al ,cl
! mov byte[v_Var_2], al
Debug Var_2
Und eigendlich kann man das byte/word/dword bei mov weglassen, solange
die Größen übereinstimmen.
Verfasst: 19.07.2006 21:54
von unix
Vielen dank erstmal!!!!!
Und wie ist die trennung der einzelnen Bytes im 32Bit Register
16Bit ist es ja so
Bit1 = AL
Bit2 = AH
und beim 32Bit??
Verfasst: 19.07.2006 22:11
von Deeem2031
unix hat geschrieben:Vielen dank erstmal!!!!!
Und wie ist die trennung der einzelnen Bytes im 32Bit Register
16Bit ist es ja so
Bit1 = AL
Bit2 = AH
und beim 32Bit??
Nicht Bit1 und Bit2 sondern Byte1 und Byte2. Bei 32-bit ist das genauso:
Eax = alle 4 byte
Ax = 1 und 2 byte
und Ah und AL wie gehabt.
@Eric: Wozu brauch man auch Byte-Variablen

Verfasst: 19.07.2006 22:18
von unix
Ja danke für Verbesserung
also Byte 3 und 4 lassen sich nicht seperat ansteuern wie Byte 1 und 2?
Verfasst: 19.07.2006 22:21
von Kaeru Gaman
ob per registerkürzel weiss ich nicht...
aber sobald du die unteren abgearbeitet hast, kannst du Eax 16bit rechtsshiften.
Verfasst: 19.07.2006 22:25
von unix
Kaeru Gaman hat geschrieben:ob per registerkürzel weiss ich nicht...
aber sobald du die unteren abgearbeitet hast, kannst du Eax 16bit rechtsshiften.
Gude Idee ich hate dabei an ne art Stack gedacht da ich in meinen Programm nur Word bzw. Byte verwende da wäre es ja blöd wenn man die 32Bit nicht verwendet, oder??
Verfasst: 19.07.2006 22:27
von Kaeru Gaman
nuja.. kommt drauf an...
du kannst die 32bit ausm stack holen, im Eax shiften, dann den stackpointer um 4byte schieben...
oder du holst zwar 32bit ausm stack, aber bearbeitest nur AL und AH, und setzt den stackpointer nur 2byte hoch...