ASM

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

ASM

Beitrag 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!!!
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag 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
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Eric
Beiträge: 303
Registriert: 05.09.2004 09:50
Wohnort: Göttingen

Beitrag 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.
El_Choni_work: cant't you just spit the binary data to sqlite, as you would spit a hamster into a microwave oven?
* Fangles falls off the chair laughing
Bild
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag 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??
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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 :roll:
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag von unix »

Ja danke für Verbesserung

also Byte 3 und 4 lassen sich nicht seperat ansteuern wie Byte 1 und 2?
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ob per registerkürzel weiss ich nicht...

aber sobald du die unteren abgearbeitet hast, kannst du Eax 16bit rechtsshiften.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag 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??
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten