【发布时间】:2020-02-09 16:35:35
【问题描述】:
我试图通过取消引用前两个寄存器,然后将结果存储在第三个寄存器中,在 ARM 汇编中将两个寄存器相加。
目前我有3个变量和一个函数,如下;
extern void my_function(int* x, int* y, int* total);
int main(void){
int x = 1; //R0
int y = 2; //R1
int total = 0; //R2
while(1){
my_function(&x, &y, &total);
printf("\x1b[5;5HTotal = %d, total");
}
}
还有一个函数,它执行以下操作
对于前两个寄存器,我尝试取消对它们的引用,将它们相加并将结果存储在第三个寄存器中。 这是我的汇编代码;
ldr r4, [r0] @ Dereference r0, and store the address in R4
ldr r4, [r1] @ Dereference r1, and store the address in R4
add r2, r0, r1 @ Add r0 & r1 together, and store in R2
str r4, [r2] @ Store r2 address in r4
当我打印出来时,答案是 0。
我的问题是,当我在汇编中执行前两行时,ldr r4, [r0]
被ldr r4, [r1] 替换,导致输出为0?
他们每个人都需要存储在自己的寄存器中吗?
还是我基本上只是打印出总数(r2)?
【问题讨论】:
-
“当我打印出来时” - 你到底在打印什么?
total?r4? -
首先是 r0、r1 和 r2 指向变量的指针 (int *x, int *y ...) 还是它们本身包含值? [r0] 间接 r0 不加
-
@ForceBru,我正在尝试打印总变量。
-
请阅读 arm 文档 ldr r4,[r0] 表示使用 r0 中的值作为地址读取该地址的内存中的 32 位值并将其放入 r4。然后 ldr r4,[r1] 执行相同的操作,但使用 r1 的内容作为地址,并且 r4 现在被新值覆盖,丢失了您在 ldr r4,[r0] 中所做的任何事情。如果 r0 和 r1 是地址,那么 add r2,r0,r1 只是添加地址/指针而不是值。而str r4,[r2]现在将你从r1的地址读取的r4放入r0,r1的地址,此时还没有使用数据值
-
你的代码不会做你的代码正在做的事情 *(&x + &y) = *y;
标签: c assembly game-boy-advance