assembly - 如何使8086清屏然后将光标移动到换行符打印出下一个函数

标签 assembly x86-16 emu8086 cursor-position

因为我尝试了我的,但它不起作用。它会立即结束。

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

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

最佳答案

分析你所写的内容

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 调用用于暂停程序,以便您可以在输出再次消失之前看到输出。

关于assembly - 如何使8086清屏然后将光标移动到换行符打印出下一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69190689/

相关文章:

c - 在ARM中添加数组指针

assembly - 如何使用 TEST 指令来查看是否设置了两个位?

delphi - 为什么某些汇编指令没有记录在案

pointers - 在汇编(emu8086)中进行内存寻址时,bp和si有什么不同?

assembly - EMU8086 将 32 位数字除以 16 位数字给出意外的 0 余数

assembly - 在汇编 8086 中输出数字的 ASCII 字符

c# - 为 .Net 平台编写汇编代码

汇编语言随机数生成器

assembly - 提供一个使用 Rust 的内联汇编查询 Intel CPU 能力的例子

assembly - 8086/8088 上的有效地址计算时间