ARMday02(汇编语法、汇编指令)

汇编语法

汇编文件中的内容

1.伪操作:在汇编程序中不占用存储空间,但是可以在程序编译时起到引导和标识作用 .text .global .glbal .if .else .endif .data .word....

2.汇编指令:每一条汇编指令都用来标识一个机器码,让计算机做一个指令运算

数据处理指令

数据搬移指令

算数运算指令

数据移位指令

位运算指令

数据比较指令

跳转指令

内存读写指令

状态寄存器传送指令 CPSR

软中断指令

3.伪指令:不是汇编指令,但是也可以让处理器做一些数据处理,通常一条伪指令会由多条汇编指令联合实现

4.注释

单行注释: @ ;

多行注释: /* */

条件注释 .if 1/0 指令段1 .else 指令段2 .endif

汇编指令的基本语法格式

指令的基本格式: <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand>

<opcode>:指令的操作码

cond:条件码后缀

s:指令的执行结果将会影响CPSR中的条件标志位。

<Rd>:目标寄存器,指令的运算结果保存在目标寄存器中

<Rn>:第一操作寄存器,只能是寄存器

<shifter_operand> :第二操作数,既可以是寄存器编号,又可以是立即数

意义:让第一操作寄存器中的值和第二操作数按照指令操作码进行运算,并且将运算的结果保存在目标寄存器中

注意:

1.一般一条汇编指令就占据一行代码

2.汇编不区分大小写

3.操作数前面要跟一个#

汇编指令

数据搬移指令

<opcode> {<cond>} {s} <Rd>, <shifter_operand>

解释:

<opcode>:指令的操作码

cond:条件码后缀

s:指令的执行结果将会影响CPSR中的条件标志位。

<Rd>:目标寄存器,指令的运算结果保存在目标寄存器中

<shifter_operand> :第一操作数,既可以是寄存器编号,又可以是立即数

指令码:

mov:将操作数直接搬移到目标寄存器中

mvn:将操作数按位取反之后搬移到目标寄存器中

立即数的概念

定义:可以直接当作指令的一部分去执行的数据叫做立即数。立即数是通过一个0-255之间的数字循环右移偶数位获取(循环右移:低位移除,补到高位)

立即数的判断

如何判断一个数据是不是立即数: 只要让这个数据或者这个数据按位取反的值循环右移偶数位,能够得到一个0-255范围内的数字就说明这个数是立即数

如何将一个非立即数保存在寄存器中

利用伪指令ldr即可完成非立即数的操作

格式: ldr 目标寄存器名,=数据

移位操作指令

格式: <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand>

解释:将第一操作寄存器的数值移位第二操作数位,将结果保存在目标寄存器中

指令码:

lsl:左移运算,最高位移出,最低位补0

lsr:右移运算,最低位移出,最高位补0

ror:循环右移:最低位移出,补到最高位

位运算指令

与、或、异或、按位清0

格式: <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand>

指令码:

and:进行按位与

orr:进行按位或

eor:按位异或

bic:按位清0

算数运算指令

格式: <opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>

指令码: add:加法运算 Rd=Rn+shifter_operand

adc:进行加法运算时考虑CPSR的C位 Rd=Rn+shifter_operand+CPSR[c]

sub:减法运算 Rd=Rn-shifter_operand

sbc:进行减法运算时考虑CPSR的c位 Rd=Rn-shifter_operand-!CPSR[c]

RSB :逆向减法Rd=shifter_operand-Rn

RSC:带借位的逆向减法指令 Rd = shifter_operand -- Rn - !CPSR[c]

mul:乘法运算 Rd=Rn*shifter_operand

进行64位算数运算

MOV R1,#0xfffffffe @第一个数据的低32位

mov r2,#0x00000004 @第一个数据的高32位

MOV R3,#0x00000005 @第二个数据的低32位

mov r4,#0x00000004 @第二个数据的高32位

加法:

低32位: adds r5,r1,r3

高32位: adc r6,r2,r4

数据比较指令

格式: cmp <Rn>, <shifter_operand>

比较指令的本质: 拿第一操作寄存器和第二操作数进行减法运算,并且减法运算的结果会影响到CPSR的条件位

可以根据比较指令之后的条件位的数值进行不同的运算,相当于c里的选择语句 这里需要对CPSR的条件位进行判断,我们依赖条件位的助记词{cond}后缀实现

跳转指令

一般实现程序的跳转有两种方式: 1.直接修改PC的值 2.通过跳转指令

1.b label 解释:跳转到label标签所在代码,此时跳转,lr寄存器不保存返回地址
2. bl label 解释:跳转到label标签所在代码,此时跳转,lr寄存器保存返回地址
3. bx 地址 跳转到地址对应的的指令位置,此时跳转LR不保存返回地址
4.blx 地址 跳转到地址对应的的指令位置,此时跳转LR保存返回地址

今日任务:

bash 复制代码
.text
.globl _start
/*累加1-100*/
_start:
	mov r0,#0@sum
	mov r1,#0@累加的值
	mov r2,#12@标记位
	add r1, r1,#1
	add r0,r0,r1
	
	cmp r1,#100
	beq stop
	bne continuefun
	
continuefun:
	bx r2
	
	
stop:
	b stop
.end
	

another

bash 复制代码
.text
.globl _start
/*累加1-100*/
_start:
	mov r0,#0@sum
	mov r1,#0@累加的值
	
continuefun:
	add r1, r1,#1
	add r0,r0,r1

	cmp r1,#100
	beq stop
	bne continuefun
	

	
stop:
	b stop
.end
	
相关推荐
老鱼说AI7 小时前
深入理解计算机系统1.5:抽象的重要性:操作系统与虚拟机
c语言·开发语言·汇编
猫猫的小茶馆2 天前
【Linux 驱动开发】一. 搭建开发环境
linux·汇编·arm开发·驱动开发·stm32·嵌入式硬件·mcu
猫猫的小茶馆2 天前
【Linux 驱动开发】二. linux内核模块
linux·汇编·arm开发·驱动开发·stm32·嵌入式硬件·架构
切糕师学AI2 天前
ARM 中的 SVC 监管调用(Supervisor Call)
linux·c语言·汇编·arm开发
ベadvance courageouslyミ2 天前
硬件基础中断
汇编·硬件·中断
你爱写程序吗(新H)3 天前
基于单片机的洗衣机控制系统设计 单片机洗衣机控制(设计+文档)
c语言·汇编·单片机·嵌入式硬件·matlab
VekiSon3 天前
ARM架构——用汇编语言点亮 LED
汇编·arm开发·嵌入式硬件
JJCar4 天前
汇编文字池(literal pool)
汇编·文字池·literal pool
乾复道5 天前
巧用终端,每天节省2小时
汇编·经验分享·vim
2501_927773075 天前
嵌入式——汇编语言1
汇编