汇编里的IMPORT和EXPORT

本文介绍了在汇编和C语言混合编程中,如何使用IMPORT和EXPORT指令。IMPORT用于声明外部变量,而EXPORT则用于使内部变量可供其他模块调用。通过示例代码,解释了如何在ADS环境下调整程序入口点,并探讨了文字池(literal pool)的概念,它是编译器处理32位立即数的一种机制,避免超过ARM指令长度限制的问题。对于超过4KB的代码,可以使用LTORG指令确保文字池位于有效范围内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的
EXPORT ,表示本程序里面用到的变量提供给其他模块调用的。
以上两个在汇编和C语言混合编程的时候用到
刚看到一篇不错的BLOG,解说C和汇编混编的,虽然貌似是翻译ADS文档的,不过写的挺不错,通俗容易懂,可以看看
其实汇编调用C貌似很简单
B Main 就完了,直接跳过去,那传递参数怎么办?根据《嵌入式系统 Boot Loader 技术内幕》里面说的用弹簧床什么的来结局,不过暂时理解不了。
用ADS的一个项目中同时放汇编的S文件和C语言文件的话,那么整个连接出来,程序默认从C语言的main函数那里作为入口,刚才试了一下,发现解决办法。方法是,先将汇编的入口标签EXPORT出来,
      AREA adrlabel, CODE, READONL
      IMPORT Main
      EXPORT Start     
      ENTRY                      
Start
    &nbs

<think>好的,用户的问题是关于汇编语言中import关键字的作用定义。首先,我需要回忆一下汇编语言的基础知识,尤其是关于模块外部符号引用的部分。汇编语言不像高级语言那样有明确的模块系统,但不同的汇编器可能有不同的语法来处理外部符号。 接下来,考虑到用户提到的import,这可能与某些特定的汇编器或架构相关。比如,在ARM汇编或者某些嵌入式系统的汇编器中,importexport这样的伪指令用于声明外部符号。例如,在ARM的汇编器(如ARMCC或GNU汇编器)中,.global或.globl用于声明全局符号,而.import或.extern可能用于引用外部符号。 需要确认不同汇编器中的具体用法。例如,在GNU汇编器(GAS)中,通常使用.extern来声明外部符号,而其他汇编器如NASM可能使用不同的语法。但用户提到的是import关键字,这可能在特定的汇编器环境中,比如ARM汇编,使用.import伪指令来声明一个外部符号,告诉链接器该符号在其他模块中定义。 此外,用户提供的参考引用中有提到C语言汇编的交互,比如通过extern关键字关联全局变量,这可能与汇编中的import有关联。例如,在汇编中声明一个外部函数或变量,以便在链接时解析。 需要注意区分不同的汇编器语法,避免混淆。比如,Microsoft的MASM使用EXTERN关键字,而GNU汇编器使用.extern。用户提到的import可能是在特定上下文中的伪指令,需要结合具体的汇编器文档来解释。 还需要考虑链接器的作用,import汇编中通常是指导汇编器该符号将在链接时由其他模块提供,因此不需要在当前模块中定义。这有助于模块化开发代码复用。 总结一下,import汇编语言中的作用是声明外部符号,告诉汇编链接器该符号在其他模块中定义,以便正确地进行链接。需要具体根据使用的汇编器来确定语法细节,比如在ARM汇编中使用.import,而在其他环境中可能用.extern或EXTERN。</think>在汇编语言中,`import`关键字(或伪指令)通常用于声明外部符号的引用,告知汇编链接器该符号的定义存在于其他模块中。其作用与C语言中的`extern`声明类似[^1],但具体实现因汇编器而异。以下是详细说明: --- ### 1. **基本作用** - **声明外部符号**:当汇编代码需要访问其他模块(如另一个汇编文件或C语言编译后的目标文件)中定义的函数或变量时,需用`import`声明该符号为外部引用。 - **链接阶段解析**:汇编器在生成目标文件时会标记这些符号为“未定义”,后续由链接器在链接阶段解析具体地址[^5]。 --- ### 2. **语法示例** 以ARM汇编为例: ```assembly ; 声明print_result为外部函数 IMPORT print_result AREA Example, CODE ENTRY start MOV R0, #42 ; 传递参数 BL print_result ; 调用外部函数 END ``` 此处`IMPORT`告诉汇编器:`print_result`函数在另一个模块中定义。 --- ### 3. **与其他关键字的区别** | 关键字 | 作用 | 使用场景 | |------------|-----------------------------------|-----------------------------| | `IMPORT` | 声明外部符号(需其他模块定义) | 跨文件调用函数/访问全局变量 | | `EXPORT` | 导出当前模块符号供外部使用 | 提供接口给其他模块 | | `WEAK` | 弱声明(允许被同名符号覆盖) | 提供默认实现[^5] | --- ### 4. **不同汇编器的差异** - **GNU汇编器(GAS)**:使用`.extern`而非`import`: ```assembly .extern printf ; 声明外部函数printf ``` - **Microsoft MASM**:使用`EXTERN`: ```assembly EXTERN printf:PROC ; 声明外部过程printf ``` --- ### 5. **实际应用场景** - **混合编程**:在C与汇编混合开发时,C代码通过`extern`声明汇编符号,汇编代码通过`IMPORT`声明C函数。 - **库函数调用**:调用标准库或操作系统API时需声明外部符号。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值