因为我尝试了我的,但它不起作用。它会立即结束。
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/