汇编基础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 
相关推荐
蒸蒸yyyyzwd5 小时前
秋招不熟悉力扣学习笔记1
笔记·学习·leetcode
小弥儿6 小时前
GitHub今日热榜 | 2026-08-11:图原生基础设施首日登顶
学习·开源·github
for_ever_love__9 小时前
python基础语法学习: 数据容器
windows·python·学习
云空10 小时前
《电子专业完整学习路线图(分两套:本科四年版 / 零基础自学速成版)》
科技·学习·学习方法·高考
min(a,b)10 小时前
学习第16天:LangGraph 与 Agent 工作流编排
学习
woshihuanglaoshi10 小时前
鸿蒙技术进阶全景高级成长体系:从初中级到架构师的技能树/学习路径/项目实战/认证体系系统性方法论
学习·华为·harmonyos
AI即插即用10 小时前
即插即用系列 | IEEE TMI PLG-HN:原型学习引导的 CNN-Transformer 混合网络,攻克乳腺肿瘤分割难题
人工智能·深度学习·神经网络·学习·目标检测·cnn·transformer
leo_messi9412 小时前
langchain学习(三) - tools使用
学习·langchain
for_ever_love__12 小时前
python基础语法学习: 变量, 输入输出, 运算符
网络·python·学习
学习和思考12 小时前
非自动化专业如何自学PLC?我的6个月学习路线图
笔记·学习·自动化·学习方法