首页 > 解决方案 > ARM 程序集嵌套循环

问题描述

我是 ARM 汇编语言的新手,我知道如何制作一个简单的 for 循环,但是,当我尝试将概念应用于嵌套循环时,我对如何设置它感到非常困惑。我想知道是否有一般设置for循环的规则?也许如果我可以使用该规则来制作嵌套循环?

例如,如果我有一个用 C 编写的简单嵌套循环代码,如下所示,在汇编中会是什么样子?非常感谢详细的解释,谢谢!

for(int i = 0; i < a; i++){
  for(int j = 0; j < b; j++){
  int sum = 0;
    for(k = 0; k < c; k++){
      for( l = 0; l < d; l++){
        int temp1 = i+k;
        int temp2 = j+k;
      }
    }
  }
}

标签: assemblyarm

解决方案


对于两个嵌套循环,我通常会做这样的事情。*请记住,此代码i(外循环计数器)将为 R0,j(内循环计数器)将为 R1。R2 用于计算内循环和外循环的循环数。

            AREA        myCode, CODE, READONLY
            ENTRY
            EXPORT __main
                
__main
            
            MOV     R2, #0
            
            MOV     R0, #2      ; ** outer loop (loop 1) counter initialization ** 
LOOP1       CBZ     R0, STOP    ; if (R0 == 0 && R1 == 0) then branch to somewhere. (I'm just ending program here)
            ; between outer and inner loop
            ; could do anything but I'm just incrementing R2
            ADD     R2, R2, #1
            
            MOV     R1, #3      ; ** inner loop (loop 2) counter initialization **
LOOP2       CBZ     R1, CNTULP1
            ; code inside of inner loop will be here
            ; could do anything but I'm just incrementing R2
            ADD     R2, R2, #1

; Notice) when you need to continue loop2 => branch to CNTULP2. else if you wanted to continue loop1 => branch to CNTULP1
;           and when you wanted to break loops => branch out of them for example branch to STOP 
CNTULP2     ; continue loop2 (inner loop) 
            SUB     R1, R1, #1  ; decrement inner loop counter
            B       LOOP2

CNTULP1     ; continue loop1 (outer loop)
            SUB     R0, R0, #1  ; decrement outer loop counter
            B       LOOP1


STOP        B       STOP
            END

推荐阅读