首页 > 解决方案 > 我需要帮助将 C 代码转换为 Arm 程序集

问题描述

我正在尝试解决手臂装配中的 N 皇后问题。我有 C 代码,需要将其转换为 arm 程序集。我有大部分,但对递归部分有点困惑。我知道我需要推入堆栈,但不知道何时弹出堆栈。

我有以下代码:

__main  
PROC        
mov r9,#8       
    mov r8, #0 
    mov r7, #1
    lsl r7,r7,#8
    sub r7, #1 
    mov r3, #0 
    mov r4, #0
    mov r5, #0 
    mov r6, #0 

    BL  construct

construct 
            mov r10,#0 
    mov r1,#0 
    cmp r3, r9
    beq addone

    b constructelse


constructelse 

  orr r11,r4,r5
  orr r11,r11,r6
  mvn r11,r11
  and r10,r11,r7 
   b loop




loop 

   cmp r10, #0
   beq exit

   neg r12, r10 

   and r1, r12, r10 

   eor r10, r10, r1

   add r3, #1

   orr r4, r4, r1
   lsl r4, r4, #1

   orr r5, r1

   orr r6, r6, r1
   lsr r6, r6, #1

   push {r1}
   push {r2}
   push {r3}
   push {r4}
   push {r5}
   push {r6}
   push {r10}
   push {r11}
   push {r12}

   b construct

addone 
   add r8, #1
   b exit


exit            

    ENDP
    END

我应该能够看到 n 皇后问题有多少解决方案,并将数量保存到参考中。很抱歉代码格式化这是我第一次在这里发帖。

#include <stdio.h>

int  SIZE, MASK, COUNT;

void Backtrack(int y, int left, int down, int right)
{
    int  bitmap, bit;

    if (y == SIZE) {
        COUNT++;
    } else {
        bitmap = MASK & ~(left | down | right);
        while (bitmap != 0) {
            bit = -bitmap & bitmap;
            bitmap ^= bit;
            Backtrack(y+1, (left | bit)<<1, down | bit, (right | bit)>>1);
        }
    }
}

int main(void)
{
    SIZE = 8;   /*  <- N  */
    COUNT = 0;   /* result */

    MASK = (1 << SIZE) - 1;
    Backtrack(0, 0, 0, 0);

    return 0;
}

标签: cassemblyarm

解决方案


推荐阅读