1. 資料處理的兩個基本問題
這已經是老生常談啦, 資料處理有兩個關鍵的問題:
第一,需要處理的資料在 什麼地方?
第二呢,是需要處理的資料 有多長?
這兩個問題 是我們 程式設計的基礎, 如果不知道資料從何而來,其規模大小
再優秀的計算機也是會無能為力啦
在這裡先定義兩個符號 reg 和 sreg :
reg 表示暫存器 : ax, bx, cx, dx 以及它們切割出來的 8位暫存器, sp, bp, si, di
sreg 表示段暫存器: ds, ss, cs, es
上面的暫存器,只有bp沒有介紹過,先單獨說一下 bp 這是乙個功能,類似於 bx 的 暫存器,只不過,不是通用暫存器
bp 的段位址 存放在 ss 中, 允許 sreg:[bp] 進行記憶體訪問
先來解決第乙個問題,資料在什麼地方?
絕大部分 機器指令 都是用來處 理處理資料 的 指令,畢竟計算機設計的初衷就是 資料處理
資料處理指令分類三類:
讀取 寫入 運算
對於 機器指令 來說呢,它不關心數值,只關心 機器指令執行前一刻,資料的位置
而在這一時刻, 資料一般會在 3 個位置: cpu 內部 記憶體 埠
mov bx, [0] 記憶體
movbx, ax cpu 內部,暫存器
movbx, 01h cpu 內部,指令緩衝器
那麼,在 組合語言 中如何表達 資料所在位置?
立即數:
對於直接包含在 指令 中的 資料, 彙編稱為立即數
mov ax, 1
add ax, 200h
or ax, 0dfh
mov al, 'a'
暫存器:
資料 儲存在暫存器內部
movax, bx
movds, ax
push
ds
pop sp
sa + ea:
bx 的預設的 sreg 為 ds
bp 的預設的 sreg 為 ss
當然也允許 目前指出 sreg
mov ax, ds:3[bx+si]
mov dx, es:
3[bp+di]
每個 資料小姐姐 都有乙個家,有家就會有位址,彙編小姐姐 該如何找到 資料小姐姐 的家呢
有 5 種方法,分別是:
直接定址法: [idata]
暫存器相對定址法:[bx]
暫存器間接定址法: [bx].idata(結構體)
idata[si](陣列)
[bx][idata](二維陣列)
基變定址法: [bx][si](二維陣列)
相對基變定址法: [bx].idata[si](**結構中的陣列)
idata[bx][si]
下面我就來略微的解釋一下這幾種定址方法(個人能力有限):
某天,資料小姐姐約 cpu 出去玩, 資料小姐姐 直接 給了位址,說咱們在 這個地方見面,這就是 直接定址法, 直接按著位址走就可以了
如果資料小姐姐說 先去咖啡廳碰面(暫存器),然後再告訴你去哪玩,這就是 暫存器相對定址法, 通過乙個指標(暫存器)先訪問指標,才能訪問對應的資料
如果資料小姐姐說 先去咖啡廳碰面(暫存器),然後走了幾百公尺,才再告訴你去哪玩,這就是 暫存器相對定址法, 通過乙個指標(暫存器)先訪問指標,才能訪問對應的資料
如果小姐姐說 先去咖啡廳然廳,然後去肯德基,最後再告訴你去哪玩,這個就是 基位址變址定址法,通過 基位址 經過 兩個 暫存器的組合後,訪問資料
如果小姐姐說 先去咖啡廳然廳,然後去肯德基,走了個幾百公尺才告訴你去哪玩,這就是 相對基位址變址定址法 通過 基位址 經過 兩個 暫存器的組合後 又跑了一段路,訪問資料
接下來解決下乙個問題,資料的長度?
其實,這個問題在之前就提到過了, mov ax, [bx] 是如何知道資料長度的? 當然是通過暫存器的位數
但是 按照我們之前的設定 mov es:[bx], ds:[bx] 就無法正常執行了, 因為 cpu 無法感知到資料的大小,
所以,這時候 新的宣告方式就出現了, word / byte ptr 宣告 字/位元組 型別的資料
eg:
mov byte ptr es:[bx], ds:[bx]
mov word ptr es:[bx], ds:[bx]
好了,到這裡程式設計的基本問題算是解決了,接下去該學點新的指令了
div 指令:
這是乙個除法指令,與 add 和 sub 不同的是, div 對 除數 和 被除數 有著一定的約束條件
除數: 有 8位 和 16位 兩種, 在乙個 reg 或者 記憶體單元 中
被除數: 預設放在 ax 或 ax + dx 中 如果 除數 為 16 位,則被除數 32 位, ax 儲存低位, dx 儲存高位
如果除數 8 位, 則被除數 16 位
結果: 除數為 8 位, al 存商, ah 存餘數
除數為 32 位, ax 存商, dx 存餘數
思考一下:div ffffh, 1 會怎麼樣,當然是因為,除數過大會溢位
偽指令 dd:
表示 該資料為雙字
eg:
data segmentdb 1dw
1dd
1data ends
操作符 dup:
定義重複資料
dd 3 dup (2) == dd 2,2,2
dw 3 dup ('abc','abc') === dw 'abcabcabcabcabcabc'
組合語言學習
參考書籍 組合語言 王爽 著 清華大學出版社 選單導航 一 彙編基礎知識 二 暫存器和常見彙編指令演示 一 基礎知識 1 彙編指令是機器指令的助記符,同機器指令一一對應 2 每一種cpu都有自己的彙編指令集 3 cpu可以直接使用的資訊在儲存器中存放 4 在儲存器中指令和資料沒有任何區別,都是二進位...
組合語言學習
持續更新 彙編指令 1.mov指令 mov是乙個傳送指令,可以實現以下操作 有一點需要注意,資料不能直接傳給段暫存器,比如mov ds,100h就是錯誤的。但是可以將其他暫存器中的值賦給段暫存器。段暫存器有cs,ds,ss,es等。如果你想知道為什麼,那就可以去了解一下關於每條指令的硬體實現。後面還...
組合語言學習筆記
學習參考資料 大灰狼 講彙編 資料匯流排,位址匯流排,控制匯流排。位址匯流排有多少條就決定了cpu最大的記憶體使用量。80386有32位位址匯流排,所以它的定址能力就是4g.暫存器 通用暫存器,段暫存器,ax暫存器 通用暫存器,存放資料。高位位元組ah,低位位元組al。實體地址表示方法 位址加法器,...