Мне нужна помощь в преобразовании кода C в Arm Assembly - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь решить проблему с N ферзями при сборке рук.У меня есть код на C, и мне нужно преобразовать его в сборку руки.У меня есть большая часть этого, но я немного запутался в части рекурсии.Я знаю, что мне нужно пушить в стек, но я теряюсь, когда вставлять стек.

У меня есть следующий код:

__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;
}
...