2016-04-24 220 views
2

我正在嘗試在ASM中編寫一個簡單的for循環。我需要訪問兩個陣列,其是用C代碼段的外++(爲OrigChars和EncrChars)C++/ASM - 「操作數大小衝突」,「不正確的操作數類型」

char temporary_char;      

__asm {    
     xor ebx, ebx    
     jmp checkend    

     loopfor: inc ebx       

     checkend: cmp ebx, len    
     jge endfor1    

     mov bx, word ptr[ebx + OrigChars] 
     mov temporary_char, bx //error - "operand size conflict" 

     push eax 
     push ecx 

     movzx ecx, temporary_char  
     lea eax, EKey   

     push eax     
     push ecx 

     call encrypt1    
     add esp, 8    

     mov temporary_char, al  

     pop ecx 
     pop eax 

     mov EncrChars[ebx], temporary_char //error - "improper operand type" 

     jmp loopfor   
} 

與上面已經評論錯誤的行。

概括地說,爲什麼不這些工作對我來說:

  • MOV temporary_char,BX // temp_char = OChars [I]
  • mov EncrChars [ebx],temporary_char // EncrChars [ebx] = temporary_char;
+0

您確定'mov bx,word ptr [ebx + OrigChars]'不起作用嗎?它看起來像問題insn的子彈點列表中唯一正確的。 (順便說一句,請參閱[x86標籤wiki](http://stackoverflow.com/tags/x86/info)瞭解大量有用的鏈接。 –

回答

3
mov bx, word ptr[ebx + OrigChars] 
mov temporary_char, bx //error - "operand size conflict" 

由於temporary_char類型char你只需要通過BL更換BX的。
最好仍然使用AL,因爲您使用EBX作爲尋址索引!

mov al, byte ptr [OrigChars + ebx] 
mov temporary_char, al 

mov EncrChars[ebx], temporary_char //error - "improper operand type" 

你不能在同一個指令2個內存引用。使用間歇寄存器:

mov al, temporary_char 
mov byte ptr [EncrChars + ebx], al 
+0

中的第二個錯誤謝謝,解決了這兩個問題,並解釋了爲什麼足夠。 – ozank

+0

@ozank:如果你想在加載一個字節的時候將剩餘的一部分清零,可以使用'movzx ebx,byte ptr [mem]'或類似的方法。還有一個符號擴展的'movsx'。符號或零擴展加載不會花費額外的任何代碼(除了幾個字節的代碼大小),並且可以避免來自後續指令的部分寄存器減速。 (或者在那個insn上,在除Intel P6或SnB系列以外的CPU上,部分reg寫入對整個reg都有錯誤的依賴關係。) –

0

char類型通常是8位大小。 bx寄存器是16位。這是你的錯配。

+0

好的,我該如何解決這個問題?對不起,我是ASM的新手,我會需要截斷寄存器或其他什麼? – ozank

+0

相反,在第一個錯誤中,你的限制是比源(16位寄存器)更小的目標('char'類型),你應該使用更大的類型來爲' temporary_char' – SomeWittyUsername

+0

我將'temporary_char'的類型改爲字符串,但我仍然在底部得到「不正確的操作數類型」 – ozank

相關問題