llvm-gcc 汇编器:LDR 语法 [英] llvm-gcc assembler: LDR syntax
本文介绍了llvm-gcc 汇编器:LDR 语法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这段代码在 gcc 上编译得很好,但是当使用 llvm (llvm-gcc) 时,它会在 ldr
问题在于语法:如何指定数组所在的位置?我不想以字节为单位对位移进行硬编码:ldr r7, [pc, #some_shift]
而是使用文字来保持代码的清洁和安全.
知道如何让它工作吗?
.globl func_name功能名称:推 {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}//[一些剥离的代码]添加 r6, r6, sl, lsl #2子 ip, ip, slldr r7, =maskTable//这里崩溃了添加 sl, sl, #4 @ 0x4//这里有一些剥离的代码mov r0, #0 @ 0x0//返回 0流行 {r4, r5, r6, r7, r8, r9, sl, fp, ip, pc}.word 0x00000000.数据.对齐 5掩码表:.word 0x00000000, 0x00000000, 0x00000000, 0x00000000.word 0x0000FFFF, 0x00000000, 0x00000000, 0x00000000.word 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000
解决方案
尝试改变
ldr r7, =maskTable
到
ldr r7, maskTable
并删除
.data
部分.这似乎是 gcc < 的错误/缺失功能.4.6 处理.data
节
This code compiles just fine on gcc, but when using llvm (llvm-gcc), it says "constant expression expected"
on the line with ldr
The problem is the syntax: How do I specify the place where my array is? I do not want to hard-code the displacement in bytes: ldr r7, [pc, #some_shift]
but to use a literal to keep the code clean and safe.
Any idea how to make it working?
.globl func_name
func_name:
push {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}
//[Some stripped code]
add r6, r6, sl, lsl #2
sub ip, ip, sl
ldr r7, =maskTable // Here it crashes
add sl, sl, #4 @ 0x4
// Some stripped code here
mov r0, #0 @ 0x0 // return 0
pop {r4, r5, r6, r7, r8, r9, sl, fp, ip, pc}
.word 0x00000000
.data
.align 5
maskTable:
.word 0x00000000, 0x00000000, 0x00000000, 0x00000000
.word 0x0000FFFF, 0x00000000, 0x00000000, 0x00000000
.word 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000
解决方案
Try changing
ldr r7, =maskTable
to
ldr r7, maskTable
and remove
.data
section. It seems to be a bug/missing capability of gcc < 4.6 to deal with .data
section
这篇关于llvm-gcc 汇编器:LDR 语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文