assembly 如何使一个8086清晰的屏幕,然后移动光标到一个换行符打印出下一个功能

1zmg4dgp  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(207)

因为我试过我的,它不工作。它将立即结束它。

mov ah,00
  mov al,02
  int 10h
  int 21h

  mov ah,02h
  mov bh,00
  mov dx, 0000h
  int 10h
  ret
ukqbszuj

ukqbszuj1#

分析你写的东西

mov ah,00     \
mov al,02     | These select the 80x25 video mode
int 10h       /
int 21h       <<<<<< ERROR 1
mov ah,02h    \
mov bh,00     | These place the cursor in the upper-left corner
mov dx, 0000h |
int 10h       /
ret           <<<<<< ERROR 2

ERROR 1 中,您有一个对DOS API的杂散调用。因为您没有在AH寄存器中指定所需的函数编号,所以该寄存器仍然保存上面代码中的编号00h。现在,DOS函数00h恰好是一个终止程序的函数。其余的代码甚至没有机会运行...
ERROR 2 中,您正在使用ret指令来结束程序。只要堆栈未被篡改,它就可以在.COM程序中工作。但是,要获得这样的程序,您需要在第一行编写ORG 256指令。

怎么办

您可以通过设置视频模式来清除屏幕(就像您所做的那样),但您应该意识到光标已经被放置在屏幕的左上角,因此再次将其设置在那里是无用的。
如果需要将光标移动到同一行的开头,则应输出字节13进行回车。如果需要将光标向下移动一行,但仍停留在同一列,则应输出字节10作为换行符。一般来说,要执行一个换行符,需要连续输出两个字节。
如果你想输出一些文本,最简单的方法是使用DOS.PrintString函数09h。

ORG  256

mov  ax, 0003h       ; BIOS.SetVideoMode 80x25
int  10h

mov  dx, offset Msg
mov  ah, 09h         ; DOS.PrintString
int  21h

mov  ah, 00h         ; BIOS.WaitKeyboardKey
int  16h             ; -> AX

ret                  ; Terminate .COM program

Msg  db  10, 'Welcome', 13, 10, 10, 'sherley', 13, 10

BIOS.WaitKeyboardKey调用用于暂停程序,以便在输出再次消失之前看到它。

相关问题