Frage zu PUSH BX und MOV BX

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Krüsty, Marwin

Beitragvon Trasher » Mittwoch 9. März 2005, 23:41

Hi,
ich habe ein Assembler-Buch indem ich gerade bei "Makros" bin! Doch hab ich jetzt ein Problem, da ich den Befehl nicht verstehe und auch den Abschnitt des Buches schon mehrere Male gelesen habe und es trotzdem nicht verstehe.
Nun zum Code:
*****
Code1:
*****

.MODEL SMALL
.CODE
MOV DL,00
M1: MOV AH,02
INT 21H
INC DL
MOV BX,80H
M3: MOV CX,0FFFFH
M2: DEC CX
JNZ M2
DEC BX
JNZ M3
JMP M1
END

----------
Zu Code1: Dieser code ist ja eine warteschleife die als Verzögerung benutzt wird! Meine Frage: Wieso Verwendet man
MOV BX,80H und MOV CX,0FFFFH ? Wie kommt man auf diese Commands und was bewirken diese?


*******
Code 2:
*******
(Makro)

ANZEIGE_DL MACRO
PUSH AX
MOV AH,02H
INT 21H
POP AX
ENDM

-----------
Zu Code2: Dieses Makro wird dazu benutzt um etwas auszugeben! Meine Frage: Wieso benutzt man hier PUSH AX? Mir ist klar, dass das PUSH benutzt wird um einen Wert oben auf den STACK zu legen! Doch wie kommt man auf AX ? Dies steht nicht im Buch und ich kann mir auch nicht erklären wieso man AX benutzt und wie man auf diesen Befehl kommt!

Ich hoffe ich konnte alles deutlich ausdrücken und ihr könnt mir helfen!


MFG

Trasher
Trasher
Newbie
 
Beiträge: 3
Registriert: Mittwoch 9. März 2005, 23:28

Beitragvon crack » Donnerstag 10. März 2005, 15:45

Hi Trasher,

kein Problem:
Konkret: es wird der Wert in DL auf dem standartausgabegerät ausgegeben.
ANZEIGE_DL MACRO
PUSH AX
MOV AH,02H
INT 21H
POP AX
ENDM

AX muss auf dem Stapel, Weil AX innerhalb des Interupt Aufrufs bzw. durch den Aufruf selber (mov ah,02... int021h) verändert wird, und Du idR auch nach dem Macro den echten Wert von AX noch benötigst.
.MODEL SMALL
.CODE
MOV DL,00
M1: MOV AH,02
INT 21H
INC DL
MOV BX,80H
M3: MOV CX,0FFFFH
M2: DEC CX
JNZ M2
DEC BX
JNZ M3
JMP M1
END

Die MOV- Commands sind Lade- bzw. Verschiebe- bzw. Datentransport anweisungen (alle MNEMOICS sind strengenommem immer Anweisungen der Begriff Befehle ist eigentlich die Bezeichnung für Benutzereingaben.) Indem Fall MOV BX,80H wird das (Basis-) Register BX unmittelbar mit dem Hexadezimal Wert 80 geladen und MOV CX,0FFFFH lädt das (Zähl-) Register CX mit dem Wert 0ffffh was dezimal 65536 entspricht.
Hierbei wird die verzögerung dadurch erreicht das eine äussere und eine innere Zählschleife durchlaufen wird: Mov bx,080h läd den Schleifenzähler der äusseren Schleife mit 80hex also 128dez, diese äussere Schleife wird also 128 mal durchlaufen, bei jedem Durchlauf der äusseren Schleife, wird dann auch die innere Vollständig durchlaufen das sind cx=0ffffhex=65536dez mal so und das macht dann zusammen 8388608 durchläufe der inneren schleife, so zu Lehrbuch solltest Du die noch eine Befehlsreferenz anschaffen z.B. Assembler Ge-Packt aus dem mitp Verlag, dann kann eigentlich nix mehr schiefgehen. (Ich hoffe Ich konnte helfen!)
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Beitragvon Trasher » Donnerstag 10. März 2005, 17:44

Danke für die schnelle Hilfe!
Ja du konntest mir um einiges weiterhelfen. Danke.
NUr woher weiß ich wann ich PUSH AX benutzen muss und wann PUSH BX bzw PUSH CX oder PUSH DX?
Trasher
Newbie
 
Beiträge: 3
Registriert: Mittwoch 9. März 2005, 23:28

Beitragvon crack » Donnerstag 10. März 2005, 18:52

Ist eigentlich auch kein Problem, dass kommt drauf an welches register du nach dem funktionsaufruf noch brauchst, das legst du dann mit push nn auf den stapel, und holst es nachdem ende des macros oder der subruotine mit pop wieder ab.
wenn dein assembler das unterstützt kannst du auch pusha (push all) oder popa (pop all) benutzen, der A386 von eric isaacson unterstützt diese semantik. wenn du mehrere register einzeln sichern must sieht das so aus

push ax ;ax und dann bx sichern
push bx
... ;hier wäre jetzt der inhalt des macros
...
pop bx ;first in, last out prinzip
pop ax
...

viel spass B)
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Beitragvon BaronBöserBiber » Donnerstag 10. März 2005, 20:17

Wie krank muss man sein, um heute noch ASM zu programmieren? bzw. was seit ihr für Freaks?

Warum ist eigentlich BX bei euch ein Basis-Register und CX ein Zähl-Register?
Mir wurde es so beigebracht, dass beides gleichberechtige Cache-Register sind, also 2 von den 4, die eine Intel-CPU besitzt. [AX - DX]

Würde mir eher mal die Frage stellen, wie im Code I das "End" nach einem unbedingten Sprung (JMP) erreicht werden soll, da es ja nicht mit einem Label versehen wurde geht das doch in eine Endlosschleife, oder?
BaronBöserBiber
Newbie
 
Beiträge: 1
Registriert: Samstag 10. Mai 2003, 14:33

Beitragvon Trasher » Donnerstag 10. März 2005, 20:24

Meine Frage war aber nicht Ob das prog ne endlosschleife is oder net!
Ich weiß selbst das es eine ist! Wenn du denkst das jeder der ASM codet ein freak ist wieso bist du dann hier gereggt?
Trasher
Newbie
 
Beiträge: 3
Registriert: Mittwoch 9. März 2005, 23:28

Beitragvon crack » Freitag 11. März 2005, 10:05

:angry:

Hi böserBiber,
Wie krank muss man sein, um heute noch ASM zu programmieren? bzw. was seit ihr für Freaks?

Das ist wohl eher eine Grundsatzfrage: Wie krank(bzw. Therapiebedürftig) sind Programmierer im speziellen bzw. Computer- und InternetUser im allgemeinen? Und wie krank ist derjenige der in einen Thread in dem es um ein Sachthema herreinplatzt und so ein Statement posted? Aber kein Grund unfreundlich zu sein, Assembler wird heute auch noch oft genug verwendet, z.B.: zur Programmierung von SPS, von MicroControllern, überall da wo Du independent Systeme ohne drunterliegendes Betriebssystem brauchst, bei zeitkritischen Aufgaben (z.B. MotionControl, ElectronicFuelInjektion, GraphicProgrammierung...) und wenn dir nur kleiner Programmspeicher EPROM zur Verfügung steht.
Warum ist eigentlich BX bei euch ein Basis-Register und CX ein Zähl-Register?
Mir wurde es so beigebracht, dass beides gleichberechtige Cache-Register sind, also 2 von den 4, die eine Intel-CPU besitzt. [AX - DX]
Na weil bei der LOOP anweisung oder dem REP Präfix CX heruntergezählt wird, wärend BX oft als Basisregister für den Zugriff auf Variablenfelder benutzt wird...
Würde mir eher mal die Frage stellen, wie im Code I das "End" nach einem unbedingten Sprung (JMP) erreicht werden soll, da es ja nicht mit einem Label versehen wurde geht das doch in eine Endlosschleife, oder?
Stimmt das hat da gar nix zu suchen, Wird wohl ein Fehler des Programmauthors sein...
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Beitragvon Tim » Freitag 20. Mai 2005, 10:36

AX-DX kann man aber auch fuer allgemeine Zwecke verwenden.
Tim
Newbie
 
Beiträge: 7
Registriert: Mittwoch 6. April 2005, 19:22

Beitragvon crack » Freitag 20. Mai 2005, 12:30

Selbstverständlich: AX und DX sind die beiden Universalregister, aber sie sind bei Ein- und Ausgabeoperationen {IN;OUT}, und bei Stringoperationen{LODSB;STOSB;MOVSB;u.s.w.} auf bestimmte 'Rollen' festgelegt :wink:
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf


Zurück zu Assembler

 


  • { RELATED_TOPICS }
    Antworten
    Zugriffe
    Letzter Beitrag

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron