arm汇编储存指令str stur和读取指令 ldr ldur的使用,对应xcode c++中的代码反汇编教程


经常会看到xcode 返回变里面出现 stur 和 ldur之类的指令,网上资料不太多,今天做一下总结:

str 和 stur 存储指令

这是一对 存储指令,作用是把寄存器里的内容存储到右边地址中:用法格式如下:
str 寄存器,[内存地址]
stur 寄存器,[内存地址]
例如下面汇编代码
str w11, [x10, #0xa0]
stur w12, [x29, #-0x18]
从功能出发,这2条指令一般对应,存储数值,例如给变量赋值:

int a = 3;

c++中的一个局部变量的赋值对应下面汇编代码:

mov    w12, #0x3
stur   w12, [x29, #-0x18]

mov 先把3 赋值给寄存器w12,然后 stur存储指令把w12 寄存器里的内容写入内存地址 x29, #-0x18 里.

再看全局变量 int g_a = 0;

g_a = 10;
mov    w11, #0xa
str    w11, [x10, #0xa0]

mov 先把10=16进制0xa赋值给了 w11
str存储指令把w11里的内容写入 内存地址 x10, #0xa0 里面.

ldr 和 ldur 读取指令

接着上面的代码

int c1 = g_a;

因为上面 g_a 的内容已经被 str写入到地址:x10, #0xa0中,
下面 要把 g_a里的值赋值给c1,需要下面指令:

ldr    w12, [x10, #0xa0]
stur   w12, [x29, #-0x14]

ldr 把内存 x10, #0xa0 里的内容读到 w12中,
stur 把w12中的内容写入 x29, #-0x14 内存中, x29, #-0x14就是 变量c1的地址

ldur 跟ldr作用一样,都是读取就,只不过使用寄存器不同

在MCS-51单片机中,执行多位数的减法运算时,SUBB指令使用需要特别注意进位标志Cy的状态。以下是一个具体的汇编语言示例,展示了如何使用SUBB指令实现两个多位数的减法运算: 参考资源链接:[MCS-51单片机减法指令详解:带进位的SUBB指令](https://wenku.csdn.net/doc/37stur2rc8?spm=1055.2569.3001.10343) 假设我们有两个十六位的数分别存储在两个内存位置,例如: - 高八位数存储在0x20000x2001地址; - 低八位数存储在0x20020x2003地址。 我们希望将这两个数相减,并将结果存储在相同的地址处。以下是汇编代码示例: ```assembly ; 初始化段寄存器 ORG 0000H MOV DPTR, #2000H ; 设置数据指针到第一个数的高位地址 ; 准备减法操作,清空累加器A进位标志Cy CLR A CLR C ; 执行低八位的减法运算 MOVX A, @DPTR ; 将第一个数的低位加载到累加器A SUBB A, 2002H ; 从累加器A中减去第二个数的低位,并考虑进位标志Cy MOVX @DPTR, A ; 将结果存储回第一个数的低位地址 ; 移动指针到高八位地址 INC DPTR ; 执行高八位的减法运算,同时考虑前一次的借位 MOVX A, @DPTR ; 将第一个数的高位加载到累加器A SUBB A, 2003H ; 从累加器A中减去第二个数的高位,并考虑进位标志Cy(如果有借位,则Cy为1) MOVX @DPTR, A ; 将结果存储回第一个数的高位地址 ; 结束程序 END ``` 在这个例子中,我们首先将数据指针DPTR设置到第一个数的高位地址。然后,我们清空累加器A进位标志Cy,以准备减法操作。接着,我们先对低八位进行减法运算,并将结果存储回内存。之后,我们移动指针到高八位地址,执行高八位的减法运算,并将最终结果保存。 请注意,在实际应用中,进位标志Cy的处理非常关键,特别是在进行多字节减法时,因为前一次运算的借位会影响下一次运算。在上述示例中,我们通过INC DPTR指令来移动到下一个内存位置,进行高八位的减法运算。如果低八位减法产生借位,Cy将被设置为1,在高八位减法中将作为借位参与运算。 为了深入理解掌握这些概念,我推荐查阅《MCS-51单片机减法指令详解:带进位的SUBB指令》,这本资料详细讲解了SUBB指令的用法及其在多位数运算中的应用,能帮助你更全面地学习MCS-51单片机的减法操作。 参考资源链接:[MCS-51单片机减法指令详解:带进位的SUBB指令](https://wenku.csdn.net/doc/37stur2rc8?spm=1055.2569.3001.10343)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值