在汇编语言中使用宏制作一行时出现错误 A2149

Error A2149 while making a line using macros in assembly language

我有一个制作数字时钟的作业,它需要打印从 0 到 9 的数字,类似于七段显示器上的数字。到目前为止,我已经制作了没有宏的数字。现在,我尝试使用 one 制作水平线,但出现以下错误。

代码如下:

Include irvine32.inc

draw_row macro row_start, row_end, col_ 
movzx al, row_start
mov bl, col_
mov ecx, row_end

L1:
mov  dl,al  ;column
mov  dh,bl  ;row
call Gotoxy
mov edx, offset string1
call writestring

inc al
loop L1
endm

;draw_column macro _row, _col 

;endm 

.data
temp_col1 byte ?
temp_col2 byte ?
temp_row1 byte ?
temp_row2 byte ?


string1 byte "_" , 0
string2 byte "|" , 0
.code
main proc

mov temp_row1, 0
mov temp_row2, 5
mov temp_col1, 0
draw_row temp_row1, temp_row2 , temp_col1

call crlf

call dumpregs

;call clrscr

exit
main endp
end main          ;end program`

这段代码应该打印 ----- 请帮忙解决错误。 我是宏的新手。

你应该阅读 error documentation 上面写着

A byte register was specified to an instruction that cannot take it as the first operand.

这里指的是movzx al, row_start。您不能零扩展到字节寄存器。你只想要 mov 那里。

另一个错误是相反的,您使用了 mov ecx, row_end,其中 row_end 是一个字节,因此您确实需要一个 movzx

PS:其中 None 与宏有关,事实上我看不出有任何理由将其编码为宏。