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
相关产品推荐
相关产品推荐

