我可以将 al 推入 TASM 中的堆栈吗?

Can I push al onto a stack in 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 的内容压入堆栈吗?我正在尝试制作一个代码,提示用户输入一个字符,然后 return 该字符返回给调用它的程序。

您不能将 AL 压入堆栈,因为堆栈的每个元素都是一个 word 并且 AL 的大小是一个 字节

您可以做的是重置 AH 的值并将 AX 压入堆栈,这样 AL 就会包含您想要的值,而 AH 只会为 0 不会影响 AL.

中的数据

您问过这 2 个错误。

operand types do not match on line 8

当你写mov dx, Textstring时,TASM 将要对从内存中读取一个字节的操作进行编码。它是 byte 因为您使用 db 指令定义了 Textstring。如果你写

错误就不会存在
mov dl, Textstring

如果您想获得指向 Textstring 中文本的指针,那么您应该改写

mov dx, offset Textstring

argument to operation or instruction has illegal size on line 13.

pushpop 都不接受字节大小的操作数。该体系结构根本不允许这样做。

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