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

如何在汇编中引用其他模块声明的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:35:29