【问题标题】:Can I push al onto a stack in TASM?我可以将 al 推入 TASM 中的堆栈吗?
【发布时间】:2018-01-30 17:30:48
【问题描述】:

我是组装初学者,如果有任何帮助,我将不胜感激。这是我的代码:

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

【问题讨论】:

  • 推入 16 位寄存器 AX(其中 AL 是低 8 位)。您没有向我们说明为什么要尝试将字节放入堆栈。

标签: assembly dos x86-16 tasm


【解决方案1】:

您不能将AL 推入堆栈,因为堆栈的每个元素都是一个单词,而AL 的大小是一个字节

您可以做的是重置AH 的值并将AX 推入堆栈,因此AL 将包含您想要的值,AH 将只是0,这不会影响@ 中的数据987654327@.

【讨论】:

  • 或者只推axeax,然后当你弹出它时忽略高字节中的垃圾。
【解决方案2】:

您已经询问了这 2 个错误。

第 8 行的操作数类型不匹配

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

mov dl, Textstring

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

mov dx, offset Textstring

操作或指令的参数在第 13 行具有非法大小。

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

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

【讨论】:

    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2010-09-17
    • 2019-05-09
    相关资源
    最近更新 更多