汇编基础1

1.格式

伪操作:它们不是ARM处理器实际的指令(如MOV, ADD等),而是写给汇编器看的命令,用于指导汇编器如何工作

cs 复制代码
    area reset, code, readonly
    code32
    entry

    内容    

    end
  • area: 这是最重要的一个伪操作,用于定义一个段。程序、数据、堆栈等都需要被组织在不同的段中。
  • reset: 这是你为这个段起的名字。名字 reset 具有很强的暗示性,通常用于表示复位向量段,即CPU上电或复位后首先执行的第一段代码所在的位置。
  • code: 指定该段的属性为代码,意味着这个段包含可执行的指令。
  • readonly: 指定该段的属性为只读。对于代码段来说,这通常是默认且必须的。
  • code32: 表示后续指令使用 32位的 ARM 指令集。
  • thumb: 表示后续指令使用 16位的 Thumb 指令集

2.指令

2.1 mov

MOV{S}<c> <Rd>, #<const>

MOV{S}<c> <Rd>, <Rm>

cs 复制代码
mov r0, #0x8 //r0赋值为0x8
mov r1, r0    //r1赋值为r0即0x8
mov r3, #31    //r3赋值为31

mov r0 #1
mov r6, r0, lsl #31    //将r0左移31位然后赋值给r6
mov r7, r0, lsl r3

2.2 add(加法)

立即数作为第二操作数: ADD{S}<c> <Rd>, <Rn>, #<const>

寄存器作为第二操作数寄存器: ADD{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}

寄存器作为第二操作数移位量: ADD{S}<c> <Rd>, <Rn>, <Rm>, <type> <Rs>

cs 复制代码
add r6, r0, #0xF0 //r6 = r0 + 0xf0
add r7, r0, r1    //r7 = r0 + r1
add r7, r0, r1, lsl #1 // r7 = r0 + (r1 << 1)
add r8, r0, r1, lsl r2

注意

  • {, <shift>} 其中{}代表可选择,","表示在使用时需要在Rm后添加"," ,shift 移位量(立即数)
  • add r0, #3, #2 :为什么没有这种形式,C语言int a = 1 + 2; 编译阶段计算, 不需要在机器指令中体现

2.3 sub(减法)

用法同加法

2.4 ldr(加载)

LDR<c> <Rt>, <label>

cs 复制代码
ldr r0, =0xfff0

2.5 mvn(按位取反)

MVN{S}<c> <Rd>, #<const>

MVN{S}<c> <Rd>, <Rm>{, <shift>}

MVN{S}<c> <Rd>, <Rm>, <type> <Rs>

cs 复制代码
示例:
mvn r0 , #0xffffffff // r0 = 0x0

2.6 bic(指定位置清0)

BIC{S}<c> <Rd>, <Rn>, #<const>

BIC{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}

BIC{S}<c> <Rd>, <Rn>, <Rm>, <type> <Rs>

cs 复制代码
示例:
bic r0, #(1 << 2)    //第二位清0
bic r0, #4           //0x0100 ,即第四位清0

orr:指定位置一

用法同bic

2.7 条件判断标志NZCV

CPSR寄存器中条件判断标志位

  • N: 符号标志位:上条指令执行结果最高位bit31为1,则 N = 1, 当结果作为有符号解释时为负值;
  • Z: 零值标志位:上条指令执行结果为0(即bit0 - bit31 均为0),则 Z = 1;
  • C: 进位标志位:进行无符号解读,如果在加法过程中进位或者减法时没有借位,则为 C = 1,否则 C = 0
  • V: 溢出标志位:进行有符号解读,是否发生溢出 -2^31 - 2^31-1(两个正数加得负数,两个负数加得正数)

条件码:eq ge gt le lt al(无条件执行)

equal:等于

not equal:不等于

2.8 cmp(比较指令)

CMP<c> <Rn>, #<const>

CMP<c> <Rn>, <Rm>{, <shift>}

CMP<c> <Rn>, <Rm>, <type> <Rs>

等价:cmp r0, r1 <==> subs r0, r1

3.循环

循环三要素

  • 循环结束条件
  • 推动循环趋向终结的语句
  • 循环的循环体

3.1 b指令(跳转)

cs 复制代码
示例
ldr	r0, =0x0fff
	mov r1, #0xf00
	mov r2, #0xf000
	
	cmp r0, r1
	bge greater    //r0大于r1,执行greater
	blt less

greater
	movge r3, r0
	b finish
less
	movlt r3, r1

3.2 循环

cs 复制代码
示例:从1加到100的和
    
    mov r0, #0
    mov r1, #0
loop
    add r1, r1, r0
    add r0, r0, #1
    cmp r0, #100
    ble loop        //r0小于等于100, 就执行loop 
相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
我在人间贩卖青春5 天前
汇编之伪指令
汇编·伪指令
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode