指令操作数必须大小相同错误
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,正如您所做的,但是 cl
从 ecx
本身移动) ,然后将其类似地加载到适当的较小目标中,或者使用明确执行转换的指令(例如分别为 movzx
或 movsx
;move-with-zero-extend/sign-extend)。除非您有意保留目标中的高位字节,否则请选择后者。
另请注意,对 32 位寄存器的任何加载或运算结果总是会清除该寄存器的 64 位形式的上半部分,但对于其他大小组合则相反。
我在数据段中定义了数组,如 - 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,正如您所做的,但是 cl
从 ecx
本身移动) ,然后将其类似地加载到适当的较小目标中,或者使用明确执行转换的指令(例如分别为 movzx
或 movsx
;move-with-zero-extend/sign-extend)。除非您有意保留目标中的高位字节,否则请选择后者。
另请注意,对 32 位寄存器的任何加载或运算结果总是会清除该寄存器的 64 位形式的上半部分,但对于其他大小组合则相反。