在ARM汇编中阅读系统调用

4

我想读取一个整数并写出它是负数还是正数。问题在于,输出始终为正数,即使我输入负数。此外,数字最多为4位,我希望它是4个字节。请注意,我是ARM汇编的完全初学者。以下是代码:

.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"

你用调试器检查过实际读取的内容了吗?我怀疑你正在比较已读取项目的数量,而不是读取到的值(cmp指令)。 - kestasx
你没有提供任何关于你的环境的重要细节 - "read"调用应该返回什么,以及在哪些寄存器中?在调用后,你期望r1中有什么而不是字符串指针?这是否由r2中的#4限制为4个字符? - Notlikethat
据我所知,read返回已读取的字节数。r0是标准输入的编号,r1是要存储数字的寄存器,r2是要读取的字节数,r7是系统调用的编号。我的“目标”是将我在命令行中键入的数字存储到寄存器r1中。首先,我从命令行运行程序./test。然后我输入一个数字,比如-4,然后按回车键。然后我期望在标准输出中看到类似负数的东西。 - mark4rd
4
通常的 Unix 风格的 read 系统调用会将文本读入缓冲区。您需要将其转换为数字,或者在这种情况下,只需检查是否有负号。%d 指示符是一个 scanf 的东西,而不是 read - Jester
1个回答

0

当你输入一个数字(比如1234),你并不是在读取数字1234,而是字符1、2、3和4(在ASCII中分别为49505152)(你读取的是字符串) read系统调用将这些值按顺序存储在内存中的inp_str地址处

当你输入一个负数(比如-1234),你读取的是-、1、2、3和4(在ASCII中分别为4549505152

另一个问题是,在系统调用之后,你将R1与#0进行比较。 R1并不保存你输入的数字,而是保存由inp_srt表示的地址。它是一个内存地址。它始终是正数。

如果你想知道你输入的数字是正数还是负数,你需要将这些字符(50、51、52和53)转换为实际数字(记住:始终使用ASCII码)...或者你可以使用函数scanf来读取(这样会更容易)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接