assembly 如何让用户输入一个字符,然后在ASM中在屏幕上移动该字符?

eagi6jfj  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(145)

我目前有一个程序,它可以在屏幕上移动用户输入的数字,但我需要它是用户输入的字符。我如何将此程序转换为用户输入的字符呢?我已经尝试使用_GetCh_PutCh,但没有成功。我正在使用DOSBox作为此ASM程序。

include PCMAC.INC
                .model small
                .586
                .stack 100h
                .data
prompt          DB "Please enter a character is be printed: $" 
theChar         DW ?
            
                .code
                extrn GetDec:near
                extrn PutDec:near
                
delay           proc
                push cx ;;save the caller's CX register
                mov ecx,100000
for_2:          nop
                dec ecx
                jnz for_2
                pop cx ;; restore caller's CX
                ret
delay           endp

main            proc
                _Begin
                _PutStr prompt
                call GetDec
                mov theChar, ax
                
                mov cx,80
                
for_1:
                mov ax, theChar
                call PutDec
                call delay
                _PutCh 8,32
                dec cx
                jnz for_1

                _Exit 0
main            endp
                end main

我试着将我的GetDec/PutDec更改为 CharCh,但没有成功。它无法打印任何内容。

xfyts7mz

xfyts7mz1#

我不知道PCMAC.INC里有什么,但是对于DOSBox你应该可以通过编号来使用DOS函数:
使用函数01h从用户处获取字符

mov  ah, 01h  ; DOS.GetCharacter
int  21h      ; -> AL

要在屏幕上放置字符,请使用函数02h

mov  dl, bl
mov  ah, 02h  ; DOS.DisplayCharacter
int  21h

你不需要从内存中的变量存储和加载字符,你可以把它保存在BL寄存器中:

_PutStr prompt
    mov  ah, 01h  ; DOS.GetCharacter
    int  21h      ; -> AL
    mov  bl, al   ; `mov theChar, al`

    mov  ah, 02h  ; DOS.DisplayCharacter
    mov  dl, 13   ; Carriage return
    int  21h
    mov  dl, 10   ; Linefeed
    int  21h

    mov  cx, 79
for_1:
    mov  dl, bl   ; `mov  dl, theChar`
    int  21h
    call delay
    mov  dl, 8    ; Backspace
    int  21h
    mov  dl, " "
    int  21h
    dec  cx
    jnz  for_1

相关问题