arm64汇编str和stur和stp指令在ios中调用

str指令作用

str r0,[r1] str作用是把左边r0寄存器里的值,存入到 右边[r1]内存地址中
str x0,[x1,#0x10] //x->[x1+0x10]

#str 在函数中的作用
oc代码调用int fn1(int a,int *b);

    int a = 1;
    int b = 10;
    int result = fn1(a,&b);
_fn1:
str x0,[x1]//把fn1(参数1,参数2) x0里是参数1,把x0的值存入到 x1(参数2的指向的内存地址里)
ret

下面是lldb调试结果:, x0的值赋值给了x1地址里的内存. x1地址里的值也变成了x0的值:1

(lldb) re read x1
      x1 = 0x000000016af09418
(lldb) x 0x000000016af09418
0x16af09418: 0a 00 00 00 01 00 00 00 80 28 5e 80 02 00 00 00  .........(^.....
0x16af09428: 60 7a 0c 83 02 00 00 00 ec 1d de ef 01 00 00 00  `z..............
(lldb) re read x0
      x0 = 0x0000000000000001
(lldb) si
(lldb) x 0x000000016af09418
0x16af09418: 01 00 00 00 00 00 00 00 80 28 5e 80 02 00 00 00  .........(^.....
0x16af09428: 60 7a 0c 83 02 00 00 00 ec 1d de ef 01 00 00 00  `z..............

str和 stur的区别是,stur右边的立即数是负数,u代表立即数是负数

跟ldr和ldur一样,u都是负数

str x0,[x1,#0x10] //正数 x0->[x1+0x10]
stur x0,[x1,#-0x10] //负数 x0->[x1-0x10]

stp p是pair,把一对寄存器写入到右边内存

stp w0,w1,[x2] //把w0和 w1里面的值,写入到右边内存,[x2]中,w0在左边,w1在右边 

在oc中的调用
fn2的声明

	int fn2(int a,int b,int *c);//fn2的声明

调用

    int c = 1;
    int d = 2;
    int e = 0;
    result = fn2(c, d,&e);
    NSLog(@"result=%d",result);

汇编函数定义

_fn2:
//w0 存储参数1,w1存储参数2.因为w0和w1共同组成x0,第三个参数向后延续一个寄存器,所以参数3存入x1中
stp w0,w1,[x2] //把w0和 w1里面的值,写入到右边内存,[x2]中,w0在左边,w1在右边
mov x0,x2//把x2的值存入返回值x0中
ret

调试结果

(lldb) re read x2
      x2 = 0x000000016fd9540c
(lldb) x 0x000000016fd9540c
0x16fd9540c: 00 00 00 00 02 00 00 00 01 00 00 00 0a 00 00 00  ................
0x16fd9541c: 01 00 00 00 c0 e4 6d 83 02 00 00 00 00 88 3e 80  ......m.......>.
(lldb) re read w0
      w0 = 0x00000001
(lldb) re read w1
      w1 = 0x00000002
(lldb) si
(lldb) x 0x000000016fd9540c
0x16fd9540c: 01 00 00 00 02 00 00 00 01 00 00 00 0a 00 00 00  ................
0x16fd9541c: 01 00 00 00 c0 e4 6d 83 02 00 00 00 00 88 3e 80  ......m.......>.
(lldb) si
(lldb) re read x0
      x0 = 0x000000016fd9540c

这个x0就是返回值,赋值给int类型是取走后8位,就是 0x6fd9540c,转换成10进制就是1876513804
打印结果:

result=1876513804

在这里插入图片描述

为了完成多位数的减法运算,MCS-51单片机可以使用SUBB指令逐位进行减法操作,并在必要时处理进位。在编写汇编程序时,需要注意的是,SUBB指令在两个数相减后,若结果小于零,则进位标志Cy将被置为1。因此,在执行多字节减法时,必须连续使用SUBB指令,并在每一步后检查进位标志。以下是一个使用SUBB指令实现两个8位数减法的汇编语言示例: 参考资源链接:[MCS-51单片机减法指令详解:带进位的SUBB指令](https://wenku.csdn.net/doc/37stur2rc8?spm=1055.2569.3001.10343) ``` ; 假设我们要计算8位数(10h)减去(20h)的结果,并将结果存放在累加器A中。 ; 首先,设置初始值 MOV A, #10h ; 将10h放入累加器A,代表被减数 MOV B, #20h ; 将20h放入寄存器B,代表减数 ; 执行减法操作 SUBB A, B ; A = A - B - Cy ; 此时,如果结果为负数,则Cy=1。我们可以检查Cy标志来确定结果的正负。 ; 如果需要进行多位数减法,可以扩展上述操作,例如使用DPTR寄存器指向大数。 ; 以下代码展示了如何从DPTR指向的内存地址中减去一个16位数,并将结果存回内存。 ; 初始化数据指针到减数的起始地址 MOV DPTR, #2000h ; 假设2000h是减数的起始地址 ; 准备被减数 MOVX A, @DPTR ; 将DPTR指向的内存中的高字节加载到累加器A INC DPTR ; 增加DPTR,指向低字节 MOV R0, A ; 将高字节暂存到寄存器R0 MOVX A, @DPTR ; 将DPTR指向的内存中的低字节加载到累加器A SUBB A, #1000h ; 减去被减数的低字节 MOV R1, A ; 将结果暂存到寄存器R1 INC DPTR ; DPTR指向减数的低字节 MOVX A, @DPTR ; 加载减数的低字节 SUBB A, R1 ; 减去暂存的低字节结果 MOV R2, A ; 将结果暂存回R2 ; 此时R0中保存了高字节的结果,R2中保存了低字节的结果 ; 最后,可能需要将结果保存到原数据位置或其他位置。 ``` 在这个示例中,我们使用了SUBB指令进行逐字节的减法操作,并在每一步中检查进位标志Cy。对于16位或更多位数的减法,这个过程可以重复进行。当编写实际程序时,需要根据具体情况调整数据指针DPTR以及处理结果的位置。 掌握如何使用SUBB指令进行多位数的减法运算,对于MCS-51单片机的汇编语言编程至关重要。如果你希望进一步学习如何优化这种运算的性能以及理解其背后的工作原理,建议参阅《MCS-51单片机减法指令详解:带进位的SUBB指令》。这份资料不仅包含了具体的指令用法,还包括了关于汇编语言单片机编程的深入解释,帮助你全面掌握减法操作及其应用。 参考资源链接:[MCS-51单片机减法指令详解:带进位的SUBB指令](https://wenku.csdn.net/doc/37stur2rc8?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值