汇编语言程序设计第三章

Posted sqy1999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言程序设计第三章相关的知识,希望对你有一定的参考价值。

第三章 寄存器(内存访问)

1 内存中字的存储

 1个字=2个字节,如从0开始存放20000(4E20H),20、4E分别表示1个字节,内存中字的存储如下图所示:
     技术分享图片
     任何两个地址连续的内存单元(0、1、2......),N号单元和N+1号单元,可以看成两个内存单元。比如说上图中的0内存单元(字节单元,存放的是字节型数据,就是20H(十进制的32);0地址字单元,存放字型数据,就是4E20H。
     任何两个地址连续的内存单元,N号单元和N+1号单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。比如上图中1字单元中,所代表的字是124EH,高位字节单元是2内存单元——12H低位字节单元是1内存单元——4EH
 
2 DS和[address]
     CPU读取内存单元时,必须先读取到这个内存单元的地址。8086CPU中,内存地址是由段地址和偏移地址组成,8086CPU中有一个DS寄存器,用来存放要访问的数据的段地址。
例子:读取10000H单元的内容,可以用这样的一段代码来实现:
          mov bx,1000H
          mov ds,bx
          mov al,[0]
     使用mov指令,可以完成两种传送:将数据直接送入寄存器;将一个寄存器中的内容送入另一个寄存器。mov指令还能够将一个内存单元中的内容送入一个寄存器。那么mov al,[0] ,就是将内存单元中,偏移地址为0的内存单元中的内容放入到ax通用寄存器中的低八位al(8位)中。一个段地址对应一个偏移地址,上面的代码中,段地址为1000,对应的偏移地址为0。
 
3 字的传送
     8086CPU是16位结构,有16根数据线,所以一次性可以传送16位的数据,也就是一次性传送1个字(1个字=2个字节=16位)。
     如下代码:
          mov bx,1000H
          mov ds,bx
          mov ax,[0] ---->这里是将1000:0处的字型数据(1个字,16位)送入到ax(16位)当中
          mov [0],cx ---->这里是将cx(16位)中的数据放入到1000:0(16位)内存单元中。
 
4 mov,add,sub指令
      mov指令的几种形式
     mov 寄存器,数据       如mov ax,2C3B
     mov 寄存器,寄存器      如mov bx,ax
     mov 寄存器,内存单元      如mov ax,[0]
     mov 内存单元,寄存器       如mov [0],bx
     mov 段寄存器,寄存器       如mov ds,ax

add 和 sub 指令同 mov 一样,都有两个操作对象。

     add 寄存器, 数据        如:add ax, 8

     add 寄存器, 寄存器       如:add bx, ax

     add 寄存器, 内存单元       如:add ax, [0]

     add 内存单元, 寄存器       如:add [0], ax

     sub 寄存器, 数据      如:sub ax, 8

     sub 寄存器, 寄存器     如:sub bx, ax 

     sub 寄存器, 内存单元       如:sub ax, [0]

     sub 内存单元, 寄存器        如:sub [0], ax

 

5 数据

      8086PC机,我们可以根据需要将一组内存单元定义为一个段。我们可以将一组长度为N(N<=64K)、地址连续、起始地址为16的倍数的内存单元,当作专门存储数据的内存空间,从而定义了一个数据段。

      如何访问数据段中的数据呢?将一段内存当作数据段,是我们在编程时的一种安排,我们可以在具体操作的时候,用 ds 存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。

 

6 栈

      栈顶的元素总是最后入栈,需要出栈时,又最先从栈中取出。

 

7 CPU提供的栈机制

      现今的CPU中都有栈的设计。8086CPU提供相关的指令来以栈的方式访问内存空间。这意味着,我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。

      段寄存器SS 存放栈顶的段地址,寄存器SP 存放栈顶的偏移地址。任意时刻,SS:SP 指向栈顶元素。

 

8 栈顶超界的问题

      栈顶越界是危险的:因为我们既然将一段空间安排为栈,那么在栈空间之外的空间里很可能存放了具有其它用途的数据、代码等,这些数据、代码可能是我们自己的程序中的,也可能是别的程序中的。但是由于我们在入栈出栈时的不小心,而将这些数据、代码意外地改写,将会引发一连串的错误。

      我们在编程的时候要自己操心栈顶越界问题,要根据可能用到的最大栈空间来安排栈的大小,防止入栈的数据太多而导致的越界。执行出栈操作的时候也要注意,以防止栈空的时候继续出栈而导致的越界。

 

9 push,pop指令

push和pop指令是可以在寄存器和内存之间传送数据的。

push和pop指令的格式(1)

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

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

push和pop指令的格式(2)

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

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

 

 

 

以上是关于汇编语言程序设计第三章的主要内容,如果未能解决你的问题,请参考以下文章

谭浩强版C语言程序设计(第三版)课后习题完整答案附源码--高等教育出版社

谭浩强版C语言程序设计(第三版)课后习题完整答案附源码--高等教育出版社

C语言程序设计,谭浩强老师第三版里面的一个关于浮点型数据的舍入误差问题

汇编语言第三章总结

第三章 最简单的C语言设计

深入理解计算机系统 第三章 程序的机器级表示 part1