我想读取一个整数并写入它是负数还是正数。问题是即使我输入负数,输出也始终为正数。此外,该数字最多为 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"
最佳答案
当您键入数字(如 1234)时,您读到的不是数字 1234,而是字符 1、2、3 和 4(49、50、51 和 52(ASCII 格式)(您读取一个字符串) read 系统调用将这些值按顺序存储在内存的 inp_str 地址
当您输入负数(例如 -1234)时,您将读取 -、1、2、3 和 4(45、49>、50、51 和 52(ASCII 格式)
另一个问题是,在系统调用之后,您将 R1 与 #0 进行比较。 R1 不保存您键入的数字,但它保存 inp_srt 表示的地址。这是一个内存地址。它总是积极的。
如果您想知道您输入的数字是正数还是负数,您需要将这些字符(50、51、52 和 53)(记住:始终为 ASCII)转换为实数...或者您可以使用函数scanf来读取(会容易得多)
关于assembly - 读取 ARM 汇编中的系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27829392/