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

16位NASM汇编程序VGA填充异常:DI超过32767时无显示

问题分析与解决:16位NASM汇编填充VGA屏幕超出32767像素失效

问题根源

你猜测的有符号比较导致问题完全正确。问题出在fill_screen函数的循环判断指令上:

cmp di, cx
jge .fill_screen_done

jge是有符号数的“大于等于”跳转指令。当di递增到0x8000(即32768)时,作为16位有符号数会被解析为-32768;而总像素数0xfa00(64000)作为有符号数也是负数。此时-32768 >= 负数的判断成立,循环提前终止,甚至因内存索引异常导致已填充像素消失。

解决方法

将有符号比较指令jge替换为无符号数的“大于等于”跳转指令jae——像素索引是无符号数值,不需要考虑正负:

修改后的循环判断部分:

.fill_screen_loop:
    cmp di, cx
    jae .fill_screen_done

优化建议(非必要但更严谨)

VGA模式13h下每个像素仅占1字节,当前mov [es:di], dx会冗余写入dh的内容,可改成直接写入dl:

mov [es:di], dl

修改后的完整fill_screen函数

fill_screen:
    push bp
    mov bp, sp
    
    push es
    push ax
    push dx
    push cx
    push di
    
    mov ax, 0a000h
    mov es, ax
    mov dl, [bp + 6]
    mov cx, [bp + 4]
    mov di, 0
.fill_screen_loop:
    cmp di, cx
    jae .fill_screen_done
    
    mov [es:di], dl  ; 优化为直接写入单字节
    inc di
    
    jmp .fill_screen_loop
.fill_screen_done:
    pop di
    pop cx
    pop dx
    pop ax
    pop es

    pop bp
    ret

现在调用fill_screen时传入0xfa00作为像素数,即可完整填充320×200屏幕:

push 0fh
push 0xfa00h
call fill_screen

内容的提问来源于stack exchange,提问作者ridhomblr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:23:16