ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

汇编语言程序设计(三)寄存器

2022-05-17 23:32:00  阅读:242  来源: 互联网

标签:汇编语言 SP 栈顶 mov 地址 内存 寄存器 程序设计


目录

内存中字的存储

  • 任何两个地址连续的内存的单元,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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有