在ARM程序集中读取系统调用

时间:2015-01-07 22:00:00

标签: assembly arm

我想读取一个整数,如果是负数或正数则写入。问题是即使我输入负数,输出也总是正数。此外,该数字最多为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"

1 个答案:

答案 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 来阅读(会更容易)