1. 程式人生 > >組合語言程式設計 第3章概念梳理

組合語言程式設計 第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