当我尝试在程序集 8086 中以文本模式溢出行大小时,它会在正确的位置溢出大部分文本,除了最后 3 个字符
when I try to overflow the line size in text mode in assembly 8086 it overflows most of the text in the right place except for the last 3-chars
.Model small
.stack 64
.data
mesg db "What is your name? ",'$'
.code
Main PROC far
mov ax,@data
mov ds,ax
; clear the screen
mov ax,0600h
mov cx,0
mov dx,184FH
int 10h
; change to text mode
mov ax,3
int 10h
; place cursor on row=15 col=20
mov ah,2
mov dx,1521
int 10h
; Prompt Mesg into the screen
mov ah,09
mov dx,offset mesg
int 21h
Main ENDP
end Main
您的代码正在调用 C 用户所说的“未定义行为”。似乎您不小心忘记了常量中的 h
,现在您很好奇为什么您的程序会这样运行。正如您在评论中计算的那样,您告诉 BIOS 将光标放在第 241 列。使用 PC(模拟器)中的视频 BIOS,这按预期工作,直到第 255 列,即 15 个字符。当 BIOS 将游标列从 255 递增到 0 时,它会注意到进位并应用紧急修复:它注入一个换行符(因为它在 80 字符模式下将游标列从 79 递增到 80 时也会注入一个换行符) .这使得光标从第 5 行第 256 列跳到第 6 行第 0 列。
您应该知道,使用 DOS 功能打印字符串会为每个字符调用控制台输出驱动程序 (INT 29),并且控制台输出驱动程序将每个字符单独转发到 BIOS“打印 TTY 字符”服务 ( INT 10,AH=0E)。每个字符打印需要加载当前光标位置,打印单个字符并更新光标位置。光标位置是打印字符之间唯一保持的状态。这就是为什么字符串不只是逐个字符地打印到无效光标位置指示的屏幕位置,而是在打印几个字符后跳转到完全不同(但现在有效描述)的位置。
.Model small
.stack 64
.data
mesg db "What is your name? ",'$'
.code
Main PROC far
mov ax,@data
mov ds,ax
; clear the screen
mov ax,0600h
mov cx,0
mov dx,184FH
int 10h
; change to text mode
mov ax,3
int 10h
; place cursor on row=15 col=20
mov ah,2
mov dx,1521
int 10h
; Prompt Mesg into the screen
mov ah,09
mov dx,offset mesg
int 21h
Main ENDP
end Main
您的代码正在调用 C 用户所说的“未定义行为”。似乎您不小心忘记了常量中的 h
,现在您很好奇为什么您的程序会这样运行。正如您在评论中计算的那样,您告诉 BIOS 将光标放在第 241 列。使用 PC(模拟器)中的视频 BIOS,这按预期工作,直到第 255 列,即 15 个字符。当 BIOS 将游标列从 255 递增到 0 时,它会注意到进位并应用紧急修复:它注入一个换行符(因为它在 80 字符模式下将游标列从 79 递增到 80 时也会注入一个换行符) .这使得光标从第 5 行第 256 列跳到第 6 行第 0 列。
您应该知道,使用 DOS 功能打印字符串会为每个字符调用控制台输出驱动程序 (INT 29),并且控制台输出驱动程序将每个字符单独转发到 BIOS“打印 TTY 字符”服务 ( INT 10,AH=0E)。每个字符打印需要加载当前光标位置,打印单个字符并更新光标位置。光标位置是打印字符之间唯一保持的状态。这就是为什么字符串不只是逐个字符地打印到无效光标位置指示的屏幕位置,而是在打印几个字符后跳转到完全不同(但现在有效描述)的位置。