Text ausgeben OHNE int 21h o.ä.
-
Selbst hier kann man noch ein wenig rausholen :):
putstr: mov bx,0x0007 mov ah,0x0E putstrloop: lodsb test al,al jz putstrd int 0x10 jmp putstrloop putstrd: retn
-
test al,al
Was nützt das? Das muss doch "true" ergeben?
-
Wie definierst Du "true"?
test al,al setzt die Flags dem Wert von al entsprechend.
So kann das Signed-Flag gesetzt werden, wenn bit 7 von al gesetzt ist, oder das Zero-Flag, wenn al=0 ist, etc.
In diesem Fall wird mit test al,al geprueft, ob al=0 ist.test al,al bewirkt hier uebrigens das gleiche, wie or al,al, ist aber etweas schneller
-
Achso, ich glaub ich lag völlig daneben. Ich dachte mit test macht man einen Vergleich wie in C:
if(al == al)
Ich dachte wenn man zwei gleiche Variablen vergleicht kommt immer true raus. Aber test ist ja so wie es aussieht was anderes. mir fällt gerade ein, mit cmp macht man ja vergleiche
-
also "test" testet ob ein bit gesetzt ist?
-
Ja, mit test kann man feststellen, ob ein oder mehrere Bit gesetzt sind.
Bsp:
test al,10h <= ZF und PF gesetzt, wenn Bit 4 von al 0 ist.
test al,24h <= ZF und PF gesetzt, wenn Bit 5 und 2 von al 0 sind.
Ist nur Bit 2 oder 5 gesetzt, wird ZF=PF=0.
Sind Bit 2 und 5 gesetzt, wird PF=1 und ZF=0.test al,0A4h <= ZF verhaelt sich wie in vorherigen Tests, aber nun wird PF 0, wenn alle 3 Bits gesetzt sind und SF wird gesetzt, wenn Bit 7 in al gesetzt ist.
Fazit:
Zero flag wird immer dann gesetzt, wenn in dem zu pruefenden Objekt (1. Operand) keins der zu pruefenden Bits (2. Operand) gesetzt ist.
PF wird gesetzt, wenn eine gerade Anzahl von geprueften Bits gesetzt / nicht gesetzt ist. (Wenn al bei einem der Tests 0 ist, wird auch PF gesetzt)
SF wird gesetzt, wenn das hoechste Bit einer Zahl geprueft wird und dieses auch gesetzt ist.
-
edit: ich war zu spät.
[ Dieser Beitrag wurde am 30.11.2002 um 21:01 Uhr von cd9000 editiert. ]
-
Original erstellt von Nobuo T:
**Ja, mit test kann man feststellen, ob ein oder mehrere Bit gesetzt sind.Bsp:
test al,10h <= ZF und PF gesetzt, wenn Bit 4 von al 0 ist.
test al,24h <= ZF und PF gesetzt, wenn Bit 5 und 2 von al 0 sind.
Ist nur Bit 2 oder 5 gesetzt, wird ZF=PF=0.
Sind Bit 2 und 5 gesetzt, wird PF=1 und ZF=0.test al,0A4h <= ZF verhaelt sich wie in vorherigen Tests, aber nun wird PF 0, wenn alle 3 Bits gesetzt sind und SF wird gesetzt, wenn Bit 7 in al gesetzt ist.
Fazit:
Zero flag wird immer dann gesetzt, wenn in dem zu pruefenden Objekt (1. Operand) keins der zu pruefenden Bits (2. Operand) gesetzt ist.
PF wird gesetzt, wenn eine gerade Anzahl von geprueften Bits gesetzt / nicht gesetzt ist. (Wenn al bei einem der Tests 0 ist, wird auch PF gesetzt)
SF wird gesetzt, wenn das hoechste Bit einer Zahl geprueft wird und dieses auch gesetzt ist. ;)**wenn ich das nicht falsch in erinnerng habe ist doch test das gleiche wie and nur das das ergebnis verworfen iwrd,es werden nur entsprechend die flags geändert?
-
ne, das gleiche wie "or"
-
Original erstellt von Bigor:
**
wenn ich das nicht falsch in erinnerng habe ist doch test das gleiche wie and nur das das ergebnis verworfen iwrd,es werden nur entsprechend die flags geändert?**Jup, stimmt. (Das hatte cd9000 u.a. auch geschrieben ;))
@<ohr>:
Beim Vergleich eines Registers mit sich selbst wirken "or", "and" und "test" gleich. Ansonsten wirkt "or" auf die Flags nicht wie "test".
-
Original erstellt von Nobuo T:
**Jup, stimmt. (Das hatte cd9000 u.a. auch geschrieben ;))
**bei mir stand nur was da jetzt steht,so stnad es glaube ich in meinem buch,naja is ja auch egal.
Wenn ich diese push/pop orgie weglasse dann muss ich aber im aufrufenden programm daruaf aufpassen das die segmentregister immer richtig gesetzt sind,deshlab hab ich diese befehle dareingeschireben,das soll nämlich nicht für ein ganz bestimmtes program sein.
-
Original erstellt von <???>:
**Achso, ich glaub ich lag völlig daneben. Ich dachte mit test macht man einen Vergleich wie in C:
if(al == al)
**Diese vergleiche (sollte man eigendlich wissen) macht man mit cmp (compare)
Bsp:
cmp 3,5
jne weiter
xor eax,eax ;das wird nie ausgeführt...
weiter:
...
-
Original erstellt von <MaTaK>:
cmp 3,5Es gibt keinen Opcode (sollte man eigentlich wissen) mit 2 Operanden, der in selbigen 2 direkte Zahlen akzeptiert.