0

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

0 回答 0