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