8086 NASM汇编:像素位置改为变量后不显示的问题
解决DOSBox中NASM汇编调用INT 10H读取.data段变量画像素黑屏的问题
问题原因
8086架构下,访问内存变量默认依赖DS寄存器作为段基址。你的代码未初始化DS,导致DS指向DOS程序加载时的默认段(程序段前缀PSP),而非自定义的.data段。读取[BALL_X]、[BALL_Y]时拿到的是无效垃圾值,坐标超出360x200可视区域,最终像素无法显示,加上黑色背景就呈现全黑状态。而直接给CX、DX赋值立即数无需访问内存,因此能正常工作。
修复方案
在程序开头添加DS寄存器初始化代码,确保其指向.data段;同时建议添加按键等待和模式恢复代码,避免程序执行后直接返回DOS导致看不到像素:
segment .data BALL_X DW 300 BALL_Y DW 170 segment .text global main main: ; 初始化DS,指向.data段 MOV AX, data MOV DS, AX ; 设置360x200 256色视频模式 MOV AH, 00h MOV AL, 13h INT 10h ; 设置背景为黑色 MOV AH, 0Bh MOV BH, 00h MOV BL, 0h INT 10h ; 绘制白色像素 MOV AH, 0Ch MOV AL, 0Fh ; 白色 MOV BH, 00h MOV CX, word [BALL_X] MOV DX, word [BALL_Y] INT 10h ; 等待按键输入,避免程序直接退出 MOV AH, 00h INT 16h ; 恢复文本模式(可选,提升体验) MOV AH, 00h MOV AL, 03h INT 10h ; 退出程序 MOV AH, 4Ch INT 21h
编译运行命令
使用NASM和LD编译为DOS可执行文件:
nasm -f obj pixel.asm -o pixel.obj ld -o pixel.exe pixel.obj -m dos
在DOSBox中运行pixel.exe即可看到指定位置的白色像素。
内容的提问来源于stack exchange,提问作者haroun AGSOUS
相关产品推荐
相关产品推荐

