Как написать If, иначе, если в сборке - PullRequest
0 голосов
/ 18 февраля 2020

Мне нужно преобразовать следующий код C в его эквивалент в сборке. Я только взял несколько уроков по ассемблеру и на самом деле еще не имею gr asp языка.


int x = 45
int y = 27
while (x != y) {
   if (x > y)
      x = x - y;
   else if (y > x)
      y = y - x;
}  
return x;  // Sends exit code containing GCD

Я написал то, что, как мне кажется, работает и собираюсь использовать отладчик найти неизбежный fl aws, но хотел спросить, направляюсь ли я в правильном направлении с оператором if else.

    .global _start
    _start

    mov R1, #45  @R1 = 45
    mov R2, #27  @R2 = 27

    loopTop:
    cmp R1, R2
    beq allDone
    bge R1,R2
    sub R1,R1,R0
    bge R2,R1
    sub R2,R2,R1
    b loopTop


    allDone:
    SWI R1

Любая помощь / советы будут с благодарностью! Спасибо!

1 Ответ

1 голос
/ 18 февраля 2020

Вот ваше решение:

mov R1, #45 @x
mov R2, #27 @y

loop:
    cmp R1, R2  @compare R1 with R2
    bne label1  @is R1 not equals to R2? "Branch is Not Equal" to label1, else...

    @<replace with the return R1 statement here>

    label1:
        cmp R1, R2
        bgt sub_xy  @"Branch on Greater Than"
        cmp R1, R2
        blt sub_yx  @"Branch on Lower Than"

    sub_xy:
        sub R1, R1, R2  @R1 = R1 - R2
        b loop  @branch to loop

    sub_yx:
        sub R2, R2, R1  @R2 = R2 - R1
        b loop

Придумал это как новый x86_64 программист, пытающийся впервые написать код для ARM.

РЕДАКТИРОВАТЬ: Исправления / пояснения в комментариях .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...