Assembly 这条手臂是怎么工作的?

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,

我在理解这个汇编代码是如何工作的方面遇到了一些困难。我知道它循环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, 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);
}