目前在 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