Assembly 这条手臂是怎么工作的?
我在理解这个汇编代码是如何工作的方面遇到了一些困难。我知道它循环16次,每次迭代都会更新总数。特别是在.L2标签上的那一行,由于前面的一行:ldr ip,[ip,#0]重新分配了ip,这难道不会导致分段错误吗?有人能解释一下这是怎么回事吗?提前感谢您抽出时间Assembly 这条手臂是怎么工作的?,assembly,arm,Assembly,Arm,我在理解这个汇编代码是如何工作的方面遇到了一些困难。我知道它循环16次,每次迭代都会更新总数。特别是在.L2标签上的那一行,由于前面的一行:ldr ip,[ip,#0]重新分配了ip,这难道不会导致分段错误吗?有人能解释一下这是怎么回事吗?提前感谢您抽出时间 .L5: .word data .word total _start: ldr ip, .L5 mov r1, #0 ldr r0, .L5+4 mov r3, r1 mov r2,
.L5:
.word data
.word total
_start:
ldr ip, .L5
mov r1, #0
ldr r0, .L5+4
mov r3, r1
mov r2, r1
ldr ip, [ip, #0]
str r1, [r0, #0]
.L2:
ldr r1, [ip, r3]
add r3, r3, #4
cmp r3, #64
add r2, r2, r1
str r2, [r0, #0]
bne .L2
您的代码:
- 加载
中ip
的地址和data
中r0
的地址total
- 零寄存器
,r1
和r2
r3
- 将
数据的内容加载到
,替换以前的内容(数据的地址)。这不是我的错。您可以从内存加载到任何寄存器,包括刚才用于指定加载有效地址的寄存器。所发生的一切都是正常的:不管有什么旧值(在本例中,指针)都会被新值(指针对象)替换李>ip
- 将
存储到0
中total
- 重复16次:
- 使用
作为整数数组的基址,从基址将偏移量ip
处的整数加载到r3
中r1
- 将
累积到寄存器r1
中r2
- 将
存储到r2
total
- 将
data
属于int*
类型,而total
属于int
类型。因此,我对您的汇编程序的解释是:
伪码y类C汇编程序
纯C
没问题!如果你发现我的答案已经解决了你的问题,请确保投票并接受我的答案?这和我昨天回答的问题完全一样。此外,公认的答案在这里有些误导。
int* data;
int total;
void start(void){
int** ip = &data;
int* r0 = &total;
int r1=0, r2=r1, r3=r1;
int* ipnew = *ip;
*r0 = r1;/* total = 0; */
do{
r1 = *(int*)((char*)ipnew + r3);/* r1 = ipnew[r3/4]; */
r3 += 4;
r2 += r1;
*r0 = r2;/* total = r2; */
}while(r3 != 64);
}
int* data;
int total;
void start(void){
int* arr = data; /* ip */
register int sum = 0;/* r2 */
register int i = 0;/* r3, divided by 4 */
total = 0;
do{
sum += arr[i++];/* r1 contains the value loaded from the array. */
total = sum; /* r0 contains &total */
}while(i != 16);
}