Chinaunix首页 | 论坛 | 博客
  • 博客访问: 515769
  • 博文数量: 174
  • 博客积分: 8001
  • 博客等级: 中将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-04 19:30
文章分类

全部博文(174)

文章存档

2011年(1)

2010年(24)

2009年(149)

我的朋友

分类: LINUX

2009-04-09 17:35:28

看了半天的指令集,还是找不到感觉。尽可入手ARM是很重要的。开始看伪指令。

顶!不搞那么多了,就读读一些示例,弄懂和记住就可以了——记住,你永远只知道的是子集。不需要贪得无厌的。只要熟悉运用20%子集就能做好80%的工作——如果有必要,再看其他的了。
2/8定理
现在可以确定了这样的一个子集:

ARM汇编入门知识子集

1)汇编语言的格式:

AREA...

ENTRY

START

...

STOP

MOV R0, 0X18

LDR R1, =0X20026

SWI 0X123456

END

2)调用子程序:

BL ...

BX LR

3)条件执行:

...

4)加载常量:

LDR, R?, =...

5)加载地址:

ADR R?, LABEL

ADRL R?, LABEL

LDR, R?, =LABEL

6)使用堆栈

MOV SP, #0X400

LDMFD ...

STMFD...

7)常用指令

跳转指令

数据处理指令

逻辑运算指令

加减运算指令

比较指令

移位指令

乘法指令

LOAD/STORE指令

单个寄存器传输

索引方式

前索引

自动变址的前索引

后索引

内存粒度

B 无符号字节(加载时零扩展为 32 位。) 

SB 有符号字节(符号扩展为 32 位。) H 无符号半字(加载时零扩展为 32 位。) 

SH 有符号半字(符号扩展为 32 位。) - 如果是字,则省略。

多个寄存器传输

8)常用伪指令

符号定义伪指令

EQU

数据定义伪指令

DCD

DCB

9)跳转表的组织

AREA EX, CODE, READONLY

NUM EQU 2

ENTRY

START

MOV R0, #0

MOV R1, #1

MOV R2, #2

BL ARITHFUNC

STOP

MOV R0, #0X18

LDR R1, =0X20026

SWI 0X123456

ARITHFUNC

CMP R0, #NUM

BXHS LR

LDR R3, =JUMPTAB

LDR PC, [R3, R0, LSL #2]

JUMPTAB

DCD DOADD

DCD DOSUB

DOADD

ADD R0, R1, R2

BX LR

DOSUB

SUB R0, R1, R2

BX LR

END

10)关于立即数和桶形移位器的概念:

符号定义的值被引用的时候,应该使用#NUM的形式

引用标签的时候一般式=LABEL的形式(32位常数地址值)

一般能使用常数的地方可以使用寄存器

桶形移位器和寄存器一起被视为相当于寄存器

11)交换指令

SWP和SWPB


使用以上的子集,可以解决很多的问题,还有很多语法的问题,例如使用宏和汇编控制等,但是在入门阶段是没有使用它们的必要。可以结束这段时间的困惑,继续向前学习。
阅读(510) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~