应该使用哪个寄存器来存储计数?

时间:2012-05-02 07:59:17

标签: assembly x86-16

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

目的:

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

代码:

.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

在上面的代码中,我已经标记了我感觉我没有剩余寄存器可以使用的区域。我必须在代码中使用AXALDXDL个寄存器。我可以使用哪个其他寄存器来存储计数?请帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

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

AXAHAX的8个最高有效位,ALAX的8个最低有效位。
BXBHBX的8个MSB,BLBX的8个LSB) CXCHCX的8个MSB,CLCX的8个LSB) DXDHDX的8个MSB,DLDX的8个LSB) BP(个别一半不能直接进入)
SI(个别一半不能直接进入)
DI(个别一半不能直接访问)

顺便说一句,您必须在AH之前将int 21H设置为1,从键盘中将字符读入AL

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

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

还有一些问题:

  • 您的筹码量太小,无法进行中断。最高可达4 KB。如果不这样做,它们将覆盖程序或其他地方的某些代码或数据。你不希望这样。
  • 由于这是一个.EXE程序(而不是.COM),因此必须将DS设置为指向数据段。请参阅您的书籍或说明或汇编程序文档,了解如何执行此操作。 ES应该设置为相同的值。