我是大会的初学者,任何帮助都将不胜感激。这是我的代码:
.MODEL SMALL
.DATA
Textstring db "I'm a string$"
.CODE
START:
mov dx, Textstring
push dx
getche:
mov ah, 06h
int 21h
push al
END START
我一直在第8行得到操作数类型不匹配的错误,操作或指令的参数在第13行上有非法大小。
我猜测问题是我试图将AL
推入堆栈。无论如何我可以把AL
的内容推到堆栈上吗?我正在尝试创建一个代码,我提示用户输入一个字符并将该字符返回给调用它的程序。
答案 0 :(得分:5)
你不能将AL
推入堆栈,因为堆栈的每个元素都是字,而AL
的大小是字节。
您可以执行的操作,重置AH
的值并将AX
推送到堆栈中,以便AL
包含您想要的值,AH
将只是0,不会影响AL
中的数据。
答案 1 :(得分:1)
操作数类型在第8行上不匹配
当你写mov dx, Textstring
时,TASM会想要编码从内存中读取一个字节的操作。它是字节,因为您使用db
指令定义了Textstring。如果你写了
mov dl, Textstring
如果你想获得一个指向Textstring中文本的指针,那么你应该改为编写
mov dx, offset Textstring
操作或指令的参数在第13行有非法大小。
push
和pop
都不接受字节大小的操作数。该架构根本不允许它。
要推送字节大小的寄存器(如AL
)的内容,只需按下相应的字大小寄存器(AX
)。
稍后当您pop
这个单词大小的数据时,您只需忽略不包含有用值的部分。这可能需要您仔细选择要注册的寄存器!