如何在汇编中引用其他模块声明的AT类型段?
跨文件引用AT段的解决方案
你遇到的问题核心是汇编器无法识别其他文件中定义的memmap段,需要像处理外部变量一样,显式声明该段的外部属性,同时确保定义段的文件将段名公开给链接器。
步骤1:确保AT段在定义文件中公开
你的memmap段已经使用public关键字声明,这部分是正确的——它会让链接器把这个段名暴露给其他模块:
; 定义AT段的文件(比如memdefs.asm) memmap segment public at 0000h org 13h * 4 orig_int_13h dw ? ; BIOS中断13h的原向量地址 org 0B800h text_mode_base_addr dw ? ; 文本模式显存基址的占位符 memmap ends
步骤2:在引用模块中声明外部段
在需要访问该段的文件里,你需要用extrn指令声明整个段,语法为extrn <段名>:seg,明确告诉汇编器这个段是在其他模块中定义的:
; 引用AT段的文件 ; 声明外部段:告知汇编器memmap是一个外部定义的段标识符 extrn memmap:seg otherseG segment para public 'code' test_proc proc ; 直接用段名获取AT段的固定段地址,不要用offset! mov ax, memmap mov es, ax ; 此时es=0000h,es:[text_mode_base_addr]将指向0B800h(文本模式显存基址) mov bx, es:[text_mode_base_addr] test_proc endp otherseG ends end
关键注意事项
- 不要使用
offset memmap:offset用于获取段内变量的偏移量,而AT段的段地址是由at关键字指定的固定值(此处为0000h),直接使用段名即可得到该段地址。 - 链接时包含所有目标文件:编译两个文件后,链接命令需要包含所有相关目标文件,例如:
link yourcode.obj+memdefs.obj - 段的
public属性不可省略:定义段时的public关键字是让链接器暴露段名的必要条件,否则其他模块无法识别该段。
与外部变量引用的区别
之前你用public/extrn处理变量时,声明的是变量的类型;而段的外部引用需要声明为:seg类型,明确告诉汇编器这是一个段标识符,而非普通变量。
内容的提问来源于stack exchange,提问作者Trap
相关产品推荐
相关产品推荐

