指令操作数必须大小相同错误

Instruction operands must be of the same size error

我在数据段中定义了数组,如 - myArray byte 01, 03, 02, 05
在代码中,我有一行 mov eax, BYTE PTR myArray[ecx] 汇编器在此处抛出构建错误
指令操作数必须大小相同
这可能是什么原因。我该如何解决。我想遍历这个数组并打印它的
元素

TITLE Subtract Two Nums (SubTwoNums.asm)
; This program collects two numbers and subtracts the second from the first
INCLUDE Irvine32.inc
.data
prompt BYTE "Please enter a number: ", 0
data byte 0A9h
fib  dword 01030205h
msg byte ", " , 0
dwordzeros DWORD 000000h
myArray dword  01,  03,  02,  05

.code

main PROC

mov eax, 0
mov ecx, 0

loop_start:
  cmp ecx, 3
  jge loop_end
  mov eax, myArray[ecx]
  call WriteDec
  mov edx, offset  msg
  call WriteString
  add ecx, 1
  jmp loop_start
loop_end:
exit

主要结束 结束主要

eax 是 32 位,而 BYTE PTR myArray[ecx] 的值是 8 位。根据您要实现的目标,有几种可能的解决方案。其中有

您可以将字节值移动到一个临时的 32 位寄存器中:

movzx ebx,BYTE PTR myArray[ecx]
add eax,ebx

您可以将总和累加为 8 位值:

add al,BYTE PTR myArray[ecx]

您可以将 myArray 的类型从 byte 更改为 dword

这就是操作码的设计方式。对于它们中的大多数,有两种形式:操作数大小“始终为字节”和操作数大小“处理器状态”。后者取决于执行模式、段描述符以及是否已指定“非默认”大小(前缀字节切换单个指令)。

要将较小的数据移动到较大的寄存器中,您必须使用适当大小的源(即用于内存加载的 BYTE PTR,正如您所做的,但是 clecx 本身移动) ,然后将其类似地加载到适当的较小目标中,或者使用明确执行转换的指令(例如分别为 movzxmovsx;move-with-zero-extend/sign-extend)。除非您有意保留目标中的高位字节,否则请选择后者。

另请注意,对 32 位寄存器的任何加载或运算结果总是会清除该寄存器的 64 位形式的上半部分,但对于其他大小组合则相反。