汇编语言程序设计 第3章概念梳理

汇编语言程序设计

第3章概念梳理

基础概念部分:{

     字数据在内存当中的存储:高-高 低-低
     字数据的低位字节存放在低地址内存单元
     字数据的高位字节存放在高地址内存单元

    取低地址内存单元地址作为字数据地址,例如数据124EH:
    12H存储在偏移量为"2"的字节单元,4EH存储在偏移量为"1"的字节单元
    则从地址为"1"的地址单元取出的一个字数据为124EH

  12为高位,故存储在高位“2”单元,4E为低位存储在低位”1“单元

    数据在内存和CPU之间的传送:
    执行指令时,默认情况下,8086自动取寄存器DS中的值为内存单元的段地址
    DS:数据段段寄存器,用于存放数据段的[段地址]
    mov,add,sub等汇编指令中,访问内存单元是,默认情况下指的是数据段。

    关于常数(立即数运算):
    不能作为第1个操作数(目的操作数)
    第2个操作数(源操作数)时,如果最高位是十六位制的a~f或A~F,前面要加零。

    例如不能写成 mov 4000H,ax,应当写成mov ax,4000H

           不能写成 mov ax,A400H,应当写成mov ax,0A400H


    两个内存单元之间不能直接传送数据:
     mov [1],[2]

    不能使用mov指令修改CS和IP的值

    关于段寄存器:

  •     两个段寄存器之间不能直接传送
  •     不能把常数送到段寄存器


    关于add指令:

  •     操作数是内存单元时,指令中只给出[偏移地址]。默认,[段地址]在ds中

    错误点:

  •     add指令的操作数不能同时是内存单元
  •     add [1],[2]


    add指令的操作数不能是段寄存器,例如:
    add ax,[2]
    add ds,[2]

   关于sub指令:

  •    同add指令一样,操作数是内存单元时,指令中只给出[偏移地址]。默认,[段地址]在ds中

   错误点:

  •    两个内存单元不能直接使用sub指令相减,例如:
  •    sub[1],[2]


   sub指令的操作数不能是段寄存器

   栈的概念:

   栈的特性:先进后出

  •    两个概念:栈底、栈顶
  •    两个操作:入栈、出栈


   栈顶:最后入栈的字数据所对应的地址单元
   栈底:固定的一端,栈区最高地址单元的前一个单元

   入栈:把数据存入栈
   出栈:从栈取出数据

   与栈相关的寄存器SS和SP
   SS:栈段段寄存器,用于存放栈段的[段地址]
   SP:栈指针寄存器,用于存放栈顶的偏移指针

   SS:SP对应的物理地址是栈顶的物理地址
  (SS)*16+(SP)=栈顶的物理地址

  [栈]的操作指令:push和pop

   push ax 将ax的值压入栈顶
   pop ax 将栈顶的元素值弹出到ax寄存器

   push [0] 将ds:0对应的内存单元字数据压入栈
   pop [0] 将栈顶的元素弹出到ds:0对应的内存单元

   push和pop指令的注意点:
   入栈和出栈均以字为单元
   操作对象不能是常数

   pop段寄存器当中,段寄存器不能是CS和SS

   可以利用栈的定义完成如下两个操作:
   1、利用栈"保护现场"

保护现场原理: 先将寄存器bx,cx的值压入栈,然后无论对cx与bx寄存器的值进行如何的操作,都能通过栈先进后出的原则,把两个寄存器的值弹出返回。
   2、利用栈实现数据交换


同样利用先进后出的原则,先将两个寄存器的值压入,而后根据它们压入栈的顺序相同的进行弹出,即可实现两个寄存器数据的交换。


   关于[段]的小结

   一段内存可以同时用作代码段、数据段、栈段
   在8086CPU中,每个段的最大长度不能超过64KB,即 0000H~FFFFH

posted @ 2018-12-25 21:57  CYMWN  阅读(287)  评论(0编辑  收藏  举报