なぜ私error: value out of range.
は次のコードを取得しているのですか?
mov eax,dword ptr "abcdlol$"
"abcdlol"
のアドレスをレジスタに入れたいのですがeax
、FASMがコピーしているこの値ではないようですeax
。
Cコードの例:int *p="lol";
これを修正する方法は?これはアセンブラの制限ですか?
FASM構文は次のようになります。
mov eax、my_string my_string db "abcdlol $"
また、使用することができますlea
:
lea eax、[my_string] my_string db "abcdlol $"
ASCIIZ文字列(0で終了)を使用するか、その他のターミネータを使用するかは、文字列で何をするかによって異なります。$
DOSの文字列印刷機能で使用されている文字列ターミネータとして使用しているようです。$
これが、使用するOS API関数(存在する場合)の正しい文字列ターミネータであることを確認してください。たとえば、printf
ゼロで終了する(ASCIIZ)文字列が必要です。
FASMHelloWorld.exeプログラムを参照してください。FASM構文の例を参照してください。
dword ptr
などは、メモリをアドレス指定する場合にのみ必要です。mov eax,abcdlol
はただのmov eax,immed32
です。eax
プロセッサは、格納されている値を数値として使用するのか、ポインタとして使用するのかを気にしません。
これは機能するはずです:
mystring db "abcdlol", 0
mov eax,mystring
基本に立ち返って:
EAXは4バイトしか保存できません。「abcdlol$」は8バイトです。したがって、値を直接入力するのではなく、他のポスターで提案されているように、そのアドレスをEAXに入力する必要があります。ただし、主張する場合は、次の2つのレジスタを使用してください。
mov eax,"abcd" ;4 bytes
mov ebx,"lol$" ;4 bytes
または64ビットで、
mov rax,"abcdlol$"
即値を渡すこととレジスタにアドレスを渡すことの違いを教えてください。