assembly - 读取 ARM 汇编中的系统调用

标签 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"

最佳答案

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

当您输入负数(例如 -1234)时,您将读取 -、1、2、3 和 4(4549>、505152(ASCII 格式)

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

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

关于assembly - 读取 ARM 汇编中的系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27829392/

相关文章:

assembly - 什么在操作系统中强制执行内存保护?

c - 使用内联汇编从 C 函数获取返回的字符

arm - STM32编程技巧和问题

assembly - 为什么 'LDR' 不能替换为 'B' ?

c - Neon 内在功能是通过从所有元素中减去最小元素来防止溢出[无循环]

linux - 嵌入式linux驱动加载

assembly - 我不确定这个 x86 Add 指令在做什么

x86 - 下面的汇编指令addsd -8(%rbp), %xmm0 的作用是什么?

assembly - Mips:计算两个输入的总和

iphone - 在任何操作系统上运行不同格式的可执行文件