目录
3.4 算数运算操作指令add/adc/sub/sbc/mul
- 0xff000000 =====>判断的数
- 1111 1111 0000 0000 0000 0000 0000 0000 =====>判断的数
- 0000 0000 0000 0000 0000 0000 1111 1111 =====>找到0xff这个数 =====> 循环右移8位
-
- 0xf0000000 =====>判断的数
- 1111 0000 0000 0000 0000 0000 0000 0000 =====>判断的数
- 0000 0000 0000 0000 0000 0000 0000 1111 =====>找到0xf这个数 =====> 循环右移4位
-
- 0xf000000f =====>判断的数
- 1111 0000 0000 0000 0000 0000 0000 1111 =====>判断的数
- 0000 0000 0000 0000 0000 0000 1111 1111 =====>找到0xff这个数 =====> 循环右移4位
-
- 0x1FE00000=====>判断的数
- 0001 1111 1110 0000 0000 0000 0000 0000 =====>判断的数
- 0000 0000 0000 0000 0000 0000 1111 1111 =====>找到0xff这个数 =====> 循环右移11位
-
- 0x1F800000=====>判断的数
- 0001 1111 1000 0000 0000 0000 0000 0000 =====>判断的数
- 0000 0000 0000 0000 0000 0000 0111 1110 =====>找到0x7E这个数 =====> 循环右移10位
- mov r0,#0xff
-
- @ 1.将r0寄存器中的值,逻辑左移4位,赋值给目标寄存器r1,值
- lsl r1,r0,#0x4 @ r1 = r0 << 4 = 0xff0
- @ 0000 0000 0000 0000 0000 0000 1111 1111
- @ 0000 0000 0000 0000 0000 1111 1111 0000
-
- @ 2.将r1寄存器中的值,逻辑右移4位,赋值给目标寄存器r2,值 r2 = r1 >> 4
- lsr r2,r1,#0x4 @ r2 = r1 >> 4 = 0xff
- @ 0000 0000 0000 0000 0000 1111 1111 0000
- @ 0000 0000 0000 0000 0000 0000 1111 1111
-
- @ 3.将r2寄存器中的值,循环右移4位,赋值给目标寄存器r3,值
- ror r3,r2,#0x4 @ r3 = 0xf000000f
- @ 0000 0000 0000 0000 0000 0000 1111 1111
- @ 1111 0000 0000 0000 0000 0000 0000 1111
-
- ldr r4,=0x800000ff
- @ 4.将r4寄存器中的值,算数右移4位,赋值给目标寄存器r5,值
- asr r5,r4,#0x4 @ r5 = 0xf800000f
- @ 1000 0000 0000 0000 0000 0000 1111 1111
- @ 1111 1000 0000 0000 0000 0000 0000 1111
- @第一个64位数:高32位用r0表示0x3 低32位用r1表示0xffffffff
- @第二个64位数:高32位用r2表示0x4 低32位用r3表示0x1
- @实现两个64位数相加:高32位相加r4,低32位相加r5
- ldr r0,=0x3
- ldr r1,=0xffffffff
- ldr r2,=0x4
- ldr r3,=0x1
- adds r5,r1,r3 @ r5 = r1 + r3 = 0xffffffff + 0x1 = 0x0 ===> add 影响CPSR寄存器的C位
- adc r4,r0,r2 @ r4 = r0 + r2 = 0x3 + 0x4 + C = 0x8 ===> adc
- @第一个64位数:高32位用r0表示0x7 低32位用r1表示0x4
- @第二个64位数:高32位用r2表示0x4 低32位用r3表示0x5
- @实现两个64位数相减法:高32位相加r4,低32位相加r5
-
- ldr r0,=0x7
- ldr r1,=0x4
- ldr r2,=0x4
- ldr r3,=0x5
- subs r5,r1,r3 @ r5 = r1 - r3 = 0x4 - 0x5 = 0xffffffff ===> sub 影响CPSR寄存器的C位
- sbc r4,r0,r2 @ r4 = r0 - r2 = 0x7 - 0x4 - !C = 0x2 ===> sbc
- ldr r0,=0x40000800 @ 准备一块地址空间
- ldr r1,=0x11111111 @ r1 = 0x11111111
- ldr r2,=0x22222222 @ r1 = 0x22222222
- ldr r3,=0x33333333 @ r1 = 0x33333333
-
- @仿真时,思考1)寄存器写到哪一块地址空间中,2)观察r0寄存器中的值变化
-
- @将r1寄存器中的值,写到r0+4地址空间中,r0寄存器中的值没有发生变化
- @ [0x40000804] = 0x11111111 r0 = 0x40000800
- str r1,[r0,#4]
-
-
- @将r2寄存器中的值,写到r0地址空间中,r0寄存器中的值+4
- @ [0x40000800] = 0x22222222 r0 = 0x40000804
- str r2,[r0],#4
-
- @将r3寄存器中的值,写到r0+4地址空间中,r0寄存器中的值+4
- @ [0x40000808] = 0x33333333 r0 = 0x40000808
- str r3,[r0,#4]!
- ldr sp,=0x40000800 @ 准备一块地址空间
- mov r0,#0x1 @ r0 = 0x1
- mov r1,#0x2 @ r1 = 0x2
- bl add1_func @ 跳转到add1_func函数
- add r0,r0,r1 @ r0 = r0 + r1 = 0x3
- b stop
-
- add1_func:
- @ 压栈保存现场 r0 = 0x1 r1 = 0x2
- stmfd sp!,{r0-r1}
- mov r0,#0x3 @ r0 = 0x3
- mov r1,#0x4 @ r1 = 0x4
- add r0,r0,r1 @ r0 = r0 + r1 = 0x7
- @ 出栈保存现场 r0 = 0x1 r1 = 0x2
- ldmfd sp!,{r0-r1}
- mov pc,lr @ pc = lr
- _start: @指定汇编中函数入口
-
- ldr sp,=0x40000800 @ 准备一块地址空间
- mov r0,#0x1 @ r0 = 0x1
- mov r1,#0x2 @ r1 = 0x2
- bl add1_func @ 跳转到add1_func函数,保存函数返回地址到LR寄存器中
- add r0,r0,r1 @ r0 = r0 + r1 = 0x3
- b stop
-
- add1_func:
- @ 压栈保存现场 r0 = 0x1 r1 = 0x2
- stmfd sp!,{r0-r1,lr}
- mov r0,#0x3 @ r0 = 0x3
- mov r1,#0x4 @ r1 = 0x4
- bl add2_func @跳转到add2_func函数,保存函数返回地址到LR寄存器中
- add r0,r0,r1 @ r0 = r0 + r1 = 0x7
- @ 出栈保存现场 r0 = 0x1 r1 = 0x2
- ldmfd sp!,{r0-r1,pc}
-
- add2_func:
- @ 压栈保存现场 r0 = 0x3 r1 = 0x4
- stmfd sp!,{r0-r1}
- mov r0,#0x5 @ r0 = 0x5
- mov r1,#0x6 @ r1 = 0x6
- add r0,r0,r1 @ r0 = r0 + r1 = 0xB
- @ 出栈保存现场 r0 = 0x3 r1 = 0x4
- ldmfd sp!,{r0-r1}
- mov pc,lr
- ldr sp,=0x40000800 @ 初始化栈指针
- mov r0,#0x1
- mov r1,#0x2
- mov r2,#0x3
- mov r3,#0x4
- bl add_func
- int add_func(int a,int b,int c,int d)
- {
- return (a+b+c+d);
- }
- ldr sp,=0x40000800 @ 初始栈指针
- b main @ 跳转到C函数入口
- int sum1 = 0;
-
- int add1_func(int a,int b,int c,int d);
-
- int main()
- {
- sum1 = add1_func(1,2,3,4);
- while(1);
- return 0;
- }
- @ 实现r0-r3相加,并且通过r0返回
- .text
- .global add1_func
- add1_func:
- add r0,r0,r1
- add r0,r0,r2
- add r0,r0,r3
- mov pc,lr
- .end