彙編學習筆記(五)
表示記憶體地址的暫存器:
記憶體地址由段地址暫存器和偏移地址暫存器共同儲存
段地址暫存器: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 目前需要的 寫法(還有其他寫法)
- jmp 2000:0
- 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執行指令的步驟:
- CPU從CS:IP所指向的記憶體單元讀取指令, 存放到指令快取器中
- IP = IP + 所讀指令長度,從而指向下一條指令
- 執行指令快取器中的內容,回到第一步
為什麼這麼設計指令執行方式?(老師沒講清楚,暫留)
目前只知道是為了實現call指令
debug指令
- -r 檢視、改變CPU暫存器內容,並將CS:指向的機器碼翻譯成彙編指令;
- -d 檢視記憶體中的內容
- -u 檢視記憶體中的內容,乙組合語言的方式
- -a 往記憶體中寫入一條彙編指令
- -t 執行一條機器指令
- -e 改寫記憶體中的內容
一個有意思的發現:
alt + 小鍵盤數字 = ASCII 在txt中