Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 比较两个字符的ARM部件(ascii) #32是空间的十进制ascii码_Assembly_Arm - Fatal编程技术网

Assembly 比较两个字符的ARM部件(ascii) #32是空间的十进制ascii码

Assembly 比较两个字符的ARM部件(ascii) #32是空间的十进制ascii码,assembly,arm,Assembly,Arm,代码是使用 test: ldr r0, [r1, #4] bl printf ldr r2, [r1, #4] ldrb r0, [r2], #1 cmp r0, #32 beq test 然后和 arm-none-eabi-gcc a.s -T generic-hosted.ld 我想第一个命令会打印一次'abcde',第二个有空格的命令会打印两次'bcde'。但是我两个都打印了一次,有什么问题吗?printf可能会修改r0、r1、r2、

代码是使用

test:
    ldr r0, [r1, #4]
    bl printf

    ldr r2, [r1, #4]
    ldrb r0, [r2], #1

    cmp r0, #32
    beq test
然后和

arm-none-eabi-gcc a.s -T generic-hosted.ld

我想第一个命令会打印一次'abcde',第二个有空格的命令会打印两次'bcde'。但是我两个都打印了一次,有什么问题吗?

printf可能会修改r0、r1、r2、r3和r12

您需要使用保留调用的寄存器(并在返回之前将其还原),或者将值保存在堆栈上。

是准确的,但我想我应该对其进行一点扩展。ARM应用程序二进制接口(ABI),特别是,定义了如何跨过程调用边界处理每个寄存器

总之,
r0-r3
用于传递参数和返回值,调用者必须将其与“过程内调用暂存寄存器”一起保留
r12
。被调用方必须保留所有其他通用寄存器。因此,如果您正在用汇编语言编写自己的函数,那么除了调用任何其他函数时的
lr
r14
)之外,还必须推送您使用的任何
r4-r11
),并且必须确保堆栈的使用是“平衡的”,以便
sp
r13
)在退出时具有与进入时相同的值

大多数编译器(至少在禁用优化的情况下)会在一开始就将任何函数参数移出
r0-r3
生成满足这些要求的代码,只需按下被调用方保留寄存器;在返回之前将任何返回值移动到
r0
;通过使用
r0-r3
仅用于在函数执行期间向被调用函数传递参数和从被调用函数传递参数

此外,在不同对象文件(即不同源文件)中的函数之间,堆栈必须是8字节对齐的,因此始终保持8字节对齐是一个好习惯,因为这样做很容易,而且是免费的(出于与缓存相关的原因)。为此,确保与堆栈的每次交互(每次
PUSH
POP
)都涉及偶数个寄存器,如有必要,按下并弹出其他寄存器以构成偶数

arm-none-eabi-run a.out "abcde"
arm-none-eabi-run a.out " bcde"