【汇编】深入浅出地讲解使用六条汇编指令解决大部分汇编代码

本文以keil5和STM32F103ZE核心板为开发环境,介绍了STM32汇编指令,如读取内存LDR、写内存STR、加法ADD等指令,还讲解了栈结构和C语言加法程序的汇编代码示例,最后总结了汇编程序特点及MOV与MOVS指令异同。

开发环境说明

本文采用的IDE为keil5,核心板为STM32F103ZE
在keil中添加以下两条语句即可生成汇编代码:

在上图界面中添加下述两句代码即可生成汇编代码:
fromelf --bin --output=test.bin Objects\test.axf
fromelf --text -a -c --output=test.dis Objects\test.axf

指令说明:fromelf是反向汇编指令,output后接生成目标文件名字,最后的Objects\test.axf是源程序,也就是项目工程编译后产生的文件;一般情况下修改的是目标文件的名字。

汇编指令

读取内存指令LDR
在汇编中,LDR指令其实是一对“孪生兄弟”,即有个称为LDR指令,另一个称为LDR伪指令,尽管他们是孪生兄弟,但其作用却大不相同。
小编将要讲述的是LDR指令,操作原型可为 LDR p1,[p2,#4],其意思是将地址p2+4中的数值加载到p1上,也就是读取地址再赋值。
写内存STR指令
STR指令,其操作原型为STR p1,[p2,#4] ,其意思是将数值p1写入地址p2+4中,也就是直接写入数据。
加法ADD指令
ADD指令,其操作原型为 ADD r1,r2,r3或者是 ADD r1,r2,#2,其意思很简单,就是r1=r2+r3或者是<r1=r2+2>,简单的说就是第一个数的值等于后面两个数之和。
减法SUB指令
减法指令与加法指令类似。
SUB指令,其操作原型为 ADD r1,r2,r3或者是 ADD r1,r2,#2,其意思很简单,就是r1=r2-r3或者是<r1=r2-2>,简单的说就是第一个数的值等于后面两个数之差。
比较CMP指令
CMP指令,其操作原型为 cmp p1,p2,简单的说就是比较两个值的大小,其结果保存在程序状态计数器PSR中。
跳转B/BL指令
B/BL指令的作用是实现程序跳转,也就是调用子程序。
它们之间的区别是:

  • B指令,只是简单的程序跳转,并且执行目的子程序;
  • BL指令,是带链接跳转,也就是需要返回地址。程序在发生跳转前,需要将当前PC值保存在R14中,也就是保存返回地址。

用法示例:
B label,意思是跳转label处理程序;
BL label,意思是跳转到label函数,同时将PC值保存到R14中。

示例讲解

在汇编语言中栈的结构讲解
栈大小初始化完成后,栈结构如下,此时栈顶指针应该指向底部,其地址为0x0000001b。

在压入一个数值0x03后,栈顶指针会向上移动,此时其指向的地址为0x00000018。倘若继续压入数值,栈顶指针还是会继续向上移动,地址会继续依次减少。
每次栈执行一次出栈操作,栈顶指针就会向下移动,那么其指向的地址就会不断增加。
因此,就可以明白 r1=sp+4的原因了。 **示例代码1** 示例1,是一个简单的两变量相加然后保存在第三个变量的程序。 *C语言程序:*
#include "stm32f10x.h"                  // Device header

int main(void)
{
   
   
	volatile  int a=123,b=1,c=28;
	c = a+b;
	return 0;
}

汇编代码:
上述程序会生成下述的汇编代码:

    i.main
    main
        0x080003b4:    b50e        ..      PUSH     {
   
   r1-r3,lr} ;将r1,r2,r3寄存器入栈,并且保存r1,r2,r3寄存器之前的值与返回地址
        0x080003b6<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值