【发布时间】:2014-04-01 09:59:19
【问题描述】:
我正在处理一个 C 文件,它是这样的:
#define v2 0x560000a0
int main(void)
{
long int v1;
v1 = ioread32(v2);
return 0;
}
我已经提取了这部分以将其写在汇编中:
int main ()
{
extern v1,v2;
v1=ioread32(v2);
return 0;
}
我正在尝试使用 armv4 的汇编代码在 v1 中写入 v2 的值。使用
arm-linux-gnueabi-gcc -S -march=armv4 assembly_file.c
我得到这个代码:
.arch armv4
.eabi_attribute 27, 3
.fpu vfpv3-d16
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file "txind-rsi.c"
.text
.align 2
.global main
.type main, %function
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args = 0
stmfd sp!, {fp, lr}
add fp, sp, #4
ldr r3, .L2
ldr r3, [r3, #0]
mov r0, r3
bl ioread32
mov r2, r0
ldr r3, .L2+4
str r2, [r3, #0]
mov r3, #0
mov r0, r3
sub sp, fp, #4
ldmfd sp!, {fp, lr}
bx lr
.L3:
.align 2
.L2:
.word v1
.word v2
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",%progbits
我使用该代码以这种方式将其放回 C 文件中:
asm volatile(
"stmfd sp!, {fp, lr}\n"
"add fp, sp, #4\n"
"ldr r3, =v1\n"
"ldr r3, [r3, #0]\n"
"mov r0, r2\n"
"ldr r3, =v2\n"
"str r2, [r3, #0]\n"
"sub sp, fp, #4\n"
"ldmfd sp!, {fp, lr}\n"
"bx lr"
);
代码不做任何事情。
事实上,它会停止目标的工作。 有谁知道为什么?
编辑: 看完你的回答我还有一个问题: 我如何将常量值放入寄存器中? C 中的代码是这样的:
#define v2 0x560000a0
int main(void)
{
long int value = 0x0000ffff;
long int v1;
v1 = ioread32(v2);
iowrite32(v2,value);
return 0;
}
我试过了:
asm volatile("mov r3, #value");
我收到一条汇编消息:“值符号在不同的部分”; 我也试过了
asm volatile("mov r3, #0x0000ffff);
并且汇编程序消息是: “修复后的无效常量(ffff)”。读完后:Invalid constant after fixup? 我不知道如何将这个值放入 r3,因为我似乎无法用 mov 来做到这一点。我使用的是 armv4,而不是 armv7。而链接中提出的这个解决方案对我不起作用:
asm volatile("ldr r3, =#0000ffff\n");
【问题讨论】:
-
缺少了真正有趣的部分:你开始使用的 C 源代码 (
assembly_file.c)... -
我已经编辑了我的问题。谢谢
-
...您仍然缺少最终 C 文件的可编译版本。或者您是否真的将
asm volatile行单独放入一个 .c 文件中并期望它做任何事情? -
...但它不起作用,并且由于缺少信息,我们无法重现您看到的结果。缩短你的代码,直到你有一个最小的例子仍然表现出观察到的行为,然后发布。这是调试 101,真的。 (正如我所说,我不了解 ARM 汇编。但与反汇编相比,您的内联汇编缺少几行是否重要?)
-
在
asm volatile语句之前和之后显示 10 行。