Assembly 在汇编8086中,当我试图在文本模式下溢出行大小时,除了最后3个字符外,它在正确的位置溢出了大部分文本
您的代码正在调用C用户所谓的“未定义行为”。似乎您不小心忘记了常量中的Assembly 在汇编8086中,当我试图在文本模式下溢出行大小时,除了最后3个字符外,它在正确的位置溢出了大部分文本,assembly,x86-16,masm,tasm,cursor-position,Assembly,X86 16,Masm,Tasm,Cursor Position,您的代码正在调用C用户所谓的“未定义行为”。似乎您不小心忘记了常量中的h,现在您很好奇为什么程序会这样运行。当您在注释中计算自己时,您告诉BIOS将光标放在第241列中。在PC(仿真器)中使用视频BIOS时,这项功能在第255列(即15个字符)之前都能正常工作。当BIOS将光标列从255增加到0时,它会注意到进位并应用紧急修正:它会注入一个换行符(因为在80个字符模式下,当它将光标列从79增加到80时,它也会注入一个换行符)。这使光标从第5行第256列跳到第6行第0列 您应该知道,使用DOS函数
h
,现在您很好奇为什么程序会这样运行。当您在注释中计算自己时,您告诉BIOS将光标放在第241列中。在PC(仿真器)中使用视频BIOS时,这项功能在第255列(即15个字符)之前都能正常工作。当BIOS将光标列从255增加到0时,它会注意到进位并应用紧急修正:它会注入一个换行符(因为在80个字符模式下,当它将光标列从79增加到80时,它也会注入一个换行符)。这使光标从第5行第256列跳到第6行第0列
您应该知道,使用DOS函数打印字符串会为每个字符调用控制台输出驱动程序(INT 29),控制台输出驱动程序会将每个字符分别转发给BIOS“print TTY character”服务(INT 10,AH=0E)。每个字符打印都需要加载当前光标位置,打印单个字符并更新光标位置。光标位置是打印字符之间保持的唯一状态。这就是为什么字符串不只是一个字符一个字符地打印到无效光标位置指示的屏幕位置,而是在打印两个字符后跳转到一个完全不同的(但现在描述有效)位置。
mov dx,1521
是一个十进制数,而不是十六进制数。那应该是mov dx,1521h
的DH=0x15和DL=0x21吗?或者mov-dx,0F15h
具有DH=15和DL=21(十进制)?IDK如果这完全解释了你所看到的奇怪,也许我是匆忙地把它作为一个副本关闭。如果修复它不能解决问题,我们可以重新打开。但是现在没有必要让更多的人在这种状态下看它,我想。我知道问题所在…我是故意这么做的,我只是不明白为什么它会像其他行一样溢出“我”?…因为mov dx,1521表示第5行,241列表示5*80+241=641,所以,这意味着row=641/80=8和col=641%80=1,这对大多数消息都是正确的,但对最后3个字符的“me”不正确。代码中的注释是“row=15 col=20”,因此代码或注释都是错误的。很明显,问题出在评论上;我猜你从1521h
中删除了h
之类的内容,忘了更新注释。但是是的,1521
是0x05f1
。我建议您以一种不会让常量看起来像bug的方式编写常量,并更新注释以匹配它。
.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