我在(emu8086)上运行以下汇编代码:

clearScr macro
         mov ah, 06h
         mov al, 00h
         mov bh, 71h
         mov cx, 0000h
         mov dx, 184fh
         int 10h
clearScr endm

print macro string
    mov ah, 09h
    lea dx, string
    int 21h
print endm

.model small
.stack 100h

.data
    msg    db 'Hello, world!', '$'
    nl     db 0AH, 0DH, '$'
    myname db 'Ahmed', '$'

.code
    main    proc
        mov ax, @data
        mov ds, ax

        print myname
        clearScr
        print msg

        mov ax, 4c00h
        int 21h
    main    endp

并且clearScr宏似乎正在移动光标,因为打印在屏幕上的最终文本不是从角落开始的。 assembly - INT 10H功能06H移动光标-LMLPHP

为什么会这样呢?我不是要设置/移动光标。

最佳答案

并且clearScr宏似乎正在移动光标

恰恰相反:
clearScr而不是用于移动光标,但您希望它被移动。

发生了以下情况:

  • print myname将移动光标;光标将不再位于左上角,而是位于名称的末尾。
  • 如果我理解正确,clearScr将清除屏幕,但是不会清除来更改光标位置;这意味着光标将保留在之后的位置,
  • print myname在打印消息之前也不会更改光标位置,因此消息将被打印到print msg
  • 之后光标所在的位置

    如果要清除屏幕以将光标移到角落,则必须执行两个步骤:
  • 清除屏幕(这将而不是将光标移到角落)
  • 将光标移到角落(例如,使用print myname函数int 10h)

  • 我看到您打印了AH=2,但是您没有做cr / lf后记。

    如果我理解正确,在清除屏幕后,打印CR / LF会使文本打印在第二行。

    仅打印CR会将光标移动到左上角(如果光标已在顶行中)。

    07-24 09:45
    查看更多