arm gnu 汇编器中的 IMPORT 替代品是啥?

Posted

技术标签:

【中文标题】arm gnu 汇编器中的 IMPORT 替代品是啥?【英文标题】:what is IMPORT alternative in arm gnu assembler?arm gnu 汇编器中的 IMPORT 替代品是什么? 【发布时间】:2017-08-25 07:30:32 【问题描述】:

我正在阅读学习 ARM 和 ARM 汇编的书。书中的示例基于 armcc 编译器,但我使用的是 arm-none-eabi-gcc。那么如何将这种和平的代码更改为 gnu 汇编器呢??

IMPORT |Lib$$Request$$armlib|,WEAK. 

整个例子是:

    AREA |.text|, CODE , READONLY
    EXPORT main
    IMPORT |Lib$$Request$$armlib|,WEAK
    IMPORT __main ;C library entry
    IMPORT printf ; prints to stdout
i   RN 4
    ;int main(void)
main
    STMFD sp!,i,lr
    MOV i,#0
loop
   ADR r0, print_string
   MOV r1,i
   MUL r2,i,i
   BL printf
   ADD i,i,#1
   CMP i,#10
   BLT loop
   LDMFD sp!,i,pc
print_string
   DCB "Square of %d is %d\n",0
   END

所以我把它转换成

 .section .text
    .weak Lib$$Request$$armlib
    .global main
    i .req r4
main:
    STMFD sp!,i,lr
    MOV i,#0
loop:
    ADR r0,print_string
    MOV r1,i
    MUL r2,i,i
    BL printf
    ADD i,i,#1
    CMP i,#10
    BLT loop
    LDMFD sp!,i,pc
print_string:
    .ascii "Square of %d is %d\n"
    .end

我正在使用ARMSim 进行模拟...但出现一些错误:

未定义符号 printf 地址不在文本部分 那么如何包含“stdio.h”以使用 printf 或一般有什么问题?

【问题讨论】:

你知道哪个库提供了printf函数吗?而且由于您不是用 C 编程,我不确定您想对 stdio.h 头文件做什么。 如果您使用的是ARMSim,则printf 可能根本不可用。 我在这里很困惑,如果你足够好心,请帮助我找出并描述我曾经的单行代码和对 gnu 汇编器的翻译。我会好好珍惜这份善意。 我相信你的翻译是正确的(虽然,这个.weak Lib$$Request$$armlib 不会做任何事情)。只是您没有链接到提供printf 的库。由于我从未使用过 ARMSim,因此我无法确定是否有提供此功能的库。 如果您想解释您的代码,请提出单独的问题。 【参考方案1】:

在 GNU 汇编器中,您不需要声明您使用的符号。如果您使用一个符号并且该符号未在任何地方定义,它将作为未定义符号输入到您的目标文件中。

要将符号定义为弱符号,请编写:

.weak sym

其中sym 是符号的名称。

【讨论】:

以上是关于arm gnu 汇编器中的 IMPORT 替代品是啥?的主要内容,如果未能解决你的问题,请参考以下文章

博文连载ARM编译器ARM汇编与ARM GNU汇编

ARM汇编伪指令

ARM汇编基础

GNU ARM汇编快速入门

GNU ARM汇编语法

GNU ARM 汇编指令