Text ausgeben OHNE int 21h o.ä.



  • Hmpf. Und dabei habe ich mir so eine Muehe gegeben, das ganze ohne eine Fertigloesung rueberzubringen. 😃
    @<Sabine>: So wie der code jetzt ist, solltest Du den net in einem OS o.ae. verwenden. Das Stueck ist ungefaehr so effizient wie Basic-Code :p



  • Das Stueck ist ungefaehr so effizient wie Basic-Code

    Und warum? 😞



  • Original erstellt von Nobuo T:
    Hmpf. Und dabei habe ich mir so eine Muehe gegeben, das ganze ohne eine Fertigloesung rueberzubringen. 😃
    @<Sabine>: So wie der code jetzt ist, solltest Du den net in einem OS o.ae. verwenden. Das Stueck ist ungefaehr so effizient wie Basic-Code :p

    Meiner?Wieso?Ich will mich mal wieder mehr mit Asm beschäftigen,gibst du mir tips wie ichs besser machen kann?(Der code sollte allerdings nicht speziell zugeschnitten sein,falls du das meinst)

    [ Dieser Beitrag wurde am 29.11.2002 um 16:22 Uhr von Bigor editiert. ]



  • Sry, falls das falsch verstanden wurde, aber eigentlich sollte diese Bemerkung nur den Fragesteller dazu bewegen, sich den Code genauer zu Gemuete zu fuehren und simples Copy/Paste verhindern. 🙄

    Naja, als kleine Entschaedigung gibts jetzt die Speedbremsen aufgelistet ;):

    push bp
    mov bp,sp
    push es
    push si
    push di
    ...
    pop di
    pop si
    pop es
    mov sp,bp
    pop bp
    ...
    

    push/pop sind wenn moeglich zu vermeiden.
    Das gleiche gilt natuerlich fuer einen Stackframe... koennte man IMHO hier auch weglassen (ist natuerlich nur in reinem ASM-Code wirklich sinnvoll).

    mov ax,[bp+8];y koordinate
    mov bx,160
    mul bx
    ;mov ax,0
    mov dx,[bp+10];x koordinate
    shl dx,1
    add ax,dx
    

    mul/div sollten ebenso gemieden werden.
    Ein add dx,dx waere schneller gewesen, als ein shl...

    mov ax,[bp+4];farbe
    shl ax,8
    

    Haette es hier nicht auch ein mov nach ah getan?

    Und ein letztes (vernachlaessigbar)

    or al,al
    

    test al,al ist geringfuegig schneller... 😮



  • Danke!



  • auch schön ist das:

    irgend_ein_dummer_text_der_angezeigt_werden_soll db "Hallo! Ich bin ein betriebssystemunabhaengiger Text!",13,10,0
    
    .
    .
    .
    
    mov si, offset irgend_ein_dummer_text_der_angezeigt_werden_soll
    call putstr
    
    .
    .
    .
    
    putstr:
    lodsb
    or al,al
    jz putstrd
    mov ah,0x0E
    mov bx,0x0007
    int 0x10
    jmp putstr
    putstrd:
    retn
    

    Hat jemand Verbesserungsvorschläge?



  • 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,5

    Es gibt keinen Opcode (sollte man eigentlich wissen) mit 2 Operanden, der in selbigen 2 direkte Zahlen akzeptiert. 😉


Anmelden zum Antworten