инструкция операндов размера ошибки при определении и вызове макроса, который получает различные типы данных. Использование masm32 - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь написать макрос, который должен получить целое число типа BYTE, WORD или DWORD и вывести его на экран. Я пытаюсь использовать функцию SIZEOF в определении макроса, чтобы отправлять разные типы данных в регистры разного размера, но при вызове макроса возникает ошибка. Вот полный код:

INCLUDE Irvine32.inc
.data
oneByte BYTE 42h
twoByte WORD 1423h
fourByte DWORD 1950123Dh
errorMessage BYTE "ERROR INPUT!!!", 0
.code
mWriteInt MACRO theInt
    mov eax, sizeof theInt
    cmp eax, 1
    je isonebyte
    cmp eax, 2
    je istwobyte
    cmp eax, 4
    je isfourbyte
    jmp error
isonebyte:
    mov eax, 0
    mov al, theInt
    jmp over
istwobyte:
    mov eax, 0
    mov ax, theInt
    jmp over
isfourbyte:
    mov eax, theInt
    jmp over
error:
    mov edx, offset errorMessage
    call WriteString
    call crlf
over:
    call writeInt
ENDM

MAIN PROC
mWriteInt oneByte   ;<----ERROR HAPPENS HERE
call dumpregs
MAIN ENDP
END MAIN

сообщение об ошибке показывает: операнды инструкции A2022 должны быть одинакового размера Операнды инструкции A2022 должны быть одинакового размера

1 Ответ

1 голос
/ 21 октября 2019

Ваш текущий подход к проверке размера во время выполнения требует, чтобы ассемблер сгенерировал машинный код для всех возможных путей кода, даже тех, которые могут не быть приняты во время выполнения.

Если один или несколько из этих путей кода приводятв недопустимых комбинациях операндов, очевидно, что это не удастся.

Вам придется переместить проверку размера, чтобы она выполнялась во время компиляции. Что-то вроде:

IF SIZEOF theInt EQ SIZEOF BYTE
    mov eax, 0
    mov al, theInt
ELSEIF SIZEOF theInt EQ SIZEOF WORD
.. etc ..
ENDIF
call writeInt

Если вы согласны с расширением знака аргумента вместо расширения нуля, вы, вероятно, можете упростить все это до:

push theInt
pop eax
call writeInt

Редактировать: Этот подход не будет работать для аргумента r/m8.

...