为何汇编器在数据段与代码段之间跳过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
相关产品推荐
相关产品推荐

