Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Assembler und Zeiger (https://www.delphipraxis.net/60222-assembler-und-zeiger.html)

mumu 4. Jan 2006 10:27


Assembler und Zeiger
 
Also ich hab folgenden Code:

Code:
.MODEL     TINY
.STACK     384

.DATA
  Operand      DB     'Hello$'
  Zeiger      DW   OFFSET Operand
  BefehlsAdressZeiger    DW   OFFSET Marke

;$-begrenzte Ausgabe am Bildschirm
  DollarPutVdu MACRO VirtPufAdr   
    ;VirtPufAdr: 1)Immediate 2)DS-Wort-Bezeichner 3)Register
    PUSH DX      ; Retten in Keller
    PUSH AX      ; Retten
    MOV DX,VirtPufAdr   ; das zuerst, damit auch "DollarPutVdu AX" geht!
    MOV AH,09h
    INT 33
    POP AX      ; Restaurieren aus Keller
    POP DX      ; Restaurieren
  ENDM

.CODE
Startpunkt:
  MOV AX,@DATA
  MOV DS,AX
           
  MOV BX, [Zeiger] ; (1)
  DollarPutVdu BX
         
Marke:
           
  MOV AH,76 ; Programm beenden
  INT 33
END Startpunkt;
was ist jetzt richtiger?! und vorallem warum?

wenn ich bei (1)
MOV BX, Zeiger oder MOV BX, [Zeiger]
mache.

funktionieren tuen beide sachen in meinem Assembler.

meiner meinung nach ist doch
MOV BX, [Zeiger]
richtiger..., weil ich ja den Inhalt von Zeiger (also den OFFSET Operand) haben möchte, um dann über die Offset Adresse Operand auszugeben.

[Soweit ich das aber in erinnerung habe, hat mein prof gemeint das andere (MOV BX, Zeiger) ist richtig ???]

himitsu 4. Jan 2006 10:50

Re: Assembler und Zeiger
 
Ist Zeiger eine Variable?
Wenn ja, dann ist Zeiger intern bereits als [Zeiger] definiert und da der Delphi-Assembler immer nur eine [] akzeptiert, macht ignoriert der einfach alle weiteren, also aus [[Zeiger]] wird einfach [Zeiger] gemacht .

Und da ja intern schon eine [] ist, wird demnach deine [] ignoriert.
Schau einfach mal in deinem CPU-Fenster nach, was der Compiler aus dieser Zeile macht.

NicoDE 4. Jan 2006 10:59

Re: Assembler und Zeiger
 
Zitat:

Zitat von mumu
was ist jetzt richtiger?! und vorallem warum?

Das kommt auf den verwendeten Assembler an. "mov reg, [ptr]" ist 'lesbarer', da man sofort erkennt, dass der Inhalt der Adresse ptr ausgelesen wird.

mumu 4. Jan 2006 11:00

Re: Assembler und Zeiger
 
also er macht aus
MOV BX, Zeiger
und aus
MOV BX, [Zeiger]

immer folgendes:
MOV BX, [Zeiger]

was bedeutet das jetzt bezüglich meiner frage?

es handelt sich hier nicht um den delphi assembler, sondern den TASM

Niko 4. Jan 2006 11:39

Re: Assembler und Zeiger
 
Bei MASM und offensichtlich auch TASM macht es keinen Unterschied, ob du mov BX, [Zeiger] oder mov BX, Zeiger schreibst. Beidemale wird der Wert, der an der Adresse Zeiger steht (in deinem Fall also OFFSET Operand) in BX geschrieben.

Welche Syntax man verwendet ist also letztendlich Geschmackssache.

mumu 4. Jan 2006 11:45

Re: Assembler und Zeiger
 
Zitat:

Zitat von Niko
Bei MASM und offensichtlich auch TASM macht es keinen Unterschied, ob du mov BX, [Zeiger] oder mov BX, Zeiger schreibst. Beidemale wird der Wert, der an der Adresse Zeiger steht (in deinem Fall also OFFSET Operand) in BX geschrieben.

Welche Syntax man verwendet ist also letztendlich Geschmackssache.

ja genau das ist eigentlich schon logisch. aber was ist davon "richtiger"? Eigentlich doch MOV BX, [Zeiger]
weil ja die Speicherzelle Zeiger die Offset Adresse Operand beinhaltet und ich sozusagen auf den Inhalt von Zeiger zugreifen will.

umgedreht gefragt: warum transferriert mir MOV BX, Zeiger nicht die Adresse von Zeiger in BX??? Das sollte doch eigentlich auch möglich sein, bzw. wie ist dies denn dann möglich?!

Flocke 4. Jan 2006 12:06

Re: Assembler und Zeiger
 
Code:
mov BX, Wert         ; <-- Inhalt von Wert
mov BX, offset Wert  ; <-- Adresse von Wert
Die eckigen Klammern verwendet man eigentlich nur in Zusammenhang mit Registern, also EAX ist das Register selbst und [EAX] der Speicher, auf den EAX zeigt.

opfer.der.genauigkeit 4. Jan 2006 12:12

Re: Assembler und Zeiger
 
Hi,

ich habe nur bescheidene ASM-Kenntnisse aber soweit ich weiß, empfiehlt sich der Befehl
lea. Lea ist in die elegantere Variante.

Code:
mov bx, offset Text ---> lea bx, text

mumu 4. Jan 2006 12:16

Re: Assembler und Zeiger
 
Zitat:

Zitat von opfer.der.genauigkeit
Hi,

ich habe nur bescheidene ASM-Kenntnisse aber soweit ich weiß, empfiehlt sich der Befehl
lea. Lea ist in die elegantere Variante.

Code:
mov bx, offset Text ---> lea bx, text

ja ist mir klar, aber darum geht es eigentlich nicht.


Zitat:

Zitat von Flocke
Code:
mov BX, Wert         ; <-- Inhalt von Wert
mov BX, offset Wert  ; &lt;-- Adresse von Wert
Die eckigen Klammern verwendet man eigentlich nur in Zusammenhang mit Registern, also EAX ist das Register selbst und [EAX] der Speicher, auf den EAX zeigt.

hmm gut Flocke, dass macht schon irgendwie sinn. aber was ist dann hier mit:
Code:
.DATA
BefehlsAdressZeiger   DW  OFFSET Marke, OFFSET Marke2, OFFSET Marke3
.CODE
JMP [BefehlsAdressZeiger+2]       ; hier habe ich dann einen Jump zur Marke2

Marke:
  ...
Marke2:
  ...
Marke3:
  ...

mumu 4. Jan 2006 12:21

Re: Assembler und Zeiger
 
und was ist damit:

MOV BX,OFFSET Marke
JMP [BX] ;warum muss ich hier JMP BX anstatt JMP [BX] verwenden?!?!?!

Marke:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz