汇编学习第三章

  在第三章的学习中,我们开始更深入地学习寄存器。

(一)字在内存中的存储与内存单元地址

  在第二章中,我们了解到,在CPU中,用16位寄存器来存储一个字,但是由于内存单元是字节单元(即在一个单元内只能存放一个字节),所以一个字要用两个内存单元来存放。举个例子,我们用0、1两个单元来存放数据4E20H,0号单元为低地址单元,1号为高地址单元单元,分别存放它的低位、高位数据。由此,我们提出字单元的概念:由两个地址连续的内存单元组成,用来存放一个16位数据的内存单元。,一般我们将起始地址为N的字单元简称为N地址单元。

(二)字的传送

  CPU要读取一个内存单元需要给出这个单元的地址,它的段地址通常存放在DS寄存器中,举个例子,我们要读取地址为10000H单元的内容,可以用如下代码:

  mov bx,1000H

  mov ds,bx

  mov ax,[0] 

  上面指令的作用是将内存10000H中的数据读到al中

  [...]代表一个内存单元,[]里面的为其偏移地址,例如[0]代表ds:0地址的内存单元

  从第二章我们知道,通过mov指令我们可以将数据在寄存器和内存中传输,执行指令时,CPU会自动从ds中取出段地址

  注意,8086CPU不支持直接将数据送入段寄存器

  关于mov,sub,add命令我们已经在上一章介绍的很详细了,就不再多提了

  在编程时,为了存放数据,我们可以将一组内存单元定义为一个段专门用于存放数据,这就是数据段。具体操作时,我们一般用DS存放数据段的段地址,再根据需要访问数据段中的具体单元。

(三)栈和栈段  

  栈是一种具有特殊访问方式的储存空间,最后进入这个空间的数据,最先出去。

  栈有两个基本的操作:入栈和出栈。入栈就是将一个新的元素放到栈顶,出栈就是从栈顶取出一个元素。栈顶的元素总是最后入栈,又在出栈时最先出栈(即LIFO规则)

  CPU提供PUSH(入栈)和POP(出栈)的指令操作,我们在编程时,可以将一段内存当作栈来使用。push ax 代表将寄存器ax中的数据送入栈中,pop ax代表从栈顶取出数据送入ax。

  8086中SS和SP寄存器分别用来存放栈顶段地址和偏移地址,通过SS和SP设定的栈空间称为栈段,最大为64KB。CPU提供的出栈、入栈操作都是以字为单位的。SS:SP永远指向栈顶单元。

  push ax:将SP=SP-2,再将数据存放到SS:SP开始的两个内存单元中

  pop ax;将SS:IP处存放的字放入到ax,再将SP=SP+2,更新栈顶。

(四)检测点

  检测点3.1:

  (1)ax=2662H;bx=E626H;ax=E626H;ax=2662H;bx=D6E6H;ax=FD48H;ax=2C14H;ax=0;ax=00E6H;bx=0;bx=0026H;ax=000CH;

  (2)

  指令                  执行指令后:CS            IP            DS            AX           BX

  mov ax,6622H                2000H         0003H      1000H       6622H         0

  jmp 0ff0:0100                 0ff0H            0100H      1000H       6622H         0

  mov ax,2000H     0ff0H       0103H      1000H       2000H      0

  mov ds,ax       0ff0H       0105H  2000H   2000H    0

  mov ax,[8]      0ff0H        0108H      2000H  C389H   0

  mov ax,[2]                0ff0H        010BH      2000H  EA66H   0

  检测点3.2:

  (1)mov ax,2000H; mov ss,ax;mov sp,10H

   (2)  mov ax,1000H;mov ss,ax;mov sp,0H

猜你喜欢

转载自www.cnblogs.com/makise-kurisu/p/9912333.html