【问题标题】:read system call in ARM assembly在 ARM 程序集中读取系统调用
【发布时间】: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

标签: assembly arm


【解决方案1】:

当您输入一个数字(如 1234)时,您读的不是数字 1234,而是字符 1、2、3 和 4(49、505152(ASCII 格式)(你读的是字符串) read 系统调用将这些值顺序存储在内存上的 inp_str 地址

当您输入负数(如 -1234)时,您正在阅读 -、1、2、3 和 4(4549505152(ASCII)

另一个问题是,在系统调用之后,您将 R1 与 #0 进行比较。 R1 不保存您键入的数字,但它保存由 inp_srt 表示的地址。这是一个内存地址。它总是积极的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2013-12-18
    • 2015-03-23
    • 1970-01-01
    相关资源
    最近更新 更多