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

为何汇编器在数据段与代码段之间跳过2个内存槽?

关于DOS .EXE程序中数据段与代码段间内存间隔的原因分析

你编写的x86汇编Hello World程序编译为DOS .EXE文件后,数据段中$的地址是0710:000D,之后到代码段之间存在0710:000E、0710:000F两个空内存槽,程序运行正常但想了解间隔原因。

核心原因:DOS .EXE的段对齐机制

这是DOS下.EXE文件的标准加载特性导致的:

  • DOS内存管理以**16字节(称为一个“段落”)**为基本单位,.EXE文件中的每个段(数据段、代码段等)在加载时都会被对齐到段落边界。
  • 你的DATA段实际内容长度:"Hello World"共11个字符,加上换行符(10)、回车符(13)、结束符$,总长度是14字节,对应内存地址0710:0000到0710:000D。
  • 为了满足段对齐要求,汇编器/链接器会自动在DATA段末尾填充2个空字节(对应0710:000E、0710:000F),让整个数据段的长度凑满16字节(1个段落),之后才会加载代码段。
  • 这种填充是.EXE多段结构的必然结果,和.COM文件(无分段,所有内容在同一段)不同,完全符合DOS可执行文件规范,不会影响程序运行。

你的程序代码

TITLE HELLOWORLD
    
DATA SEGMENT
    MSG DB "Hello World",10,13,"$"    
DATA ENDS

CODE SEGMENT
    START:
    MOV AX, DATA
    MOV DS, AX     
    
    LEA DX, MSG
    MOV AH, 9
    INT 21H
    
    MOV AH, 4CH
    INT 21H 
    
CODE ENDS

END START

内存布局参考

[内存截图:显示数据段$位于0710:000D,后续000E、000F地址为空,之后是代码段指令]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:25:23