1

なぜ私error: value out of range.は次のコードを取得しているのですか?

mov eax,dword ptr "abcdlol$"

"abcdlol"のアドレスをレジスタに入れたいのですがeax、FASMがコピーしているこの値ではないようですeax

Cコードの例:int *p="lol";

これを修正する方法は?これはアセンブラの制限ですか?

4

3 に答える 3

4

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プロセッサは、格納されている値を数値として使用するのか、ポインタとして使用するのかを気にしません。

于 2013-03-23T20:56:45.343 に答える
1

これは機能するはずです:

mystring  db  "abcdlol", 0
mov eax,mystring
于 2013-03-23T21:14:12.857 に答える
0

基本に立ち返って:

EAXは4バイトしか保存できません。「abcdlol$」は8バイトです。したがって、値を直接入力するのではなく、他のポスターで提案されているように、そのアドレスをEAXに入力する必要があります。ただし、主張する場合は、次の2つのレジスタを使用してください。

mov eax,"abcd" ;4 bytes
mov ebx,"lol$" ;4 bytes

または64ビットで、

mov rax,"abcdlol$"

即値を渡すこととレジスタにアドレスを渡すことの違いを教えてください。

于 2014-01-27T16:36:43.630 に答える