程序集最多输入8个字符到字符串并输出反转字符串

时间:2018-12-20 17:30:30

标签: assembly tasm emu8086

我有一个家庭作业问题,要从用户处获取最多8个字符的新行字符串,并在反面上打印它

我编写了一个代码,该代码应该从字符串中提取所有内容,并将其放入堆栈中,然后再将其带回到字符串中,这样它将处于反转状态并将其打印在新行中。但是当我运行文件时,它只是停留在输入上,并没有让我做某事

我是组装的新手,我们使用tasm1〜1.4。

有我的代码:

handleMessage

1 个答案:

答案 0 :(得分:2)

  

但是当我运行文件时,它只是停留在输入中...

这是因为使用DOS输入功能0Ah时,您需要事先告知DOS输入缓冲区的大小。使用ISTR DB 10 DUP(0)之类的定义,您实际上根本没有请求任何缓冲区!
程序中的正确定义是

ISTR DB 9, 0, 9 DUP(0)

第一个字节指定输入缓冲区的大小。将其放在 DesiredNumberOfCharacters + 1
第二个字节指定缓冲区已包含的字符数。将其放在

您可以在我的How buffered input works的另一篇文章中找到有关此DOS功能的更多信息。

输入有效后,您需要在程序的 TOSTACK 部分修复一些问题:

  • LOOP指令取决于整个CX寄存器,但是您仅填充了CL,它是CX的低字节。只需添加mov ch, 0
    显然,这意味着您还需要复制到BX而不是BL来准备 FROMSTACK 部分。
  • 由于用户可能选择完全不提供任何字符,因此需要为这种情况准备程序。仅jcxz EXIT就足够了。
  • 输入缓冲区中的每个字符都保存在字节中。因此,您的代码不应读取单词

    mov     si, offset ISTR + 1
    mov     cl, [si]     ; Characters read 0, 1, 2, ... 8
    mov     ch, 0
    jcxz    EXIT
    mov     bx, cx       ; Save count
TOSTACK:
    inc     si
    mov     dl, [si]     ; This is a byte
    push    dx           ; Don't care about high byte in DH
    loop    TOSTACK

    ...

    mov     cx, bx       ; Restore count ( is GT 0 )
FROMSTACK:
    pop     dx           ; Still don't care about DH
    mov     ah, 02h
    int     21h
    loop    FROMSTACK
EXIT:
    mov     ax, 4C00h
    int     21h

摆脱LOOP 指令很容易:

    mov     si, offset ISTR + 1
    mov     cl, [si]     ; Characters read 0, 1, 2, ... 8
    mov     ch, 0
    jcxz    EXIT
    mov     bx, cx       ; Save count
TOSTACK:
    inc     si
    mov     dl, [si]     ; This is a byte
    push    dx           ; Don't care about high byte in DH
    dec     cx
    jnz     TOSTACK

    ...

FROMSTACK:
    pop     dx           ; Still don't care about DH
    mov     ah, 02h
    int     21h
    dec     bx
    jnz     FROMSTACK
EXIT:
    mov     ax, 4C00h
    int     21h