-2

我正在为以下程序编写代码,

客观的:

计算用户按下的空格数。如果按下 enter 则中断。

代码:

.MODEL SMALL
.STACK 100H
.DATA
    TEXT DB "Enter Character"
.CODE
    MOV AX,9
    MOV DX,TEXT
    INT 21H
    BACK:
        INT21H
        CMP AL, " "
        JE INCREMENT
        CMP AL, "\n"
        JE OUT
        JMP BACK
INCREMENT:
        INC ; which register do I use here? I feel that I am out of registers
        LOOP BACK
OUT:
;display the count

在上面的代码中,我标记了我感觉没有任何寄存器可供使用的区域。我必须在代码中使用AX, AL, DX,DL寄存器。我可以使用哪个其他寄存器来存储计数?请帮忙,谢谢。

4

1 回答 1

2

您可以使用以下通用寄存器:

AXAH是 8 个最高有效位AXAL是 8 个最低有效位AX
BXBH是 8 个 MSB BXBL是 8 个 LSB BX
CXCH是 8 个 MSB CXCL是 8 个 LSB CX
DXDH是 8 个 MSB DXDL是 8 个 LSB DX
BP(个人半不可直接访问)
SI(个别半不可直接访问)
DI(个别半不可直接访问)

顺便说一句,在从键盘读取字符之前,您必须设置AH为 1 。int 21HAL

如果您想使用int 21H函数 9 打印它,您的文本字符串必须以美元符号结尾。

此外,Enter 的代码是 13 ('\r'),而不是 10 ('\n')。

还有几个问题:

  • 您的堆栈太小而无法中断。将其增加到 4 KB。如果你不这样做,他们会覆盖你程序或其他地方的一些代码或数据。你不想要那个。
  • 由于这是一个 .EXE 程序(而不是 .COM),您必须设置DS为指向数据段。有关如何执行此操作的信息,请参阅您的书或注释或汇编器文档。ES可能应该设置为相同的值。
于 2012-05-02T08:57:07.533 回答