Assembly 在ARM组装中创建简单的加法和减法程序

Assembly 在ARM组装中创建简单的加法和减法程序,assembly,arm,Assembly,Arm,我不熟悉手臂装配,我正在努力利用基本的算术。我正在尝试创建两个程序,一个是将两个数字相加并将结果存储到寄存器,另一个是将两个数字相减并将结果存储到寄存器。我觉得我很接近,但我不确定,可能需要一些指导。在这两个程序中,我假设数字存储在内存中。以下是添加程序: .global_start: _start: mov r0, #1 // Moves the first number into the register r0. mov r1, #2 // Moves

我不熟悉手臂装配,我正在努力利用基本的算术。我正在尝试创建两个程序,一个是将两个数字相加并将结果存储到寄存器,另一个是将两个数字相减并将结果存储到寄存器。我觉得我很接近,但我不确定,可能需要一些指导。在这两个程序中,我假设数字存储在内存中。以下是添加程序:

.global_start:
_start:
    mov r0, #1       // Moves the first number into the register r0.
    mov r1, #2       // Moves the second number into register r1.
    add r2, r1, r0   // Adds r0 and r1 and stores the result in register r2.
.global_start:
_start:
    mov r0, #1       @ Moves the first number into the register r0.
    mov r1, #2       @ Moves the second number into register r1.
    sub r2, r0, r1   @ Subtracts r1 from r0 and stores the result in register r2.
这是减法程序:

.global_start:
_start:
    mov r0, #1       // Moves the first number into the register r0.
    mov r1, #2       // Moves the second number into register r1.
    add r2, r1, r0   // Adds r0 and r1 and stores the result in register r2.
.global_start:
_start:
    mov r0, #1       @ Moves the first number into the register r0.
    mov r1, #2       @ Moves the second number into register r1.
    sub r2, r0, r1   @ Subtracts r1 from r0 and stores the result in register r2.
这些可能是完全错误的,但我对ARM ASM非常陌生!
任何建议或指导都会非常有用

不,
r2
是寄存器,不是内存。使用调试器单步执行此代码,您可以观察寄存器值的更改。仅存储指令,如
str
stb
写入内存。还是说输入的数字?是的,它们是
mov
指令机器代码的一部分,即“立即”操作数,机器代码只能从内存运行。使用类似于
objdump-d
的反汇编程序查看机器代码;低字节可能是第一个
mov
中的
01
,IIRC,这就是ARM机器代码为
mov
放置立即数的地方,移位计数位是分开的。@Peter Cordes我想我可能用了有点奇怪的措词,在这个程序中,我假设被加和减的数字已经在内存中,而我想把结果存储到寄存器中——如果这有意义的话。谢谢你帮我思考!哦,那么您将希望使用
ldr
而不是
mov
立即加载它们。例如,查看使用全局变量的C程序的编译器输出@我明白了,所以我不是用mov r0,#1,而是从ldr r0,#1开始,然后按常规添加它们?或者我也应该保持mov步骤,并首先用ldr加载它们?不,如果你想从内存加载,你需要有一些数据内存来加载。如果要将寄存器设置为指令中包含的常量,ARM将调用
mov
。(并且它仅适用于有限的常量范围)。有一条伪指令
ldr r1,=1
,要求汇编程序以某种方式将
1
放入寄存器,可以使用
mov
-立即,也可以通过在附近(两个函数之间)创建一个“文字池”并使用PC相对寻址模式从中加载。使用
objdump
查看它实际做了什么。