汇编基础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 
相关推荐
柿柿快乐14 小时前
Redis 入门第一课:全局命令、内部编码与单线程模型
redis·学习·缓存·基础教学
Lucky_ldy15 小时前
C语言学习:文件操作
学习
AI算法沐枫15 小时前
大模型 | 大模型之机器学习基本理论
人工智能·python·神经网络·学习·算法·机器学习·计算机视觉
小新同学^O^16 小时前
简单学习 --> LangChain
python·学习·langchain
吃好睡好便好17 小时前
在Matlab中绘制阶梯图
开发语言·人工智能·学习·算法·机器学习·matlab
Restart-AHTCM17 小时前
LangChain学习之提示词模板 (Prompts) - 练习(2/8)
学习·langchain
YangYang9YangYan17 小时前
2026产品专员学习数据分析的价值与路径
学习·数据挖掘·数据分析
淘矿人17 小时前
【AI大模型】AI 大模型推理平台完整测评:8 家主流聚合服务对比分析
人工智能·sql·gpt·学习·github·php
我想我不够好。18 小时前
2026.5.20 消防监控学习 1.5hour
学习
爱喝水的鱼丶18 小时前
SAP-ABAP:数据类型与数据对象(8篇) 第七篇:进阶优化篇——基于类型与对象特征的性能优化技巧
运维·数据库·学习·性能优化·sap·abap·开发交流