三–寄存器(内存访问)


3.1内存中字的存储

  内存单元是字节单元(即一个单元存一个字节)

  一个字用两个地址连续的单元存放,低位字节存在低地址,高位字节存在高地址

  字单元:存放一个字型数据(16位)的内存单元,由两个地址连续内存单元组成

  将起始地址为N的字单元简称为N地址字单元

3.2DS和[address]

  ds:通常用来存放要访问的数据的段地址

  […]表示一个内存单元,”…”是偏移地址,cpu自动取ds中的数据作为内存单元的段地址

  如何用mov指令从10000H中读取数据:先将段地址1000H放入ds,然后用mov al,[0]

    但8086不支持将数据直接送入段寄存器,所以:

      mov bx,1000H

      mov ds,bx

3.3字的传送

  8086有16根数据线,在mov指令中给出16位的寄存器就能进行字的传送

3.4mov、add、sub指令

  mov指令可有以下形式:

    mov  寄存器,数据    如:mov ax,8
    mov  寄存器,寄存器   如:mov ax,bx 
    mov  寄存器,内存单元  如:mov ax,[0]
    mov  内存单元,寄存器  如:mov [0],ax
    mov  段寄存器,寄存器  如:mov ds,ax
    mov  寄存器,段寄存器  如:mov ax,ds
    mov  内存单元,段寄存器 如:mov [0],ds
    mov  段寄存器,内存单元 如:mov ds,[0]

  add、sub同mov

3.5数据段

  将一段内存当作数据段,是我们在编程时的一种安排,即用ds存放数据段的段地址
3.6栈

  栈:后进先出(LIFO:last in first out)

3.7cpu提供的栈机制

  push ax将AX中的数据入栈

  pop ax从栈顶取出数据送入AX

  8086的入栈和出栈以字为单位

  SS:栈顶的段地址,SP:栈顶的偏移地址 (SS是段寄存器,不能直接送入数据,但SP可以)

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

  push ax:

    sp = sp – 2,SS:SP指向当前栈顶前面的单元

    将ax中的内容送入SS:SP指向的内存单元

    (入栈时,栈顶从高地址向低地址方向增长)

  pop ax:

    将SS:SP指向的内存单元处数据送入ax

    SP=SP+2

3.8栈顶超界的问题

  8086不保证我们对栈的操作不会超界,他只知道栈顶在何处,而不知道我们安排的栈空间有多大

  我们要自己考虑栈超界的问题

3.9push、pop指令

  push  寄存器
  pop    寄存器
  push  段寄存器
  pop    段寄存器
  push  内存单元
  pop    内存单元

    可只给出内存单元的偏移地址,段地址从ds获得

3.10栈段

  也是我们在编程时的一种安排

  如果将10000H~1FFFFH当作栈段,栈空时,SP=?

    当只有一个元素时,SS=1000H,SP=FFFEH,此元素出栈,SP=SP+2,所以SP=0

    栈最底部字单元的地址为1000:FFFE,栈空时,SS:SP指向最底部单元下面的单元,即最底部+2,即SP=0000H

  一个栈段最大可以设为多少?

    从栈空时SP=0,一直压栈,直到栈满时SP=0,再次压栈,栈顶将环绕,覆盖原来内容,所以最大0~FFFFH,64KB

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/281429.html

(0)
上一篇 2022年8月21日
下一篇 2022年8月21日

相关推荐

发表回复

登录后才能评论