Pascal "absolute" Deklaration - mit Pointer-Array möglich?

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von Dosenware »

Code: Alles auswählen

function blubb: irgendeintyp; {bei word/byte/char... genauso wie unten}
begin
 asm
  ...
  les    di,@Result
  mov    es:[di],Rückgabewert(e)
 end;
end;

function blablubb: word; assembler; {bei string und anderen "größeren" Datentypen wie oben}
asm
 ...
 mov AX, Rückgabewert
end;
PS. function a:blubb;assembler;asm;end; und function b:blah;begin;asm;end;end; sind imho identisch (zumindest habe ich noch keine Unterschiede gemerkt).

das mit dem Stack macht Pascal eigentlich Automatisch, kannst du dir auch im debugger ansehen.
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von zatzen »

Also ist @result eine festgelegte Adresse von Pascal für Rückgabewerte einer Function?
Und wenn es nur ein Wert ist holt sich Pascal den Wert aus dem Register AX?
Bin mir nicht sicher ob ich das verstanden habe...

Was das Sichern auf dem Stack angeht: Ist ja eigentlich nicht so toll dass da
standardmäßig immer alles gesichert wird. Wenn man in einer ASM Procedure
beispielsweise nur AX ändert, dann ist der Rest ja unnötig, d.h. auch unnötige
Zeitverschwendung. Es sei denn, der Compiler ist wieder mal intelligent und
sichert nur das, was in der ASM Anweisung geändert wird...
Debugger bzw. kompilierten Code im HEX-Editor ansehen habe ich noch nicht
gemacht. Könnte ich nötigenfalls versuchen, ich vertraue aber auch auf Euer
Wissen hier.

Der Unterschied zwischen "assembler" deklarierten Routinen und "begin - end" umklammerten
besteht für mich auch darin, dass letztere auch noch Variablen etc. definieren können auf die
man dann praktischerweise im ASM Teil direkt zugreifen kann.

Das Ganze interessiert mich gerade verstärkt, weil ich nicht z.B. eine ASM Prozedur
für das Darstellen eines Sprites schreibe, bei der es hauptsächlich um die Geschwindkeit
der innersten Schleife geht, sondern eine Function (mit dem Bit-Lesen) in der
eigentlich gar nicht so viel passiert, noch schneller machen will, so dass
gehäufte Aufrufe dieser Prozedur (sagen wir mal so 150 Stück) sehr flott gehen.
Da kommt es durchaus drauf an wieviele push's und pop's es gibt.
mov ax, 13h
int 10h

while vorne_frei do vor;
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von DOSferatu »

Funktion mit Rückgabewert:
BYTE/SHORTINT: in AL
WORD/INTEGER: in AX
LONGINT: in DX:AX (also obere 16bit = DX, untere 16bit = AX)
REAL: in DX:BX:AX (ein Real braucht 6 Bytes)
Alle anderen werden meines Wissens als Pointer zurückgegeben....
Es gibt da eine Sektion im ASM86FAQ, wo das drinsteht. Kann ich mal rauskopieren bei Gelegenheit.
Oder einfach mal ASM86FAQ.TXT von meiner Seite DL und dazu FAQREAD.EXE (mein praktisches Lesetool für Texte, das speziell für Text in ASM86FAQ.TXT (und ASMFAQ.TXT) Format so Features hat, um Sektionen/Subsektionen aus Pulldowns aufzurufen. (Werden zu anfang geparst...)
Hab ich mal gebaut, weil der Text ca 1 MB groß ist und das händische Suchen darin mir irgendwann zu zeitaufwendig wurde, wenn ich mal schnell was brauchte.
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von zatzen »

Okay super, weiss ich das schonmal.
Ich werd mich mal auf die Suche nach einem passenden Disassembler machen.
Hab mal eine kleine Routine geschrieben in der nur 8x NOP steht(damit ich
das sofort finde), im HexEdit seh ich da schonmal dass er mir vor den
8x $90 13 Nullen macht. Ob das jetzt zur Routine gehört oder nicht weiss
ich noch nicht. Kann ja eigentlich nicht sein. Aber kann ich daraus schliessen,
dass die Routine direkt mit dem ersten NOP beginnt und er gar nix auf den
Stack schiebt weil NOP ja nichts mit den Registern anstellt?
Woher kommt eigentlich der ganze Rest darunter(1,6K) ? Sind wohl die ganzen
Grundfunktionen.
mov ax, 13h
int 10h

while vorne_frei do vor;
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von freecrac »

zatzen hat geschrieben:Also ist @result eine festgelegte Adresse von Pascal für Rückgabewerte einer Function?
Und wenn es nur ein Wert ist holt sich Pascal den Wert aus dem Register AX?
Bin mir nicht sicher ob ich das verstanden habe...

Was das Sichern auf dem Stack angeht: Ist ja eigentlich nicht so toll dass da
standardmäßig immer alles gesichert wird. Wenn man in einer ASM Procedure
beispielsweise nur AX ändert, dann ist der Rest ja unnötig, d.h. auch unnötige
Zeitverschwendung. Es sei denn, der Compiler ist wieder mal intelligent und
sichert nur das, was in der ASM Anweisung geändert wird...
Debugger bzw. kompilierten Code im HEX-Editor ansehen habe ich noch nicht
gemacht. Könnte ich nötigenfalls versuchen, ich vertraue aber auch auf Euer
Wissen hier.

Der Unterschied zwischen "assembler" deklarierten Routinen und "begin - end" umklammerten
besteht für mich auch darin, dass letztere auch noch Variablen etc. definieren können auf die
man dann praktischerweise im ASM Teil direkt zugreifen kann.

Das Ganze interessiert mich gerade verstärkt, weil ich nicht z.B. eine ASM Prozedur
für das Darstellen eines Sprites schreibe, bei der es hauptsächlich um die Geschwindkeit
der innersten Schleife geht, sondern eine Function (mit dem Bit-Lesen) in der
eigentlich gar nicht so viel passiert, noch schneller machen will, so dass
gehäufte Aufrufe dieser Prozedur (sagen wir mal so 150 Stück) sehr flott gehen.
Da kommt es durchaus drauf an wieviele push's und pop's es gibt.
Bei älteren CPUs (vor dem Pentium 4) ist es wohl am schnellsten, wenn man push- und pop-Befehle so oft wie möglich vermeidet. Ersatzweise verwendet man eine reservierte Speicheradresse, wo man mit einem einfachen MOV-Befehl darauf zugreifen kann. Sonst können Werte auch einfach von Routine zu Routine nur über bestimmte Register übergeben werden, im Falle diese Register zwischendurch noch nicht wieder einen anderen Wert bekommen haben.

Weil ich auch noch weniger Speicherzugriffe machen wollte und alle anderen normalen Register schon verwendet wurden, habe ich auch schon mal einige der Debug-Register(dr0, dr1, dr2, dr4) zweckentfremdet. Die werden sonst eigentlich nur zum debugen verwendet.

Dirk
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von zatzen »

Danke, an soetwas hatte ich noch gar nicht gedacht.
Allerdings fressen MOV Anweisungen ja auch Takte.

Ich muss halt herausfinden, was pascal automatisch und praktisch unabänderlich
am Anfang und Ende einer Prozedur an Registern sichert und wiederherstellt.
Scheint aber abhängig davon zu sein, was in der ASM Routine passiert,
d.h. der Compiler "scannt" da wohl durch.

Habe bisher mal zum Testen nur xor ax, ax in eine Routine geschrieben, im
Disassembler fängt die Routine dann direkt mit diesem Befehl an. Müsste ich
mal was anderes probieren.
mov ax, 13h
int 10h

while vorne_frei do vor;
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von zatzen »

Wie es auch in der Suchwort-Hilfe von BP70 steht, verhält es sich folgendermaßen:

Wenn ich eine Routine mit "assembler" deklariere, scheint er den Code 1:1 und ohne
vorherige/nachherige Sicherung der Register einzufügen.

Wenn ich aber die Routine mit "begin" anfangen lasse und dann erst mit "asm" anfange
steht im Disassemblat folgendes:

Code: Alles auswählen

push bp
mov bp, sp
xor ax, ax
call sub_1030D
Was auch immer diese Subroutine ist...

Nach meinen Testbefehlen (nur xor ax, ax und mov ds, ax):

Code: Alles auswählen

pop bp
retn

So... Aber das ganze wird auch hinfällig wenn man sich mal ein wenig mit der Hilfe von Pascal
beschäftigt hat. Dort steht:
Eine asm-Anweisung muss folgende Register sichern:
BP SP SS DS

Eine asm-Anweisung kann folgende Register ändern:
AX BX CX DX SI DI ES Flags

Damit wäre die Sache ja eigentlich geklärt - demnach kann ich mit AX-DX sowie mit SI, DI ES und Flags
machen was ich will, ohne die sichern zu müssen.
Etwas ist nur unklar beschrieben. "Kann folgende Register ändern".
Ich kann auch DS ändern. Heisst wohl eher, eine asm-Anweisung kann folgende Register ändern, und
kann sie so belassen. Fragt sich nur, ob da nicht noch eine Lücke ist. AX-DX und SI DI ES sind ja
längst nicht alle Register. Kann man sich weitere freischalten, so wie mit {$G+} den 286er Assembler?
Fazit wäre für mich jetzt, dass ich nur DS sichern muss, wenn ich es denn verwende. An BP, SP und SS
fummel ich ja nicht herum.
Und ich nehme mal, an, die Stack-bezogenen Register erhalten wieder ihre Ursprungswerte, auch wenn
ich in der Routine etwas auf den Stack lege, dann aber auch sauber wieder runternehme.
mov ax, 13h
int 10h

while vorne_frei do vor;
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von freecrac »

zatzen hat geschrieben:Allerdings fressen MOV Anweisungen ja auch Takte.
Aber nicht so viele wie bei push/pop.
ASM86FAQ.TXT:

Code: Alles auswählen

   Befehl             Pipe   P5    486    386   286   86        Opcode

   MOV r|m8, r8        UV    1     1      2     2|3   2|9+EA    88 /r
   MOV r|m16, r16      UV    1     1      2     2|3   2|9+EA    89 /r
   MOV r|m32, r32      UV    1     1      2     -     -         89 /r
   MOV r8, r|m8        UV    1     1      2|4   2|5   2|8+EA    8A /r
   MOV r16, r|m16      UV    1     1      2|4   2|5   2|8+EA    8B /r
   MOV r32, r|m32      UV    1     1      2|4   -     -         8B /r
   MOV AL, moffs8      UV    1     1      4     5     10        A0
   MOV AX, moffs16     UV    1     1      4     5     10        A1
   MOV EAX, moffs32    UV    1     1      4     -     -         A1
   MOV moffs8, AL      UV    1     1      4     3     10        A2
   MOV moffs16, AX     UV    1     1      4     3     10        A3
   MOV moffs32, EAX    UV    1     1      4     -     -         A3
   MOV r8, imm8        UV    1     1      2     2     4         B0+rb
   MOV r16, imm16      UV    1     1      2     2     4         B8+rw
   MOV r32, imm32      UV    1     1      2     -     -         B8+rd
   MOV r|m8, imm8      UV    1     1      2     2|3   4|10+EA   C6 /0
   MOV r|m16, imm16    UV    1     1      2     2|3   4|10+EA   C7 /0
   MOV r|m32, imm32    UV    1     1      2     -     -         C7 /0
   MOV r|m16, sreg     UV    1     3      2     2|3   2|9+EA    8C /r
   MOV sreg, r|m16     UV    2|3   3|9    2|5   2|5   2|8+EA    8E /r
                             PM=          PM=   PM=   -
                             11|12°       18|19 17|19

   ° nur P5 im PM: MOV SS, r|m16 = 17|17

Code: Alles auswählen

   Befehl             Pipe   P5   486   386    286    86        Opcode

   POP r16             UV    1    4     4      5      8         58+rw
   POP r32             UV    1    4     4      -      -         58+rd
   POP m16             NP    3    6     5      5      17+EA     8F /0
   POP m32             NP    3    6     5      -      -         8F /0
   POP DS              NP    3    3     7      5      8         1F
                                        PM=    PM=
                                        21     21
   POP ES              NP    3    3     7      5      8         07
                                        PM=    PM=
                                        21     20
   POP FS              NP    3    3     7      -      -         0F A1
                                        PM=    -
                                        21
   POP GS              NP    3    3     7      -      -         0F A9
                                        PM=    -
                                        21
   POP SS              NP    3    3     7      5      8         17
                                        PM=    PM=
                                        21     20

Code: Alles auswählen

   Befehl             Pipe   P5   486   386    286    86        Opcode

   PUSH r16            UV    1    1     2      3      11        50+rw
   PUSH r32            UV    1    1     2      -      -         50+rd
   PUSH imm8           UV    1    1     2      3      -         6A
   PUSH imm16          UV    1    1     2      3      -         68
   PUSH imm32          UV    1    1     2      -      -         68
   PUSH m16            NP    1    4     5      5      16+EA     FF /6
   PUSH m32            NP    1    4     5      -      -         FF /6
   PUSH CS             NP    1    3     2      3      10        0E
   PUSH DS             NP    1    3     2      3      10        1E
   PUSH ES             NP    1    3     2      3      10        06
   PUSH FS             NP    1    3     2      -      -         0F A0
   PUSH GS             NP    1    3     2      -      -         0F A8
   PUSH SS             NP    1    3     2      3      10        16
...
Man kann auch innerhalb einer Subroutine die Register SP/BP und SS frei verwenden, wenn man die Werte darin vorher an eine reservierte Speicherstelle sichert und am Ende der Subroutine wieder herstellt. Genauso muss man verfahren, wenn wir innerhalb unserer Subroutine noch weitere Subroutinen aufrufen möchten, dann müssen vorher auch die Register wieder hergestellt sein, damit der Zustand unseres Stacks funktionstüchtig bleibt und auch für unsere call-Befehle die Rücksprungadressen für unsere weiteren Subroutinen aufnehmen kann.

Zwischenzeitlich wenn der Stack nicht weiter von uns verwendet wird können wir die Register SP/BP und SS auch für unsere eigenen Zwecke verwenden. Dann haben wir gleichzeitig mit DS:SI und ES:DI auch noch SS:SP, oder SS:BP zur Adressierung von verschiedenen Speicherbereichen zur Verfügung an deren Adressen sich Tabellen etc. befinden können.

Dirk
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von zatzen »

Danke für den Tipp mit dem "missbrauchen" der Stack Register!
Funktioniert aber nur, wenn ich die in Speicherstellen sichere, weil der
Stack die ja sozusagen für seine Selbstorganisation benötigt, richtig?

Kommt mir gerade recht, weil ich ja bald eine Mixing Routine für meinen
Musikplayer schreiben möchte, und da hab ich mir schon Sorgen gemacht
wie ich die ganzen Speicheradressen möglichst ohne Geschwindigkeitseinbußen
handlen kann.

Bleibt nur nochmal zur Sicherheit die Frage, ob ich in Pascal wirklich
nur BP SP SS und DS wiederherstellen muss und den Rest verändert belassen kann.

Ich meine, früher habe ich aus Unwissenheit auch ES auf den Stack geschoben,
sowie DI und SI.
mov ax, 13h
int 10h

while vorne_frei do vor;
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von freecrac »

zatzen hat geschrieben:Danke für den Tipp mit dem "missbrauchen" der Stack Register!
Funktioniert aber nur, wenn ich die in Speicherstellen sichere, weil der
Stack die ja sozusagen für seine Selbstorganisation benötigt, richtig?
Ja genau.
Und dort kann man auch beliebge Registerinhalte auf einfache Weise speichern, immer dann wenn wir zu wenige Registern haben und für eine Aufgabe ein weiteres freies Register brauchen, um dort z.B ein Vergleichs-Wert hinein zu tun, der als Abbruchbedingung für eine Schleife verwendet wird.

Beipiel: Anstelle von "cmp Adressregister, imidiate Wert" können wir dann ein "cmp Adressregister, Vergleichsregister" nehmen. Das macht man am besten in Schleifen und wenn dieser Wert oft verwendet wird und andernfalls als Imidiate-Wert jeweils im Code hinein geschrieben werden müsste. Der Aufwand einen vorherigen Wert eines Registers zu retten und im Anschluss am Ende wieder aus den Speicher zu laden muss sich aber schon lohnen.
Kommt mir gerade recht, weil ich ja bald eine Mixing Routine für meinen
Musikplayer schreiben möchte, und da hab ich mir schon Sorgen gemacht
wie ich die ganzen Speicheradressen möglichst ohne Geschwindigkeitseinbußen
handlen kann.
Es ist natürlich ein Unterschied ob wir mit 32 Bit-Adressregister, oder nur mit 16 Bit-Adressregister arbeitet.
Weil mit 16 Bit-Adressregister sind wir bei der Auswahl an verwendbaren Adressregister und deren Kombinationsmöglichkeiten erheblich eingeschränkter.
Bleibt nur nochmal zur Sicherheit die Frage, ob ich in Pascal wirklich
nur BP SP SS und DS wiederherstellen muss und den Rest verändert belassen kann.

Ich meine, früher habe ich aus Unwissenheit auch ES auf den Stack geschoben,
sowie DI und SI.
Mit Pascal kenne ich mich selber immer noch nicht aus.

Dirk
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von zatzen »

Das heisst, "cmp register, register" ist grundsätzlich schneller als "cmp register, immediate" ?
Auch bei 0 ? Könnte ja sein, dass für "cmp register, 0" eine eigene Instruktion existiert, da
das ja ein besonderer, häufig anzutreffender Fall ist, und dass diese Instruktion dann genauso
schnell ist wie ein register-register Vergleich.
Andererseits wird der Fall "0" ja schon durch das Zero-Flag abgedeckt, wenn man z.B. einfach
nur subtrahiert. Braucht man also gar kein CMP. Meine ich jedenfalls.
mov ax, 13h
int 10h

while vorne_frei do vor;
wobo
DOS-Guru
Beiträge: 613
Registriert: So 17. Okt 2010, 14:40

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von wobo »

zatzen hat geschrieben: Bleibt nur nochmal zur Sicherheit die Frage, ob ich in Pascal wirklich
nur BP SP SS und DS wiederherstellen muss und den Rest verändert belassen kann.
Ja! Für Pascal musst Du nur BP, SP, SS, DS unverändert lassen bzw. wiederherstellen.
zatzen hat geschrieben:Das heisst, "cmp register, register" ist grundsätzlich schneller als "cmp register, immediate" ?
Auch bei 0 ? Könnte ja sein, dass für "cmp register, 0" eine eigene Instruktion existiert, da
das ja ein besonderer, häufig anzutreffender Fall ist, und dass diese Instruktion dann genauso
schnell ist wie ein register-register Vergleich.
Andererseits wird der Fall "0" ja schon durch das Zero-Flag abgedeckt, wenn man z.B. einfach
nur subtrahiert. Braucht man also gar kein CMP. Meine ich jedenfalls.
Üblicherweise ersetzt man "cmp register, 0" durch ein "test register, register", weil dies auf älteren CPUs schneller ausgeführt wird. Ab 486 merke ich mit meinen Tests aber keinen Unterschied mehr, was den Vergleich mit Null anbelangt: In meiner Dauerschleife brauchen alle Varianten gleich lang!
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von zatzen »

Stimmt, TEST war mir ganz entfallen. War doch ein AND ohne Veränderungen.
Ich meine halt nur, wenn ich in ner Schleife habe "dec cx" dann müsste, wenn
cx null wird, das Zero Flag gesetzt werden. Oder nicht?

Einen hab ich noch: Wenn ich innerhalb eines asm Blocks in Pascal DS verändere
(vorher natürlich sichere, dann wiederherstelle), aber wenn ich's verändere, kann
ich dann trotzdem noch direkt auf in Pascal definierte Variablen in dem asm Teil zugreifen?
Braucht der nicht ein unangetastetes DS Register um Variablen zu adressieren?
mov ax, 13h
int 10h

while vorne_frei do vor;
wobo
DOS-Guru
Beiträge: 613
Registriert: So 17. Okt 2010, 14:40

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von wobo »

zatzen hat geschrieben:Stimmt, TEST war mir ganz entfallen. War doch ein AND ohne Veränderungen.
Ich meine halt nur, wenn ich in ner Schleife habe "dec cx" dann müsste, wenn
cx null wird, das Zero Flag gesetzt werden. Oder nicht?
Ja, das zero flag wird dann gesetzt!
zatzen hat geschrieben: Einen hab ich noch: Wenn ich innerhalb eines asm Blocks in Pascal DS verändere
(vorher natürlich sichere, dann wiederherstelle), aber wenn ich's verändere, kann
ich dann trotzdem noch direkt auf in Pascal definierte Variablen in dem asm Teil zugreifen?
Braucht der nicht ein unangetastetes DS Register um Variablen zu adressieren?
Nein, auf die global definierten Variablen kannst Du nach Veränderung von DS nicht mehr direkt zugreifen. DS enthält ja dann ein anderes Segmentregister als das, in welchem Pascal die globalen Variablen abgelegt hat.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Pascal "absolute" Deklaration - mit Pointer-Array möglic

Beitrag von freecrac »

zatzen hat geschrieben:Das heisst, "cmp register, register" ist grundsätzlich schneller als "cmp register, immediate" ?
Ja das kann man schon so sagen, weil ein Immediate Wert in einer Schleife dann jedesmal erneut aufwendiger verarbeitet werden muss, im Vergleich dazu, wenn nur Register in der Schleife verwendet werden und der Vergleichswert sonst nur vor der Schleife ein einziges Mal als immediate Wert verarbeitet werden braucht.
Auch bei 0 ? Könnte ja sein, dass für "cmp register, 0" eine eigene Instruktion existiert, da
das ja ein besonderer, häufig anzutreffender Fall ist, und dass diese Instruktion dann genauso
schnell ist wie ein register-register Vergleich.
Andererseits wird der Fall "0" ja schon durch das Zero-Flag abgedeckt, wenn man z.B. einfach
nur subtrahiert. Braucht man also gar kein CMP. Meine ich jedenfalls.
Ja ein "cmp register, 0" mache ich deswegen auch nur sehr selten, weil es oft genügt nach einer Operation einfach zu nur verzweigen.

...

Kurz vor dem Zugriff auf global definierten Variablen kann man DS auch wieder mit der ursprünglichen Segment-Adresse laden, damit der Zugriff möglich wird. Danach kann DS erneut wieder verändert werden.

Dirk
Antworten