0

レジスタ間接アドレッシングがどのように機能するかを理解しようとしています。次のように 5 の値を格納する変数があります。

section .data

number db 53 ; ascii code for 5

section .bss
number2 resb 1
section .text
global _start

_start:

mov eax,number
mov number2,[eax]

コードの最後の 2 行で、私が本質的にしようとしているのは、eax を number に格納されたデータへのポインターのように動作させ、このデータを number2 変数に移動することです。[register] を介して間接レジスタ アドレス指定を行っていましたが、コードが機能していないようです。構文に関するヘルプは大歓迎です。

4

2 に答える 2

1

ラベルはnasmのアドレスとして機能するため、データを直接オペランドに移動できないため、もちろん無効mov number2, [eax]なようなものに変換されます。mov 0x12345678, [eax]したがって、必要になりますmov [number2], [eax]が、それも無効です。

値を一時的に保持するレジスタを使用して、これを実現できます[eax]

mov eax, number
mov dl, [eax]
mov [number2], dl
于 2014-12-11T06:38:22.020 に答える
1

ここでの問題は、numberとが数字number2ではないことです。つまり、即時リテラルです。代わりに、それらは絶対メモリアドレスとして解釈され、対応する命令が存在する場合は、たとえば次のようになります。

 mov eax, [0x80000100]        ;; vs
 mov [0x80000104], [eax]     ;; Invalid instruction

Mika Lammiが答えたように、命令形式にも注意を払う必要があります-命令です

 mov src, dst   ;; vs
 mov dst, src

さらに、レジスタのサイズを変数のサイズに一致させる必要があります。すなわち

.data
number   db 1;   // this is a byte
.code
mov al, number
于 2014-12-11T06:46:32.427 に答える