Экспоненциальная функция языка ассемблера - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь отладить код на ассемблере, который берет 2 целых числа: x и y и помещает его через функцию x ^ y. Но, кажется, есть проблема, когда я укажу значение y больше 2. Когда я укажу X = 3, пример Y = 3, я получу 9 результатов, что неверно (3 ^ 3 = 27)

Я использую Keli uVision 5 с платой разработки NXP LPC2833

Я новичок в этом сообществе. Так что, извините всех продвинутых программистов, если я сделал ошибки новичка.

https://i.stack.imgur.com/rEi6S.png

     AREA EXPONENT, CODE, READONLY
     ENTRY
start
     MOV a1, #3     ; X value
     MOV a2, #3     ; Y value
     BL X_POWER_Y   ; Go to X_POWER_Y function
B loop

X_POWER_Y

  CMP a2, #0        ;Checks if Y equals 0
  BEQ ZERO_COND

  CMP a2,#1         ;Checks if Y equals 1
  BEQ POWER_1

  MOV a3, a2
  MOV v1, a1

  while CMP a3, a2 
        BLT BREAK

        SUB a3, a3, #1
        MUL a4, a1, v1
        MOV v1, a4

        B while

POWER_1
   MOV a4, a1
   B BREAK

ZERO_COND
   MOV a4, #1
   B BREAK

BREAK
   MOV a1, a4

loop B loop
   END

1 Ответ

1 голос
/ 05 марта 2019

Я думаю, что это решит вашу проблему.Вы должны запустить цикл в течение y - 1 раз, поэтому я инициализировал a2 одним, и он будет работать до тех пор, пока a2 не станет равным или больше y (3 в вашем случае)

     AREA EXPONENT, CODE, READONLY
     ENTRY
start
     MOV a1, #3     ; X value
     MOV a2, #3     ; Y value
     BL X_POWER_Y   ; Go to X_POWER_Y function
B loop

X_POWER_Y

  CMP a2, #0        ;Checks if Y equals 0
  BEQ ZERO_COND

  CMP a2,#1         ;Checks if Y equals 1
  BEQ POWER_1
  MOV a3, #1
  MOV v1, a1

while 
        CMP a3, a2
        BGE BREAK
        ADD a3, a3, #1
        MUL a4, a1, v1
        MOV v1, a4

        B while

POWER_1
   MOV a4, a1
   B BREAK

ZERO_COND
   MOV a4, #1
   B BREAK

BREAK
   MOV a1, a4

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