[si]
-
Hi!
Was ist der Unterschied zwischen diesen Zeilen:mov [cs:si], 0x0A mov [si], 0x0A
oder
mov [ds:si], 0x0A mov [si], 0x0A
Und noch eine Frage: Was stimmt an diesem Source nicht:
mov var, 0x0A ; error: invalid combination of opcode and operands ; normal kann man doch in den Speicher direkt eine Konstante schreiben, oder? ... var db 0x0B
lg, phreaking
PS: Alles NASM-Syntax...
[ Dieser Beitrag wurde am 20.08.2002 um 15:28 Uhr von phreaking editiert. ]
-
mov [cs:si], 0x0A <- si wird ueber das Segment, auf das cs zeigt addressiert.
=> im RM berechnet sich dann die phys. Speicherposition so: cs*16+si
mov [si], 0x0A <- si wird mit dem Inhalt seines default-Segments addressiert (das ist ds)mov [ds:si], 0x0A <- Ist eigentlich das gleiche wie [si] und wird auch meist von den comilern zum gleichen Opcode umgesetzt.
mov [si], 0x0A <- (s.o.)*Und noch eine Frage: Was stimmt an diesem Source nicht:
mov var, 0x0A ; error: invalid combination of opcode and operands
; normal kann man doch in den Speicher direkt eine Konstante schreiben, oder?
...
var db 0x0B*"mov si,var" wuerde das offset der Variable "var" nach si kopieren.
Angenommen, var liegt bei offs. 1234h, dann wuerde der compiler folgenden Opcode fuer die oben stehende Zeile produzieren:
mov si,1234h
Versuch das jetzt mal auf deinen code zu uebertragen. Du hast proktisch folgendes versucht:
mov 1234h,si
Das geht offensichtlich nicht
Um in eine Variable/Speicheraddresse schreiben zu koennen, musst du eckige Klammern um den Variablennamen setzen:
mov [var],0x0A
-
Danke! Kannst du mir auch noch erklären, wozu lea gut ist? Das selbe kann man doch eigentlich mit mov machen, oder?
lg, phreaking
-
Im Grunde schon... lea wird meist einfach benutzt, um mehrere Registeradditionen und/oder Multiplikationen in einem einzigen Takt ausfuehren zu koennen.
z.B. ist sowas hier recht praktisch:
lea ax,[bx+si+12h] (12h ist ein beliebiges byte)
ax ist dann = bx+si+12h => 3 Additionen in einem CPU-TaktDas Prob an der Sache ist: es gibt nur eine gewisse Anzahl an kombinationsmoeglichkeiten bei solchen Additionen.
Google dazu mal nach modR/M byte, vielleicht gibts dazu auch eine Liste online.
-
Danke!
Welche Default-Segmente haben denn DI, SI, BP, SP, AX-DX? Kann man noch andere verwenden? Und welche Segment wird bei [var] verwendet?lg, phreaking
[ Dieser Beitrag wurde am 22.08.2002 um 10:18 Uhr von phreaking editiert. ]
-
Register - Default segment
DI - DS (Bei Stringoperationen (movsb; stosw; etc.) wird ES zum Addressieren benutzt)
SI - DS (auch bei Sring-Operationen)
BP - SS
SP - -- (kann nicht direkt zum Addressieren verwendet werden)
AX - -- (s.o.)
BX - DS
CX - -- (s.o.)
DX - -- (s.o.)
Bei direkt angegebenen Addressen, wie var, wird ds zum Addressieren verwendet.[ Dieser Beitrag wurde am 22.08.2002 um 10:30 Uhr von Nobuo T editiert. ]
-
Hmm.. komisch, warum können ax, cx, dx nicht verwendet werden, aber eax, ecx, edx schon?
lg, phreaking
-
Da koennte man genau so gut fragen: Warum gibt die A20 auch jetzt noch?
Das hat nunmal irgendwann ein Inteldesigner fuer sinnvoll so erachtet...
-
Stimmt, die Frage war nicht sehr sinnvoll
Welche Default-Segmente haben EAX-EDX?lg, phreaking
-
Könnte mir jemand auch noch erklären, was LDS, LES usw. machen?
lg, phreaking
-
EAX - EDX benutzen als Standard-Segmentregister auch ds
Mit ESP laesst sich uebrigens auch addressieren: dieses Register benutzt ss.Die Opcode-familie LES, LDS etc. laesst sich Modellhaft so darstellen:
L** ??,[dword ptr xx:%%%%]** steht hierbei fuer ein beliebiges Segmentregister ausser CS (ES, DS, GS, etc. => LES, LDS, LGS, usw...)
?? steht fuer ein beliebiges 16Bit oder 32Bit Register.
xx steht wieder fuer ein Segmentregister
%%%% bildet mit dem Segmentregister (welches fuer xx eingesetzt wird) eine AddresseLDS laedt von einer Speicheraddresse einen Wert fuer das Segmentregister in ** und das Register im ersten Operand (??).
Beispiel:
var dw 0080h
dw 0A000h
...
LES DI,[DWORD PTR DS:Var]=>
DI=0080h
ES=0A000h