2017-05-01 15 views
0

ワード配列に最大値を返すプロシージャを作成しようとしました。 私はローカル変数をhereという表記規則で割り当てました。 しかし、私はローカル変数に値を移動しようとすると、それは私に、このエラーを与える:ここでNasmアセンブリ。スタック上のローカル変数に値を移動できません

invalid combination of opcode and operands

は私のコードです:

greatest: 

    push ebp 
    mov ebp, esp 
         ;allocate local variables here 
    sub esp, 4 
         ;push stuff 
    push esi 

    mov ecx, [ebp+12] ;size of the array 
    mov eax, [ebp+8] ;offset of the array 
    mov esi, 0   ;counter for accessing elements 
    mov ebp-4, eax  ;error here 
l1: 
    push ecx 
    mov ecx, [eax + 2*esi] ;get the variable 
    cmp [ecx], [ebp-4]  ;compare values 
    jb if_2     
    mov ebp-4, ecx  ;error here 
if_2: 
    inc esi 
    pop ecx 
    loop l1 

    mov eax, [ebp-4] 

    pop esi 
    mov esp, ebp 
    pop ebp 
    ret 

任意の助けいただければ幸いです:)

+3

'cmp [ecx]、[ebp-4]' memとmemとを比較することはできません –

+0

@Alexander Zhakしかしレジストリにはありますか?コンパイラは気にしないようです。私は、特定のリンクでMASMが使用され、 'mov ebp-4、eax'がうまく動作することに注意したい。 NASMではそう思わない。おそらく、メモリと値のアドレス指定のための構文と関係しています。 –

+0

私のMASMは 'mov ebp-4、eax'のアセンブルを拒否します。 "*エラーA2032:無効なレジスタの使用*"。 – rkhb

答えて

0

コメントに指摘されているように、コード内の問題は周囲のものとの違いで[]であり、そうではありません。

nasmで示される行には、カッコが付いていません。 ebp - 4は、データを格納するメモリ内の場所であるため、角括弧で囲む必要があります。

もう1つの問題は、cmp [ecx], [ebp - 4]という行です。これはメモリ内の2つの異なる項目(場所ecxebp - 4)を比較しようとしているためコンパイルできません。また、2つの異なるメモリのもの(少なくとも1つはレジスタ/定数でなければなりません)で行うことはできません。

しかし、これはあなたがとにかくやりたいことではありません。 ecxの値がで、の位置はではないので、実際にはcmp ecx, [ebp - 4]が必要です。これは正しいです。

これを変更すると、コードがコンパイルされます。ただし、正しく実行されません。 nasmが好きですが、カッコとカッコの間に問題はあります。

私が最後に見た問題は、やはりmov [ebp - 4], eax(以前のmov ebp - 4, eax)の行です。 eaxにはリストのオフセット(アドレス)と最初の要素のアドレスが含まれていますが、要素自体は含まれていないため、角かっこで囲む必要があります。

しかし、mov [ebp - 4], [eax]を書き込むだけで、前と同じようなエラーが発生します。nasmは2つのメモリを持つことができないために怒ります。

一時的な記憶域としてレジスタ(例:esi)を使用してこの問題を解決できます。 (私たちはとにかくそれを上書きしているので、私はesiを選んだので、私たちはそれをスタックに格納する必要はありません。)これは次のようになります。だから、

mov esi, [eax] 
mov [ebp-4], esi 
mov esi, 0  ; moved this line from above so it's still 0 at the end 

すべてのすべて、これはなった変化に:

greatest: 

    push ebp 
    mov ebp, esp 
         ;allocate local variables here 
    sub esp, 4 
         ;push stuff 
    push esi 

    mov ecx, [ebp+12] ;size of the array 
    mov eax, [ebp+8] ;offset of the array 
    mov esi, [eax]  ;store in esi temporarily 
    mov [ebp-4], esi ;now we can move it to the local variable 
    mov esi, 0   ;counter for accessing elements 

l1: 
    push ecx 
    mov ecx, [eax + 2*esi] ;get the item from the list 
    cmp ecx, [ebp-4]  ;compare values 
    jb if_2     
    mov [ebp-4], ecx  
if_2: 
    inc esi 
    pop ecx 
    loop l1 

    mov eax, [ebp-4] 

    pop esi 
    mov esp, ebp 
    pop ebp 
    ret 
+0

ありがとう!これは実際にメモリ/レジストリの扱いについて明らかにしました。私は、MASMとNASMメモリの異なる構文にアクセスして、実際に何が格納されているのかを忘れてしまいました。答えは非常に便利です。再度、感謝します! –

関連する問題