[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-Takt 🙂

    Das 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 Addresse

    LDS 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
    😉


Anmelden zum Antworten