我可以在TASM中将al推到堆栈上吗?

时间:2018-01-30 17:30:48

标签: assembly dos x86-16 tasm

我是大会的初学者,任何帮助都将不胜感激。这是我的代码:

.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的内容推到堆栈上吗?我正在尝试创建一个代码,我提示用户输入一个字符并将该字符返回给调用它的程序。

2 个答案:

答案 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行有非法大小。

pushpop都不接受字节大小的操作数。该架构根本不允许它。

要推送字节大小的寄存器(如AL)的内容,只需按下相应的字大小寄存器(AX)。
稍后当您pop这个单词大小的数据时,您只需忽略不包含有用值的部分。这可能需要您仔细选择要注册的寄存器!