1. 程式人生 > 其它 >彙編學習筆記(五)

彙編學習筆記(五)

技術標籤:javacpu資料庫大資料快取

表示記憶體地址的暫存器:

記憶體地址由段地址暫存器和偏移地址暫存器共同儲存

段地址暫存器:ds, es, ss, cs

偏移地址暫存器:sp, bp, si, di, ip, bx

辣麼為什麼地址要分段呢?

8086暫存器有 20根 資料線 CPU為16位的無法處理 20 位 的地址資訊
所以額外假設了一個地址加法器

運算規則:

實體地址 = 段地址 * 16 + 偏移地址

我記得32上面這樣寫實體地址的運算的:

基礎地址 = 段地址 * 處理器位數

實體地址 = 基礎地址 + 偏移地址

個人理解

  怎麼表示學校:兩種方法

    1、從家 走 10000m 到學校

    2、從家 走 700m 到小姐姐家,再走 9300m到學校

呃,有點體現不出,只能體現偏移。

  這麼想,我每天早上必須並且只會和一個人一起去學校(不要問為什麼,容易百年 | ),

  而且它們的家都不在學校且位於家和學校的直線上。

  今天小姐姐約我,所以我第一站需要到小姐姐家,等小姐姐,第二站再到學校

  明天另一個小姐姐約我,所以我得先到另一個小姐姐家,再去學校。

  所以我們上學的第一段一定是我家到某個(小姐姐)朋友家的距離,第二段才是到(小姐姐)朋友家家到學校的距離

這就是所謂的段地址(到(小姐姐)朋友家的距離的集合)

ps:每個(小姐姐)朋友家都不一樣(莫想整什麼姐妹花),到小姐姐家的距離的最大,和小姐姐家到學校的最大值是一樣的

指令:

-d 段地址:偏移地址
-e 段地址:偏移地址(一直空格一直往後)
-r 暫存器名:(修改暫存器指向)
-u 可以將記憶體中的資料用匯編語言表示出來ps:可以通過r指令指向自己想訪問的地址來實現將資料轉化為指令

CPU如何區分資料和指令:

  8086 CPU 在任意時刻,將CS,IP所指向的內容當作指令。

在CPU小姐姐休息的時候,CS和IP也不幹活,這時候都是二進位制,當CPU小姐姐開始工作的時候,CS和IP這兩個舔狗就會十分機智的載入好指令資訊

所以CPU小姐姐識別指令和資料依賴於CS和IP這兩個舔狗(萬一哪天不添了怎麼辦,那你只能忍痛割愛,扔掉這個小姐姐了)

……未完續待……

(自己腦補動畫)

更新:2020-02-25 20:35:36

修改CS、IP指令

  mov 指令不能作用於CS、IP

    能夠修改 CS、IP指令稱為轉移指令

  jmp 指令,修改CS和IP暫存器
jmp 目前需要的 寫法(還有其他寫法)

  1. jmp 2000:0
  2. jmp register

例題:假設 cs = 2000H, IP = 0000 寫出下列指令的執行過程

a 2000:0 cs = 2000H IP = 0
mov ax, 6622H cs = 2000H IP = 0 + 3 = 3
jmp 1000:3 cs = 1000H IP = 3 + 5 = 8(被指向但沒有被讀取) 
mov cx, ax

a:1000:0 cs = 1000H IP = 3
mov ax, 0123H 
mov ax, 0 cs = 1000H IP = 3 + 3 = 6
mov bx, ax cs = 1000H IP = 6 + 2 = 8
jmp bx cs = 1000H IP = 8 + 2 = 10(被指向,沒有被讀取)
mov cx, 0

PS:jmp 下面的指令被指向後,不一定被讀取因為 CS 和 IP 可能被跳轉到其他地方

兩個比較懵逼的指令:(個人感覺可以用於實現入棧的現場儲存)

call 指令 將IP儲存起來 記憶體中

ret 指令 將儲存起來的IP 拿出來

8086執行指令的步驟:

  1. CPU從CS:IP所指向的記憶體單元讀取指令, 存放到指令快取器中
  2. IP = IP + 所讀指令長度,從而指向下一條指令
  3. 執行指令快取器中的內容,回到第一步

為什麼這麼設計指令執行方式?(老師沒講清楚,暫留)

  目前只知道是為了實現call指令

debug指令

  1. -r 檢視、改變CPU暫存器內容,並將CS:指向的機器碼翻譯成彙編指令;
  2. -d 檢視記憶體中的內容
  3. -u 檢視記憶體中的內容,乙組合語言的方式
  4. -a 往記憶體中寫入一條彙編指令
  5. -t 執行一條機器指令
  6. -e 改寫記憶體中的內容

一個有意思的發現:

  alt + 小鍵盤數字 = ASCII 在txt中