问题描述
这是我的ARM程序集列表文件。我想编写汇编代码来计算:C = A + B;当我“全部使用”时,出现以下错误:
错误:未定义的符号r5用作立即值
错误:未定义的符号r6用作立即值
我是汇编文件的新手,所以我有点迷路。我应该在.text部分中进行哪些更改以消除错误。还告诉我“对三个内存访问使用单点寻址(DS)。每个内存访问 应该使用标签计算出的偏移量(没有硬编码的文字偏移量值)。“
SET_TARGET
.text
FUNCTION main,global
push {r4,r5,r6,r7,lr}
ldr r4,=C //Store symbol C inside r4
ldrb r5,=A //Store symbol C inside r4
ldrh r6,=B //Store symbol C inside r4
add r4,r5 //Add A to C
add r4,r6 //Add B to C as well
all_done:
pop {r4,lr}
bx lr
ENDFUNC main
.data
.org 234
.align 2,0xa5
DS: .word 0xbbbbbbbb
A: .byte 123
.align 1,0xa5
B: .short 47587
.align 2,0xa5
C: .word ~0
.align 3,0xa5
.word 0xeeeeeeee
.end
解决方法
gnu汇编程序:
so.s: Assembler messages:
so.s:1: Error: bad instruction `set_target'
so.s:5: Error: bad instruction `function main,global'
so.s:21: Error: bad instruction `endfunc main'
这些当然不是gnu汇编程序指令,它们看起来像ARM / Kiel类型的东西。
清理后看起来像这样
.text
.type main,%function
.globl main
main:
push {r4,r5,r6,r7}
ldr r4,=C @ copy address of C to r4
ldrb r5,=A @ copy address of A to r5
ldrh r6,=B @ copy address of B to r6
add r4,r5 @ &C = &C + &A,r4 = address of C plus address of A
add r4,r6 @ &C = &C + &B,r4 = r4 plus address of B
pop {r4,r7}
bx lr
.data
.align
A: .byte 123
.align
B: .short 47587
.align
C: .word ~0
对于gnu汇编程序,但是根据您的错误消息,您似乎不是在使用gnu汇编程序,而是使用其他方法。汇编是特定于工具而非目标的,因此您需要为所使用的汇编器(ARM,Kiel,gas等)编写汇编语言。
对于该汇编语言,则需要了解语法。您很可能不想将变量的地址加在一起,而是将它们的值加在一起。
您要从此函数返回任何内容吗?