Как использовать функцию ИМТ в ARMv8 - PullRequest
0 голосов
/ 10 апреля 2019

В настоящее время я делаю проект для школы в Arm Assembly, и я столкнулся со странной проблемой на раннем этапе. Программа принимает два целых числа в качестве входных данных и должна вывести первое целое число, а затем вывести абсолютное значение этого целого числа. Проблема в том, что, когда я вводю отрицательное значение, я не могу найти способ определить, что оно отрицательное, так как независимо от того, какое условие ветвления я использую, ответвление не принимается.

Это в Armv8, я пытался сравнить значение в x1 с # 0 и использовать BLT и BMI, но похоже, что в любом случае ветвь не берется. Интересно, что значение всегда печатается как отрицательное, поэтому я очень озадачен тем, как это работает.

.data

newline: .asciz "\n"
input_fmt: .asciz "%d %d"
output_fmt: .asciz "%d"
strfmt: .asciz "hello"

num1: .space 256
num2: .space 256



.text
.global main

main:

    //take input
    ldr x0, =input_fmt
    ldr x1, =num1
    ldr x2, =num2

    bl scanf

    ldr x0, =output_fmt
    ldr x1, =num1
    ldr x1, [x1]

    bl printf

    ldr x1, =num1
    ldr x1, [x1]
    cmp x1, #0      //<---- PROBLEM
    bmi ABS         //Branch is never taken, even when input is negative

    ldr x0, =output_fmt
    bl printf





    b exit


ABS:

        neg x1, x1
        br x30


exit:
    mov x0, #0
    mov x8, #93
    svc #0
...