汇编基础1

发布于:2025-09-09 ⋅ 阅读:(25) ⋅ 点赞:(0)

1.格式

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

    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>

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>

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>

ldr r0, =0xfff0

2.5 mvn(按位取反)

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

示例:
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>

示例:
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指令(跳转)

示例
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 循环

示例:从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 

网站公告

今日签到

点亮在社区的每一天
去签到