因为我试过我的,它不工作。它将立即结束它。
mov ah,00 mov al,02 int 10h int 21h mov ah,02h mov bh,00 mov dx, 0000h int 10h ret
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指令。
AH
ret
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调用用于暂停程序,以便在输出再次消失之前看到它。
1条答案
按热度按时间ukqbszuj1#
分析你写的东西
在 ERROR 1 中,您有一个对DOS API的杂散调用。因为您没有在
AH
寄存器中指定所需的函数编号,所以该寄存器仍然保存上面代码中的编号00h。现在,DOS函数00h恰好是一个终止程序的函数。其余的代码甚至没有机会运行...在 ERROR 2 中,您正在使用
ret
指令来结束程序。只要堆栈未被篡改,它就可以在.COM程序中工作。但是,要获得这样的程序,您需要在第一行编写ORG 256
指令。怎么办
您可以通过设置视频模式来清除屏幕(就像您所做的那样),但您应该意识到光标已经被放置在屏幕的左上角,因此再次将其设置在那里是无用的。
如果需要将光标移动到同一行的开头,则应输出字节13进行回车。如果需要将光标向下移动一行,但仍停留在同一列,则应输出字节10作为换行符。一般来说,要执行一个换行符,需要连续输出两个字节。
如果你想输出一些文本,最简单的方法是使用DOS.PrintString函数09h。
BIOS.WaitKeyboardKey调用用于暂停程序,以便在输出再次消失之前看到它。