В настоящее время я делаю проект для школы в 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