【发布时间】:2015-01-07 22:00:00
【问题描述】:
我想读取一个整数并写入它是负数还是正数。问题是即使我输入负数,输出也总是正数。此外,该数字最多为 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指令)。 -
您没有提供有关您的环境的任何重要细节——“读取”调用应该返回什么,以及在哪些寄存器中?您期望在调用后在 r1 中而不是字符串指针中出现什么?是否因为 r2 中的 #4 而限制为 4 个字符?
-
据我所知 read 返回已读取的字节数。 r0 有标准输入的数量,r1 是要存储数字的寄存器,r2 是我要读取的字节数,r7 是系统调用的数量。我的“目标”是存储我在命令行中输入的数字以注册 r1 。起初我从命令行 ./test 运行程序。然后我输入一个像 -4 这样的数字,然后按 Enter。然后我希望在标准输出中看到类似负数的东西。
-
通常的 unix 风格的
read系统调用将文本读入缓冲区。您需要将其转换为数字,或者在这种情况下只需检查是否有减号。%d说明符是scanf事物,而不是read。