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

空操作,进行延时等待

 

 

posted @ 2017-05-27 14:48  郁兴力  阅读(327)  评论(0)    收藏  举报