8086汇编笔记:寄存器和寻址

来源:互联网 发布:海康200万网络摄像机 编辑:程序博客网 时间:2024/05/19 02:42

不愿啃老本,终于开始看书了,读书时汇编虽然很喜欢,可是那时候很浮躁,很多东西也似懂非懂,没有搞清楚,“没有那个闲心看机器语言和搞清楚机器的运行”。这两周都在看,一点一点,终于把很多东西想清楚了,真的很舒服。

可能学个汇编不至于让我这么舒服,其一是看懂了些东西,其二是发现学习能力和热情没有减弱,所以很欣慰。

虽然暂时不会用到汇编,看它也就是喜欢搞清楚计算机的方方面面,所以还是要记些笔记,以待来日之需速查。


一,关于指令和执行:汇编

CPU从总线上拿到指令和数据后执行,总线上传输的是0101这样的机器码,汇编就是机器码的助记符,通过汇编编译和链接成可执行机器码。

8086的数据总线位数是16位,即2字节(0000H~FFFFH);地址总线为20位,即00000H~FFFFFH。14个寄存器都是16位。所以通过寄存器来表达寻址时,需要使用逻辑地址,例如CS:IP来表示,移4位即可。

多个逻辑地址映射可为一个物理地址,例如FFFF:0001表示FFFF1H,FFFE:0011也表示FFFF1H。读书时就注意到若地址溢出呢?譬如FFFF:0001=100000表示什么呢?老师没有讲这是地址回绕,也没有讲8086如何处理。

读书时总习惯性的把这些东西当真理读,现在看起来汇编只是intel的一款了不起的产品,学习汇编也只是学习一个产品使用,当然是都有来龙去脉的了。


二,关于寄存器

8086有14个16位寄存器:

4个通用寄存器:AX,BX,CX,DX

4个段寄存器:CS,DS,SS,ES

4个指针(栈)和索引(寻址)寄存器:SP,BP,DI,SI

2个不可设寄存器:IP,FR

其中,CS:IP用来表示执行的代码地址,DS:BX/SI/DI寻址,SS:SP/BP用来操作堆栈。

DS需要手工初始化。段寄存器不能直接用常数赋值。

AX为累加计算器,一般ADD都是将结果累加到AX。

CX为计数器,例如循环次数的计数。

BX和BP为基址寄存器,用来寻址。


三,关于寻址方式

1.寄存器寻址:寄存器来保存操作数

例如,MOV BX,AX

2.立即数寻址:操作数为常数

例如,MOV AX,08H

3.直接寻址:指定内存的地址,操作数为内存地址,DS:操作数寻址

例如,MOV AL,[10H] ;将DS:10H中的内容传送到AL

4.寄存器间接寻址:寄存器中保存的是操作数的内存地址,DS+BX/SI/DI或者SS+SP/BP

例如,MOV AL,[SI] ;若SI=10H,将DS:10H的内容传送到AL

例如,MOV AL,[BP] ;若BP=10H,将SS:10H的内容传送到AL

5.基址相对寻址:BX/BP基址寄存器,连同偏移量寻址,DS+BX+偏移量或者SS+BP+偏移量

例如,MOV AL,[BX]+10H ;将DS:BX+10H处的内容传送到AL。

例如,MOV AL,[BP]+10H ;将SS:BP+10H出的内容传送到AL。

6.索引相对寻址:SI/DI索引寄存器,连同偏移量寻址,同“5.基址相对寻址”

7.基址索引相对寻址:将BX/BP和SI/DI组合起来寻址

例如,MOV AL,[BX][SI]+10H ;将DS:BX+SI+10H处的内容传送到AL。


原创粉丝点击