GitHub

第三章 寄存器 知识梳理

1.内存中字的存储

子单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字符型数据的低位字节(小端法)

对于图3.1 分析

0地址单元中存放的字节型数据为  20H

0地址单元存放的字型数据是  4E20H

2. DS和[address]

8086cpu中有一个DS寄存器,通常用来存放要访问数据的段地址

[···]表示一个内存单元,表示内存单元的偏移地址

注意:mov指令可以完成两种传送

(1)将数据直接送入寄存器

(2)将一个寄存器内容送入另一个寄存器

8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器

至于为什么,是硬件设计的问题?

3.字的传送

采用小端法

字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中

4. mov add sub 指令

汇编指令   (1)操作码

                  (2)操作数   (常数,寄存器操作数,内存单元操作数)

用mov指令访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS存储器中。

mov 寄存器 ,数据

mov  寄存器,寄存器

mov  寄存器,内存单元

mov  内存单元,寄存器

mov  段寄存器,寄存器

mov  寄存器,段寄存器

mov 内存单元 段寄存器

mov 段寄存器,内存单元

add 寄存器,数据

add 寄存器 ,寄存器

add 寄存器,内存单元

add  内存单元,寄存器

sub 寄存器,数据

sub 寄存器,寄存器

sub 寄存器,内存单元

sub 内存单元,寄存器

注意:mov,add,sub是具有两个操作对象的指令,jmp是具有一个操作对象的指令

5.数据段

将一组长度为N(N<=64KB),地址连续,起始位置为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段

注意:一个字型数据占据2个单元


 

6.栈

后进先出原则 

7.CPU提供的栈机制

PUSH(入栈)POP(出栈)

在8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS和SP指向栈顶元素,PUSH指令和POP指令执行时,CPU从SS和SP中得到栈顶的地址。

 

PUSH AX 的执行

(1)SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元作为新的栈顶

(2)将ax中内容送入SS:SP指向的的内存单元处,SS:SP此时指向新栈顶

     入栈时栈顶从高地址向低地址方向增长

POP ax的执行

(1)将SS:SP指向的内存单元处的数据送入ax中

(2)SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

注意:

出栈后 SS:SP指向新的栈顶1000EH,POP操作前的栈顶元素。1000CH处的2266H依然存在,但是已经不在栈中,当再次执行PUSH等入栈指令后,他将被覆盖。

8.栈顶超界问题

8086CPU不保证我们对栈的操作不会超界,需要我们自己操心,(有没有解决方案呢?)

8086CPU只记录栈顶,栈空间大小我们自己要管理

我们尽量用到可能最大的栈空间

9.push,pop指令

初始栈为空栈

如果将10000H~1000FH这段空间当作栈,初始状态为空栈,即ss=1000H,SP=0010H

注意:push,pup等栈操作指令,修改的只是SP,所以栈顶变化范围最大是 0~FFFFH

10.栈段

(摘自  《汇编语言》王爽)

 

posted @ 2018-10-21 15:58  繁华似锦觅安宁  阅读(387)  评论(0编辑  收藏  举报