汇编语言程序设计(三)寄存器
作者:互联网
内存中字的存储
- 任何两个地址连续的内存的单元,N号单元和N+1号单元,可以将它们看成是两个字节型的内存单元,也可以看成是一个字型的内存单元,其中N+1号单元存放高位数据,N号单元存放低位数据,这应该是小端法存储的方式。
DS数据段寄存器和[address]
-
DS数据段寄存器用于存放要访问的数据的段地址,[address]表示一个偏移地址为address的内存单元
-
如下图例子,mov bx, 1000H将1000H这个立即数存入bx,bx是通用寄存器,然后用mov ds, bx将寄存器bx中的内容存入数据段寄存器ds中,然后接下来只要是牵涉到读数据的都会默认ds中就是段地址,于是mov al, [0],意思是将偏移地址为0的内存中的数据读到al中,al是寄存器ax的低8位,这个时候[]里边的数代表偏移地址,[偏移地址]就表示取出该地址处的数据,但是只有偏移地址没有段地址还是没法定位的,因此只要见到[],汇编器会自动去找ds中的值作为段地址。即用mov指令访问内存单元时,mov指令中只给出单元的偏移地址,此时段地址默认在DS寄存器中。
-
上边例子可看到,mov有三种用法,一种是将数据直接送入寄存器,如mov ax, 2,一种是将一个寄存器中的内容送入另一个寄存器中,如mov bx, ax,还有一个是将内存中内容送入寄存器或者反过来,内存中内容用[偏移地址]表示,段地址自动到ds中找,格式为 mov 寄存器名,[偏移地址]。
-
8086CPU不支持直接将数据送入段寄存器,只能先把数据送入通用寄存器,然后再从通用寄存器送入段寄存器。
mov、add、sub指令
mov指令
- 已学mov指令几种形式
** 也可以用mov将段寄存器的值复制到寄存器,即mov 寄存器, 段寄存器
add与sub指令
- 与mov指令一样,也有两个操作数,但是不能用这两个指令来操作段寄存器
数据段
- 对于8086CPU,我们可以根据需要将一组内存单元定义为一个段,可以是代码段,也可以是数据段。具体地,我们用CS指向它,那它就是一个代码段,我们用DS指向它,那么它就是一个数据段。代码段寄存器给出了一个段的起始地址(需要是16的倍数),偏移地址的取值范围则决定了该段的大小,对于16位偏移地址来说,一个段的大小是不可能超过64KB的。
栈
CPU提供的栈机制
- 原先以为CPU中的栈跟数据结构的栈不是一个东西,但其实还是一个东西。现今的CPU都有栈的设计,其本质是提供了一些相关的指令来以栈的方式访问一段内存空间。
- 8086CPU提供了PUSH和POP两个指令来讲寄存器中的数据入栈,或将栈中的数据出栈到寄存器中。对于8086CPU来说,都是以字为单位进行入栈出栈的。
将内存当成栈使用的例子
- 以下代码将10000H~1000FH这段内存当作栈来使用。
- CPU通过段寄存器SP和寄存器SP来确定栈所在内存空间的位置和栈顶元素的位置,在任意时刻,SS:SP都会一直指向栈顶元素。因此在上边例子中,在第一个元素入栈之前,SS值为1000,SP值为0010,之所以不是000F,是因为SS:SP始终指向栈顶元素,此时1000F中是没有元素的,因此不是栈顶,下一次入栈它才是栈顶,因此初始的时候栈顶应该在其下一位,即F+1=10,这里都是16进制。
- SS和SP始终记录栈顶元素的位置,因此当执行PUSH和POP的时候会首先将SS:SP减2或加2(因按一个字两个字节算的)。
- 在初始化栈时可以先用MOV指令来给SS和SP赋值,以此指定栈空间的位置。
栈顶越界的问题
- SS:SP只记录了栈顶的地址,依靠SS和SP可以保证在入栈和出栈时找到栈顶,但是如何保证入栈出栈时不会超出栈空间?答案是会的,会造成栈顶越界的问题,而这个问题会导致诸如溢出攻击等一系列的问题,如果CPU中有记录栈顶上限和下限的寄存器,则可以解决这个问题,但是很遗憾,至少8086CPU中是没有这样的寄存器的。
- 因此,CPU只能通过SS:SP知道栈顶元素在哪,但是并不能知道我们准备使用的栈空间有多大。但是在C语言中,其实对于栈的管理是编译器自动做的,不需要程序员操心,,,
push、pop用于段寄存器、内存单元
- push,pop实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与MOV指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。
栈段
-
像数据段,代码段一样,也可以定义栈段。但是将一段内存当作栈段,仅仅是程序员在编程时的一种一厢情愿,是一种逻辑性的安排,CPU对此是一无所知的,CPU在执行push和pop等操作时照样会越界之类的,这无法避免。
-
一个栈段最大可以设为多少?当然就是跟SP这个偏移寄存器的位数有关的,如果是16位,那就是64KB。
标签:汇编语言,SP,栈顶,mov,地址,内存,寄存器,程序设计 来源: https://www.cnblogs.com/chkplusplus/p/16282252.html