您的位置:首页 > 其它

汇编语言笔记03-寄存器(内存访问)

2012-10-15 10:16 281 查看
转载必须注明出处,违者必究。http://www.cnblogs.com/dennisOne

内存中字的存储

8086PC,存放在一个字型数据(16位)的两个地址连续的内存单元称为字单元。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。

将起始地址为N的字单元简称为N地址字单元,它包括N和N+1号两个内存单元。

CPU读写内存

CPU要读写内存,必须给定内存单元(或者字单元)的地址。在8086PC中,内存地址由段地址和偏移地址组成。

8086CPU有16根数据线,所以可以一次性传送16位的数据,一次性传送一个字。

读写内存的指令示例
mov bx, 1000H

mov ds, bx

mov ax, [0] ; 1000:0处的字型数据传入ax

mov [0], cx ; cx中的16位数据送入1000:0处

mov、add、sub指令

mov指令的格式
mov 寄存器, 数据

mov 寄存器, 寄存器

mov 寄存器, 内存单元

mov 内存单元, 寄存器

mov 段寄存器, 寄存器

mov 寄存器, 段寄存器

mov 段寄存器, 寄存器

mov 内存单元, 段寄存器

mov 段寄存器, 内存单元

mov 段寄存器, 数据 ;非法指令

add/sub指令的格式



特别注意,段寄存器不能参与运算,诸如 add ds, ax是非法的。通常,一般使用寄存器将计算结果暂存,然后通过mov指令转交给段寄存器。

数据段

8086PC中,在编程中,可以根据需要,将一组内存单元定义为一个段。可以将一组长度为N(N<=64KB)、地址连续、起始地址位16倍数的内存单元定义为一个数据段。段地址使用DS记录。



栈段

8086CPU提供了以栈的方式来访问内存。8086CPU编程时,可以将一段内存当做栈来使用。

8086CPU提供了push和pop指令。
例:使用1000H~100FH这段内存当做栈来使用。



任何时刻,SS:SP指向栈顶元素。

pop和push指令的形式:
push 寄存器 ; 将一个寄存器中数据入栈

pop 寄存器 ; 出栈,用一个寄存器接受出栈的数据

push 段寄存器 ; 将一个段寄存器中数据入栈

pop 段寄存器 ; 出栈,用一个段寄存器接受出栈的数据

push 内存单元 ; 将一个内存字单元处的字入栈(注意:栈操作都是以字为单位)

pop 内存单元 ; 出栈,用一个内存字单元接受出栈的数据

push ax的执行:
(1). SP = SP - 2

(2). 将ax中的内容送入SS:SP指向的内存单元中。SS:SP指向新栈顶。

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

(2). SP = SP + 2

栈顶越界问题
8086CPU不会保证我们对栈的操作不会越界。

栈满时继续入栈或者栈空时继续出栈都会导致栈顶越界。可以通过设置上下限来解决栈顶越界问题。

例子:



栈的综述

数据段:存放数据;
代码段:存放代码;

栈段:将内存看作"栈"。

对于数据段,将它的段地址放在DS中,CPU就将定义的数据段中的内容当做数据来访问;

对于代码段,将它的段地址放在CS中,将段中第一个指令的偏移地址放在IP中,这样CPU就将执行定义的代码段中的指令。

对于栈段,将它的段地址放在SS中,将栈顶元素的偏移地址放在SP中,这样定义的栈段当作栈空间来用。

CPU如何区分不同段
CPU根据CS:IP指向的地方是代码;SS:SP指向的地方是栈;DS:BX指向的地方是数据区。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: