第三章
内存中字的存储
* CPU中,用16位寄存器来存储一个字,一个字要用两个地址连续的内存单元来存放,这个字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。
* 字单元:存放一个字型数据(16位)的内存单元,有两个地址连续的内存单元组成。
* 任何两个地址连续的内存单元,N号单元和N+1号单元,我们可以将它们看作两个内存单元,也可以看成一个地址位N的字单元中的高位字节单元和地位字节单元。
DS和[address]
* 8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。比如我们要读取10000H单元的内容,可以用如下的程序段进行。
mov bx,1000H
mov ds,bx
mov a1,[0]
上面的3条指令将10000H(1000:0)中的数据读到al中。
* 当使用mov指令将一个内存单元中的内容送入一个寄存器中时,格式应该是:mov 寄存器名,内存单元地址。
* “[...]”表示一个内存单元,0表示内存单元的偏移地址。
* 因此,我们用mov指令从10000H中读取数据,则进行以下步骤:
1.先将1000H放入DS
2.用mov al,[0]完成传送,mov 指令中的[]说明操作对象是一个内存单元,0说明这个内存单元的偏移地址是0,它的段地址默认放在DS中。
3.指令执行时,8086CPU会自动从DS中取出段地址
* 8086CPU不支持将数据直接送入段寄存器,要使用mov先送入通用寄存器,再送入段寄存器。
数据-->通用寄存器-->段寄存器
* 将al中的数据送入内存单元10000H中:
mov bx,1000H
mov ds,bx
mov [0],al
字的传送
由于ax,bx,cx都是16位的寄存器,所以把内存中的数据当作字单元(两个字节)看待。
mov、add、sub指令
到目前为止知道的mov:
mov 寄存器,数据 比如:mov ax,8
mov 寄存器,寄存器 比如:mov ax,bx
mov 寄存器,内存单元 比如:mov ax,[0]
mov 内存单元,寄存器 比如:mov [0],ax
mov 段寄存器,寄存器 比如:mov ds,ax
mov 寄存器,段寄存器 比如:mov ax,ds
add和sub指令:
add 寄存器,数据 比如:add ax,8
add 寄存器,寄存器 比如:add ax,bx
add 寄存器,内存单元 比如:add ax,[0]
add 内存单元,寄存器 比如:add [0],ax
sub 寄存器,数据 比如:sub ax,8
sub 寄存器,寄存器 比如:sub ax,bx
sub 寄存器,内存单元 比如:sub ax,[0]
sub 内存单元,寄存器 比如:sub [0],ax
无"add ds,ax"
数据段
根据需要,将一组内存单元定义位一个段,用来专门储存数据的内存空间,称为数据段。
检测点3.1
(1)解答:
将DS中的数据x16加上0000得到物理地址:00010,此物理地址可以拆分为多种可能,由题可知,拆分为0000:0010,答案既出。
(2)解答:
mov ax,6622H -> AX = 6622H
jmp 0ff0:0100 -> CS = 0FF0,IP = 0100
mov ax,2000H -> AX = 2000H
mov ds,ax -> DS = 2000H
mov ax,[0008] -> AX = C389
mov ax,[0002] - AX = EA66
栈
栈:一个容器,后进先出,像储存羽毛球的容器。
基本操作:入栈和出栈
CPU提供的栈的机制
8086CPU提供入栈和出栈指令,最基本的两个是PUSH和POP。比如,push ax 表示将寄
存器ax中的数据送入栈中,pop ax 表示从栈顶取出数据送入ax。8086CPU的入栈和出
栈操作都是以字单位进行的。
8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移
地址存放在SP中。任意时刻,SS:SP指向栈顶元素。push指令和pop指令执行时,CPU从
SS和SP中得到栈顶的地址。
push具体操作过程:
pop具体操作过程:
空栈情况:
假设10000H~1000FH这段空间为栈,当由一个元素时,SS = 1000H,SP = 000EH,所以当栈为空时:SS = 1000H,SP = 0010H。(栈中元素为字单元,所以一个元素相当于两个内存单元)
栈的越界问题
8086CPU并没有提示栈越界的操作机制,所以要我们自己注意栈越界的问题。
push、pop指令
栈段
将一段内存当作栈来使用,以栈的方式进行访问,这段空间称为栈段。
一个栈段最大容量为64KB。
检测点3.2
(1)解答:
mov ax,2000
mov ss,ax
mov sp,0010H
(2)解答:
mov ax,1000
mov ss,ax
mov sp,0000
实验2 用机器指令和汇编指令编程
实验任务:
ax = c0ea
ax = c0fc
bx = 30f0
bx = 6021
sp = 00fe 2200:00fe~2200:00ff c0fc
sp = 00fc 2200:00fc~2200:00fd 6021
sp = 00fe ax = 6021
sp = 0100 bx = c0fc
sp = 00fe 2200:00fe~2200:00ff 30f0
sp = 00fc 2200:00fc~2200:00fd 2f31
解释:在我看来,cpu把要操作的寄存器的数值压栈后方便后续操作。