assembly 如何在装配中从提示符的右侧移动到左侧?

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

我有一个程序,它要求用户输入一个字符,将该字符移动到屏幕的最右侧,然后我需要把它移回左边,我知道怎么移到右边,但是我不知道怎么把它移回左边。目前,当试图把它带到左边时,它会打印字符中的整行,而不是将其遍历回屏幕的左侧。

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

main            proc
                _Begin
                _PutStr prompt
                _GetCh
                mov userCh, al
                _PutCh 13, 10
                
                mov cx,79
for_1:          _PutCh userCh      ;;print left to right
                call delay
                _PutCh 8,32
                dec cx
                jnz for_1
for_3:                      ;; print right to left
                _PutCh 8
                _PutCh userCh
                call delay
                _PutCh 8
                inc cx
                cmp cx, 79
                jne for_3
                

                _Exit 0
main            endp
                end main
ocebsuys

ocebsuys1#

您的尝试已接近所需!
使用您的宏并使用@ecm在她的第二个评论中给您的建议,我们得到:

mov cx, 79
L2R:    _PutCh userCh
        call delay
        _PutCh 8, 32
        dec  cx
        jnz  L2R

        mov  cx, 79
R2L:    _PutCh 8, userCh
        call delay
        _PutCh 8, 32, 8
        dec  cx
        jnz  R2L

现在看起来是骗人的。对于 _PuctCh 宏的每个参数,宏的扩展将在程序中插入几行代码(mov dl, ?mov ah, 02hint 21h)。
下一个替代解决方案是使用BIOS在输出字符之前定位光标,BIOS字符输出函数不会自动推进光标。因为光标不是由该函数推进的,所以您可以使用所有80个位置,而不是之前的前79个位置。
代码做的第一件事是确定游标所在的行。该行(在DH中)在整个循环中保持不变。

mov  bh, 0        ; CONST DisplayPage
        mov  ah, 03h      ; BIOS.GetCursorConfiguration
        int  10h          ; -> CX DX
        mov  cx, 1        ; CONST ReplicationCount

        mov  dl, 0        ; DH is CONST
L2R:    call tempChar
        inc  dl
        cmp  dl, 80
        jb   L2R

        mov  dl, 79       ; DH is CONST
R2L:    call tempChar
        dec  dl
        jns  R2L

        ...

; ------------------------
; IN (dl) OUT () MOD (ax)
tempChar:                 ; BH (page), CX (count), and DH (row) are CONST
        mov  ah, 02h      ; BIOS.SetCursorPosition
        int  10h
        mov  al, userCh
        mov  ah, 0Ah      ; BIOS.WriteCharacter
        int  10h
        call delay
        mov  ax, 0A20h    ; BIOS.WriteCharacter
        int  10h
        ret

另一种版本更短,更适合您的需要。

相关问题