我试图在ARM M4汇编中调用printf并遇到一些问题。目的是在R1中转储内容。代码如下
.data
.balign 4
output_string:
dcb "content in R1 is 0x%xn", 0
....
.text
....
push {r0, r1}
mov r1, r0
ldr r0, =output_string
bl printf
pop {r0, r1}
我遇到的问题是,当把"output_string"地址放入R0时,值被额外添加了1。例如,如果符号"output_string"的值为0x2000,则R0将获得值0x2001。
我觉得这与拇指/ARM模式有关。但是我已经在数据部分声明了"output_string",为什么汇编器仍然将其翻译为指令地址?
或者有一些更正式的方式来做这样的汇编内函数调用?
我认为你应该使用:
ldr r0, =output_string
=
前缀是汇编器的一种简写,可以使其加载任意32位常量。参见ARM信息中心页面