使用ah、09h在屏幕打印句子无显示的汇编开发问题求助
问题原因
DS段未正确配置:int 21h 09h功能依赖DS:DX定位待输出的$结尾字符串,若调用GAMEOVER时DS没有指向message所在的数据段,会读取到无效内存内容,无法输出正确文本。- 清屏后未重置光标位置:自定义的
cleanscreen仅清空了显存内容,但没有更新BIOS维护的光标坐标,int 21h 09h会从当前光标位置开始输出,若光标此时位于屏幕可视区域外,内容就无法显示。 cleanscreen的段地址配置错误:该过程通过ES段访问文本显存,调用前需要将ES设置为文本模式显存段地址0B800h,否则清屏操作不会作用到实际显示区域,也可能间接影响后续输出。
修复代码示例
message db 'game over, to play again press y$' PROC GAMEOVER push dx push ax push bx call cleanscreen ; 新增:设置光标到屏幕左上角(0,0) mov ah, 02h mov bh, 0 ; 显示页号,默认使用0页 mov dh, 0 ; 目标行号 mov dl, 0 ; 目标列号 int 10h ; 新增:确保DS指向message所在的数据段,DATA替换为你实际的数据段标号 mov ax, DATA mov ds, ax mov dx, offset message mov ah,9h int 21h mov ah,0 int 16h cmp al, 'y' jne line CALL STARTGAME line: pop bx pop ax pop dx RET ENDP GAMEOVER proc cleanscreen ; 调用前需确保ES已设置为0B800h push cx push bx mov cx,4000d mov bx,0 clean: mov [byte ptr es:bx],0 inc bx loop clean pop bx pop cx ret endp cleanscreen
补充说明
如果修改后还是无法正常显示,可以直接改用直接写显存的方式输出字符串,绕过int 21h的段和光标依赖,输出时同时指定字符和显示属性即可。
内容的提问来源于stack exchange,提问作者user17341742
相关产品推荐
相关产品推荐

