Part3.3伪指令学习
1、机器码
机器码实质是一串32位的数据,每个机器码都被分为许多段

这里只介绍一种命令的格式,MOV指令
这里首先准备一个汇编文件
.text .global _start _start: mov r0,r1 moveq r0,#0xff
编译以后反汇编,获得其机器码
中间一串数字就是机器码

转换成二进制:
1110 00 0 1101 0 0000 0000 000000000001
0000 00 1 1101 0 0000 0000 000011111111

cond:条件信息,4个位
后面两个位为0
I:标志位,表明最后的操作数是寄存器还是立即数,如果是立即数就为1
opcode:操作码,即不同的指令对应不同的opcode,区分不同指令
S:标志位,是否影响CPSR寄存器
Rn:第一个源操作数寄存器,mov并没有使用Rn寄存器
Rd:目的寄存器
shifter_operand:操作数
2、伪代码(伪指令前面都要加一个点)
伪指令本身没有对应的机器码
它只是在编译时产生作用,或者转化为其他的实际指令来执行

2、1global
标明全局的符号.global
2、2data
定义数据段.data标明接下来的数据放到数据段
2、3
ucosii:字符串数据 .ascii "hello world"
byte:字节型数据 .byte 0x1
word:字型数据

2、4equ
equ指令相当于C语言中的宏定义
格式如下
.equ DA,0x80
mov r0,#DA
2、5align
对齐指令
前面也用过了 .align 4
与4对齐,影响下一个数据
2、6ldr
这个指令与前面学过的内存访问指令同名
但不是同一个指令
.text .global _start _start: mov r0,#0x1ff
这段代码编译出错,因为对于mov指令而言操作的立即数不能超过8位,操作数也就12位,4位用来存放左移右移情况的
在这里使用ldr伪指令就可以存放数据
ldr r0,=#0x1ff
这条伪指令实际转换成的指令是
ldr r0,[pc,#-4]
这条指令不是伪代码,而是前面说的内存访问指令
这里实际上把0x1ff数据放到了30000008地址生成一个.word数据存放
而代码在30000004地址
2、7nop
空操作,进行延时等待


浙公网安备 33010602011771号