Assembly 读取ARM组件中的系统调用

Assembly 读取ARM组件中的系统调用,assembly,arm,Assembly,Arm,我想读一个整数,然后写它是负数还是正数。问题是,即使输入负数,输出也始终为正数。此外,数字是最大4位,我希望它是4字节。请注意,我是一个完整的乞丐在手臂组件。这是密码 .text .global main main: mov r0, #0 /* read system call */ ldr r1, =inp_str mov r2, #4 mov r7, #3 swi 0 cmp r1,#0 blt w2 bge

我想读一个整数,然后写它是负数还是正数。问题是,即使输入负数,输出也始终为正数。此外,数字是最大4位,我希望它是4字节。请注意,我是一个完整的乞丐在手臂组件。这是密码

.text
.global main


main:   
    mov r0, #0 /* read system call */
    ldr r1, =inp_str
    mov r2, #4
    mov r7, #3
    swi 0

    cmp r1,#0   
    blt w2
    bge w1

w1:
    mov r0, #1 /* write system call */
    ldr r1, =string1
    mov r2, #len1
    mov r7, #4
    swi 0
    b e

w2:
    mov r0, #1 /* write system call */
    ldr r1, =string2
    mov r2, #len2
    mov r7, #4
    swi 0

e:
    mov r0, #0 /* exit system call */
    mov r7, #1
    swi 0

.data
    string1: .ascii "positive "
len1 = . - string1
    string2: .ascii "negative "
len2 = . - string2
    inp_str: .asciz "%d"
键入数字(如1234)时,您读取的不是数字1234,而是字符1、2、3和4(ASCII中的49、50、51和52)(您读取的是字符串) read系统调用将这些值按顺序存储在内存的inp_str地址

当您键入负数(如-1234)时,您正在读取-、1、2、3和4(ASCII中的45、49、50、51和52)

另一个问题是,在系统调用之后,您将R1与#0进行比较。 R1不包含您键入的号码,但它包含由inp_srt表示的地址。这是一个内存地址。它总是积极的


如果您想知道键入的数字是正数还是负数,则需要将这些字符(50、51、52和53)(请记住:始终为ASCII)转换为实数。。。或者您可以使用scanf函数读取(这会容易得多)

您是否使用调试器检查了什么是真正的读取?我怀疑您是在比较读取项目的数量,而不是读取的值(
cmp
指令)。您还没有给出环境的任何重要细节-应该返回什么“读取”调用,以及在哪些寄存器中?调用后,r1中的字符串指针将变为什么?是否因为r2中的#4而限制为4个字符?据我所知,read返回已读取的字节数。r0是标准输入的数字,r1是存储数字的寄存器,r2是我要读取的字节数,r7是系统调用数。我的“目标”是将我在命令行中键入的数字存储到寄存器r1中。首先,我从命令行运行程序。/test。然后我键入一个像-4这样的数字,然后按enter键。然后,我希望在标准输出中看到类似负数的内容。通常的unix风格的
read
系统调用将文本读入缓冲区。你们需要把它转换成数字,或者在这种情况下,只要检查一下你们是否有一个减号。
%d
说明符是
scanf
的东西,而不是
read