3

ユーザーが数字を入力するプログラムを作成しています。プログラムはゼロからその数字まで出力します。これが私のコードです:

SECTION .DATA
len  EQU 32

SECTION .bss
data resw len
other resw len 
SECTION .TEXT

GLOBAL _start
_start:

input:                  ; This section gets the integer from the user
mov eax, 3          ; }
mov ebx, 1          ; }
mov ecx, data       ; } System_read call
mov edx, len        ; }
int 80h             ; }

prelim:
mov ebp, 0

setup:                  ; This section sets up the registers ready for looping 
push ebp
pop other        ; THIS IS THE ERROR LINE!
mov esi, data 

loop:                   ; This section loops, printing out from zero to the number given
mov eax, 4
mov ebx, 1
mov ecx, other 
mov edx, len
int 80h
cmp ebp, esi
je exit
inc ebp
jmp setup
exit:                   ; Exits the program
mov eax, 1          ; }
mov ebx, 0          ; } System_exit call
int 80h             ; }

私が抱えている問題は、エラーが発生することinvalid combination of opcode and operandです。変数otherをワード、ダブルワード、バイトとして宣言しようとしましたが、それでもそう言います。なぜですか?

本質的に、私の質問は、レジスタ内の値をメモリ内の値に移動するにはどうすればよいですか? そのような:

mov memorydata, eax

どこmemorydataでデータが宣言されているか、SECTION .dataまたはそのようなものです。

4

2 に答える 2

10

まず、そうであるべきであり、そうではpop [other]ありませんpop other。NASMでは、otherは単なるアドレスであり、は[other]そのアドレスのコンテンツ/データを表します。これが、NASMがTASMやMASMと異なる点です。pop otherNASMに、スタックから...定数にデータをポップする命令を生成するように要求しています。そのような指示はなく、そのような指示をすることは意味がありません。レジスタまたはメモリにデータをポップしたい。

次に、TASMやMASM(これも)とは異なり、NASMはラベル名にタイプやサイズを割り当てません。ラベルはまさにそれであり、コードまたはデータ内の名前付きの場所(アドレス)です。

そのためpop [other]、NASMにはあいまいですpop。単語または二重単語をポップでき、どちらを指定するかを指定せず、NASMが適切なサイズを推測する方法がないためです。

代わりに書くべきものはどちらかです

pop word [other]

また

pop some_32_bit_register ; e.g. pop eax
mov [other], that_same_32_bit_register_s_lower_half ; e.g. mov [other], ax

16ビットレジスタまたは変数または定数をプッシュまたはポップしないことを強くお勧めします。それらはスタックの位置をずらし、注意力の喪失によるパフォーマンスの低下やばかげたバグにつながる可能性があります(たとえば、32ビット値をプッシュしてから誤って16ビットとしてポップするなど)。

于 2012-10-12T07:32:49.623 に答える
-1

一時レジスタにポップしてから、メモリの宛先に移動する必要があります。

POP EAX
MOV myVar,EAX

または、明示的な構文を使用してポップする必要があります。

POP WORD PTR[<word_sized_var>]

をメモリに移動することに関しては、いくつかの構文上の方法があります。

MOV <var name>,<value>

MOV [<var name>],<value>

あなたの場合、おそらく最初のものが必要です:MOV other,EBP

于 2012-10-12T07:33:09.860 に答える