You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:36:03