第三章
1.内存中字的存储
用16位寄存器来存储一个字。高八位存放高位字节,低八位存放低位字节。
字单元:存放一个字型数据的内存单元,由两个地址连续的内存单元组成。
注意区分地址单元和地址字单元。
2:DS和address
DS寄存器用来存放访问数据的段地址。
如果我们想读取10000H单元的内容:
mov dx,1000h
mov ds,dx
mov al,[0]
前两行就是将1000H送入到DS寄存器中(需要用普通寄存器dx来过渡)
然后用用mov al,[0]来完成传送(mov指令中的[]说明操作对象是一个内存单元,[]中的0说明这个内存单元的偏移地址为0)
3.字的传送
8086CPU可以一次性传送16位的数据,即可以一次性传送一个字。
只要在mov 指令给出16位的寄存器就可以进行16位数据的传输。
列如:mov dx,1000h
mov ds,dx
mov al,[0]
mov [0],cx
就是将cx中的16位数据传到1000:0处。
4.mov add sub指令
mov 寄存器,数据 mov 寄存器,寄存器 mov 寄存器,内存单元 mov 内存单元,寄存器 mov 段寄存器,寄存器
add和sub指令只是没有mov 段寄存器,寄存器这一项。
5.数据段
比如:将123B0H~123B9H的内存单元定义为数据段,现在要累加这个数据段中的前三个单元的数据,代码如下:
mov ax,123BH
mov ds,ax
mov al,0
add al,[0]
add al,[1]
add al,[2]
6,栈
栈是一种具有特殊的访问方式的存储空间,它的特殊性就在于:最后进入这个空间的数据,最先出去。
栈有两个基本的操作:即入栈和出栈
入栈就是将新的元素放到栈顶,出栈就是从栈顶取出一个元素。
7,CPU提供的栈机制
8086CPU提供相关的指令来以栈的方式访问内存空间,这意味着在编程时,可以将一段内存当作栈来使用。
CPU提供入栈(PUSH)和出栈(POP)两个最基本的指令,比如:push axj就是表示将寄存器ax中的数据送入到栈中,pop ax则表示从栈顶取出数据送入到ax当中。
对于CPU如何知道栈顶的位置,我们可以想到必须要有相应的寄存器来存放栈顶的 地址,即段寄存器SS和寄存器SP,SS就是用来存放栈顶的段地址,SP就是用来存放偏移地址,并且在任意时刻SS:SP指向栈顶的地址。
可以看出,入栈时,栈顶从高地址向低地址方向增长。
pop指令是完全与push指令相反的,当再次执行push指令时,并在里面写入新的数据时,它将会被覆盖。
8,栈顶超界问题
当栈满再使用push指令入栈时,或栈空的时候再使用pop时,都会发生栈顶超界的问题。
9,push pop指令
push 寄存器 ;将一个寄存器中的数据入栈
pop 寄存器 :用一个寄存器来接受出栈的数据
当然用段寄存器也是可以的;
push 内存单元 ;将一个内存单元处的字入栈
pop 内存单元 ;用一个内存单元来接受出栈的数据
比如: mov ax,1000h
mov ds,ax
push [0] ;将1000:0处的字压入栈中
pop [2] ;将出栈的数据送入到1000:2处
10.栈段
对与栈段,将它的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在需要进行栈操作时,就可以将我们定义的栈段当作栈空间使用。