Frage zu PUSH BX und MOV BX
Moderatoren: crack, Krüsty, Marwin
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
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
- crack
- Administrator
- Beiträge: 280
- Registriert: Dienstag 21. Dezember 2004, 15:02
- Wohnort: 53783 Eitorf
- Kontaktdaten:
Hi Trasher,
kein Problem:
Konkret: es wird der Wert in DL auf dem standartausgabegerät ausgegeben.
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!)
kein Problem:
Konkret: es wird der Wert in DL auf dem standartausgabegerät ausgegeben.
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.ANZEIGE_DL MACRO
PUSH AX
MOV AH,02H
INT 21H
POP AX
ENDM
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..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
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
with best regards,
crack
- crack
- Administrator
- Beiträge: 280
- Registriert: Dienstag 21. Dezember 2004, 15:02
- Wohnort: 53783 Eitorf
- Kontaktdaten:
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)
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
with best regards,
crack
-
BaronBöserBiber
- Newbie
- Beiträge: 1
- Registriert: Samstag 10. Mai 2003, 14:33
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?
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?
- crack
- Administrator
- Beiträge: 280
- Registriert: Dienstag 21. Dezember 2004, 15:02
- Wohnort: 53783 Eitorf
- Kontaktdaten:
Hi böserBiber,
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.Wie krank muss man sein, um heute noch ASM zu programmieren? bzw. was seit ihr für Freaks?
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...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]
Stimmt das hat da gar nix zu suchen, Wird wohl ein Fehler des Programmauthors sein...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?
mit freundlichen grüssen,
with best regards,
crack
with best regards,
crack