【问题标题】:INT 10H function 06H moves the cursorINT 10H 功能 06H 移动光标
【发布时间】:2020-01-18 02:36:11
【问题描述】:

我在(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 宏似乎正在移动光标,因为屏幕上打印的最终文本不是从角落开始的。

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

【问题讨论】:

  • int 10h function 06h 只是“向上滚动窗口”,因此您还需要将光标位置重置为第一列。
  • @lurker 默认情况下它已经设置为第一列。在这里它向前推进,我的问题是为什么
  • "默认设置为第一列" - 是什么让你这么认为?我看到你打印 Ahmed,但你没有做 cr/lf 后记。这不是意味着您位于第 6 列吗?

标签: assembly x86-16 emu8086


【解决方案1】:

clearScr 宏似乎正在移动光标

恰恰相反:

clearScr移动光标,但您希望它移动。

会发生以下情况:

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

如果你想清屏将光标移动到角落,你必须做两个步骤:

  • 清屏(这将不会将光标移动到角落)
  • 将光标移动到角落(例如int 10h函数AH=2

我看到你打印 Ahmed,但你没有做 cr/lf 后记。

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

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

【讨论】:

  • "打印 CR/LF 会导致在第二行打印文本" - 嗯?如果您打印“Ahmed”,那么您的光标位置是 6。如果您打印“Ahmed\r\n”,那么您的光标位置是 1。如果您的光标位置是 6,并且您向上滚动屏幕(这就是 @987654331 @ 确实),那么您的光标位置仍然是 6。如果您的光标位置是 1 并且您滚动,那么您的光标位置仍然是 1。
  • @DavidWohlferd 您打印“Ahmed”,光标位置为 (column,row)=(6,1)。您打印“\r\n”,光标位置为 (1,2)。据我了解,ah=6 并没有改变光标位置,所以光标位置还是(1,2)。但角是 (1,1)。
  • 我现在明白了,非常清楚非常感谢:+1:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2015-07-23
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多