AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Assembler und Zeiger

Ein Thema von mumu · begonnen am 4. Jan 2006 · letzter Beitrag vom 4. Jan 2006
Antwort Antwort
Seite 1 von 2  1 2      
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#1

Assembler und Zeiger

  Alt 4. Jan 2006, 11:27
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 ???]
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#2

Re: Assembler und Zeiger

  Alt 4. Jan 2006, 11:50
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

Re: Assembler und Zeiger

  Alt 4. Jan 2006, 11:59
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.
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#4

Re: Assembler und Zeiger

  Alt 4. Jan 2006, 12:00
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
  Mit Zitat antworten Zitat
Niko

Registriert seit: 23. Jun 2003
416 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Assembler und Zeiger

  Alt 4. Jan 2006, 12:39
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.
"Electricity is actually made up of extremely tiny particles called electrons, that you cannot see with the naked eye unless you have been drinking." (Dave Barry)
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#6

Re: Assembler und Zeiger

  Alt 4. Jan 2006, 12:45
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?!
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Assembler und Zeiger

  Alt 4. Jan 2006, 13:06
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
opfer.der.genauigkeit

Registriert seit: 14. Feb 2005
66 Beiträge
 
#8

Re: Assembler und Zeiger

  Alt 4. Jan 2006, 13:12
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
Stellen Sie sich bitte Zirkusmusik vor.
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#9

Re: Assembler und Zeiger

  Alt 4. Jan 2006, 13:16
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 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:
  ...
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#10

Re: Assembler und Zeiger

  Alt 4. Jan 2006, 13:21
und was ist damit:

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

Marke:
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 Uhr.
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