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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 07:37:32