我正在阅读用于学习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或者通常有什么问题?
答案 0 :(得分:3)
在GNU汇编程序中,您不需要声明您使用的符号。如果使用符号并且该符号未在任何地方定义,则它将作为未定义的符号输入到目标文件中。
要将符号定义为弱符号,请写:
.weak sym
其中sym
是符号的名称。