assembly 当我将字节指针传递给PROC时,为什么会出现“大小必须相同”和“寄存器使用无效”的提示?

siotufzp  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(106)

我被要求传递一个指向字节数组的指针,并在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
ecr0jaav

ecr0jaav1#

在@Jester和@Peter Cordes的帮助下(谢谢!),我在PROC代码块中进行了以下更改,修复了这两个问题,程序工作没有任何问题。

L1:
     mov al, [minArr+ecx-1]
     mov esi, arr
     mov dl, [esi+ecx-1]
     mov num, dl
     mov bl, [maxArr+ecx-1]

相关问题