我被要求传递一个指向字节数组的指针,并在PROC中做一些检查,然后返回。我在Stackoverflow上读到,首先我需要解引用ptr,然后再访问它。我在第36和37行这样做,但这种方法给我带来了:
A2022 instruction operands must be same size
A2032 invalid use of register
当我试图汇编这段代码时,arr、指针和寄存器都是相同大小(8位),我不明白为什么会出现这个错误。第一个错误,指令操作数必须是相同大小,是针对第36行,即mov bh, arr
,第二个错误是针对第37行,即mov dl, [bh+ecx-1]
,引发了寄存器无效使用。
下面是代码:
INCLUDE Irvine32.inc
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
.data
minArr BYTE 5,2,4,1,3
maxArr BYTE 9,5,8,4,6
pinArr BYTE 6,3,4,3,4
pinArr2 BYTE 5,4,6,2,5
pinArr3 BYTE 6,2,6,2,5
pinArr4 BYTE 7,3,7,3,2
val1 BYTE ?
val2 BYTE ?
num BYTE ?
str1 BYTE "Valid",0
str2 BYTE "Invalid",0
.code
Validate_PIN PROC, arr:ptr BYTE
mov eax, 0
mov ebx, 0
mov edx, 0
mov ecx, 5
L1:
mov al, [minArr+ecx-1]
mov bl, [maxArr+ecx-1]
mov bh, arr
mov dl, [bh+ecx-1]
mov num, dl
.IF(num < al) || (num > bl)
mov edx, OFFSET str2
mov eax, 0
mov eax, ecx
ret
.ENDIF
loop L1
mov edx, OFFSET str1
mov eax, 0
ret
Validate_PIN ENDP
main PROC
invoke Validate_PIN, addr pinArr
call WriteString
call WriteInt
invoke Validate_PIN, addr pinArr2
call WriteString
call WriteInt
invoke Validate_PIN, addr pinArr3
call WriteString
call WriteInt
invoke Validate_PIN, addr pinArr4
call WriteString
call WriteInt
main ENDP
END main
1条答案
按热度按时间ecr0jaav1#
在@Jester和@Peter Cordes的帮助下(谢谢!),我在PROC代码块中进行了以下更改,修复了这两个问题,程序工作没有任何问题。