日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言基础知识摘要(《汇编语言》王爽)第 3 / 17 章

發布時間:2025/5/22 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言基础知识摘要(《汇编语言》王爽)第 3 / 17 章 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 字單元:即存放一個字型數據(16位)的內存單元,由兩個地址連續的內存單元組成。高地址內存單元中存放字型數據的高位字節,低地址內存單元中存放字型數據的低位字節。
  • 在以后的課程中,我們將起始地址為N的字單元簡稱為N地址字單元。比如一個字單元有2、3兩個內存單元組成,則這個字單元的起始地址為2,我們可以說這是2地址字單元。
  • 任何兩個地址連續的內存單元,N號單元和N+1號單元,可以將它們看成兩個內存單元,也可看成一個地址為N的字單元的高位字節單元和地位字節單元。
  • DS寄存器,是一個段寄存器,通常用來存放要訪問數據的段地址。8086CPU不支持將數據直接送入段寄存器的操作。
  • 至此,我們用到了mov、add、sub指令,它們都帶有兩個操作對象,可以有以下幾種形式(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]

  • 3.1~3.5 小結
    (1)字在內存中存儲時,要用兩個地址連續的存儲單元來存放,字的低位字節存放在低地址單元中,高位字節存放在高地址單元中。
    (2)用mov指令訪問內存單元,可以在 mov指令中只給出單元的偏移地址,此時,段地址默認在DS寄存器中。
    (3)[address]表示一個偏移地址為address的內存單元。
    (4)在內存和寄存器之間傳送字型數據時,高地址單元和高8位寄存器、低地址單元和低8位寄存器相對應。
    (5)mov、add、sub是具有兩個操作對象的指令。jmp是具有一個操作對象的指令。
    (6)可以根據自己的推測,在Debug中實驗指令的新格式。
  • 棧:棧是一種具有特殊的訪問方式的存儲空間。它的特殊性就在于,最后進入這個空間的數據,最先出去。棧有兩個基本的操作:入棧和出棧。入棧就是將一個新的元素放到棧頂,出棧就是從棧頂取出一個元素。棧頂的元素總是最后入棧,需要出棧時,又最先被從棧中取出。棧的這種操作規則被稱為:LIFO(Last In First Out,后進先出)。
  • 8086CPU提供入棧和出棧指令,最基本的兩個是PUSH(入棧)和POP(出棧)。比如,push ax 表示將寄存器ax中的數據送入棧中,pop ax表示從棧頂取出數據送入ax。8086CPU的入棧和出棧操作都是以字為單位進行的。
  • 8086CPU中,有兩個寄存器,段寄存器SS和寄存器SP,棧頂的段地址存放在SS中,偏移地址存放在SP中。任意時刻,SS:SP指向棧頂元素。push指令和pop指令執行時,CPU從SS和SP中得到棧頂的地址。


  • 棧頂超界的問題:8086CPU不保證我們對棧的操作不會超界。這也就是說,8086CPU只知道棧頂在何處(由SS:SP指示),而不知道我們安排的??臻g有多大。這點就好像CPU只知道當前要執行的指令在何處(由CS:IP指示),而不知道要執行的指令有多少。從這兩點上我們可以看出8086CPU的工作機理,它只考慮當前的情況:當前的棧頂在何處、當前要執行的指令是哪一條。
  • 我們在編程的時候要自己操心棧頂超界的問題,要根據可能用到的最大??臻g,來安排棧的大小,防止入棧的數據太多而導致的超界;執行出棧操作的時候也要注意,以防棧空的時候繼續出棧而導致的超界。
  • push、pop實質上就是一種內存傳送指令,可以在寄存器和內存之間傳送數據,與mov指令不同的是,push和pop指令訪問的內存單元的地址不是在指令中給出的,而是由SS:SP指出的。同時,push和pop指令還要改變SP中的內容。
    我們要十分清楚的是,push和pop指令同mov指令不同,CPU執行mov指令只需一步操作,就是傳送,而執行push、pop指令卻需要兩步操作。執行push時,CPU的兩步操作是:先改變SP,后向SS:SP處傳送。執行pop時,CPU的兩步操作是:先讀取SS:SP處的數據,后改變SP。
    注意,push,pop等棧操作指令,修改的只是SP。也就是說,棧頂的變化范圍最大為:0~FFFFH。
    提供:SS、SP指示棧頂;改變SP后寫內存的入棧指令;讀內存后改變SP的出棧指令。這就是8086CPU提供的棧操作機制。

  • 棧的綜述
    (1)8086CPU提供了棧操作機制,方案如下:
    ? ? ? ? 在SS、SP中存放棧頂的段地址和偏移地址;
    ? ? ? ? 提供入棧和出棧指令,它們根據SS:SP指示的地址,按照棧的方式訪問內存單元。
    (2)push指令的執行步驟:①SP=SP-2;②向SS:SP指向的字單元中送入數據。
    (3)pop指令的執行步驟:①從SS:SP指向的字單元中讀取數據;②SP=SP+2。
    (4)任意時刻,SS:SP指向棧頂元素。
    (5)8086CPU只記錄棧頂,??臻g的大小我們要自己管理。
    (6)用棧來暫存以后需要恢復的寄存器的內容時,寄存器出棧的順序要和入棧的順序相反。
    (7)push、pop實質上是一種內存傳送指令,注意它們的靈活應用。
    棧是一種非常重要的機制,一定要深入理解,靈活掌握。

  • 段的綜述

    ? ? ? 我們可以將一段內存定義為一個段,用一個段地址指示段,用偏移地址訪問段內的單元。這完全是我們自己的安排。

    ? ? ? 我們可以用一個段存放數據,將它定義為“數據段”;

    ? ? ? 我們可以用一個段存放代碼,將它定義為“代碼段”;

    ? ? ? 我們可以用一個段當作棧,將它定義為“棧段”。

    ? ? ? 我們可以這樣安排,但若要讓CPU按照我們的安排來訪問這些段,就要:

    ? ? ? 對于數據段,將它的段地址放在DS中,用mov、add、sub等訪問內存單元的指令時,CPU就將我們定義的數據段中的內容當作數據來訪問;

    ? ? ? 對于代碼段,將它的段地址放在CS中,將段中第一條指令的偏移地址放在IP中,這樣CPU就將執行我們定義的代碼段中的指令;

    ? ? ? 對于棧段,將它的段地址放在SS中,將棧頂單元的偏移地址放在SP中,這樣CPU在需要進行棧操作的時候,比如執行push、pop指令等,就將我們定義的棧段當作??臻g來用。

    ? ? ? 可見,不管我們如何安排,CPU將內存中的某段內容當作代碼,是因為CS:IP指向了那里;CPU將某段內存當作棧,是因為SS:SP指向了那里。我們一定要清楚,什么是我們的安排,以及如何讓CPU按我們的安排行事。要非常清楚CPU的工作機理,才能在控制CPU按照我們的安排運行的時候做到游刃有余。

    ? ? ? 一段內存,可以既是代碼的存儲空間,又是數據的存儲空間,還可以是棧空間,也可以什么也不是。關鍵在于CPU中寄存器的設置,即CS、IP,SS、SP,DS的指向。

  • .
  • 轉載于:https://www.cnblogs.com/djdq/p/5004358.html

    總結

    以上是生活随笔為你收集整理的汇编语言基础知识摘要(《汇编语言》王爽)第 3 / 17 章的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。