2017-11-29 5 views
0

Ich möchte verstehen, wie Adresse mit [] in Nasm X86 Assembler zu manipulieren.Was bedeutet diese Syntax (MOV [EBX], 110) in Nasm x86 Assembler?

MY_TABLE TIMES 10 DW 0 ; Allocates 10 words (2 bytes) each initialized to 0 
MOV EBX, [MY_TABLE]  ; Effective Address of MY_TABLE in EBX 
MOV [EBX], 110   ; MY_TABLE[0] = 110 
ADD EBX, 2    ; EBX = EBX +2 
MOV [EBX], 123   ; MY_TABLE[1] = 123 

MOV EBX, [MY_TABLE] - hier der Wert des my_table in EBX-Register oder die Adresse my_table in ebx kopiert kopiert registrieren? Ich frage das, weil [] den Wert an der angegebenen Adresse gibt es innerhalb

MOV [EBX], 110 - was hier der Fall ist, kann ich nicht die Syntax verstehen!

+1

Verschieben Sie 110 an die Adresse, auf die EBX zeigt. Die Größe ist jedoch unklar und es sei denn, NASM hat einige Standardeinstellungen (konnte keine finden), dass dieser Code kein gültiger NASM-Code ist: NASM benötigt in diesem Fall eine explizite Operandengröße (wie jeder gute Assembler). –

+0

die Größe könnte bekannt sein (MY_TABLE ist "definiert" als Wortgröße), trotzdem sollte zumindest eine Warnung ausgegeben werden. 'MOV [EBX], 110' ist mehrdeutig. Was macht der Assembler in diesem Fall? – Tommylee2k

+1

der Kommentar in Zeile 2 ist falsch. Um die effektive Adresse zu laden, wäre LEA (load effective address) korrekt. (oder mit 'MOV EBX, Offset My_table'). Dadurch wird der Inhalt der Adresse my_table auf EBX verschoben (die ersten beiden Werte, da ebx 32 Bit und my_table 16 Bisswerte hat). – Tommylee2k

Antwort

0

Wenn Sie überprüfen die nasm Dokumentation, insbesondere Kapitel 3.3 - Effective address Sie lesen, dass diese

mov EBX,[MY_TABLE] 

lädt die effektive Adresse an den EBX. Später kann es verwendet werden, um die Werte 110 und 123 in die Elemente zu setzen (Index 0 und 1). Aber wie in den Kommentaren erwähnt wurde, sind Sie die Größe des Operanden sollte es so gehen:

mov word [EBX], 110 
... 
mov word [EBX], 123 
+1

'mov EBX, [MY_TABLE]' bewegt sich Inhalt von dem, was in My_table gespeichert ist, nicht die Adresse. LEA würde die Adresse laden, oder 'mov EBX, Offset MY_TABLE' – Tommylee2k

+0

im Allgemeinen stimme ich zu, aber dann denke ich' Nasm' hat eine Abkürzung dafür: "Effektive Adressen, in NASM, haben eine sehr einfache Syntax: Sie bestehen aus einem Ausdruck Auswertung an die gewünschte Adresse in eckigen Klammern. " –

+0

@Pawel Lukasik, mov EBX, [MY_TABLE]. Es lädt die effektive Adresse der MY_TABLE oder lädt den Speicherinhalt, auf den MY_TABLE zeigt. –

3

herunterladen letzte Paket mit NASM, öffnen Sie es, und Sie haben Datei ‚nasm.txt‘, die kurz enthält Referenz zur Verwendung von Nasm. In dieser Datei ist der folgende Satz

‚Symbol Referenzen‘ sind immer sofort verstanden werden (dh die Adresse des Symbols), es sei denn, eckigen Klammern verwendet werden, wobei in diesem Fall der Inhalt des Speicherplatzes sind benutzt. Somit gilt:

mov ax,wordvar 

Lasten AX mit der Adresse der Variablen wordvar, während

mov ax,[wordvar] 
mov ax,[wordvar+1] 
mov ax,[es:wordvar+bx] 

beziehen sich alle auf den 'Inhalt' von Speicherplätzen.

+0

Ich benutze, um die "Offset" zu geben, wenn ich das Register als ein Zeiger verwenden, ("mov ax, offset wordvar" statt nur 'mov ax, wordvar', die oft mit dem - imo verwechselt wird Sehr schrecklich - MASM-Syntax). Offset macht deutlich, dass Sie die Adresse und NICHT den Inhalt meinen. – Tommylee2k

+0

@ Tommylee2k: Um dies in NASM zu tun, müssten Sie '% OFFSET' auf die leere Zeichenfolge definieren, weil es kein NASM-Schlüsselwort ist. Das ist jedoch keine schlechte Idee, besonders wenn Sie manchmal mit MASM oder GNU '.intel_syntax' arbeiten. –