數據的獲取
CPU 通過段地址和偏移地址獲取內存中的數據, 根據寄存器的大小獲取相應的字節數目: mov al,ds:[0]
ds 為段地址寄存器, [0] 表示偏移地址為 0
物理地址 = 段地址 * 0x10 + 偏移地址
從物理地址獲取數據需要注意存儲該數據寄存器的長度,下面將通過實例進行展示
- 先對目標地址
2000:0
中的數據初始化,賦值為 "123456789A`
- 寫入指令將
ds
段地址寄存器賦值為2000
: 用於尋找物理地址2000:0
(0x20_000H)
注意
ds
寄存器不能直接修改,需要通過數據寄存器間接修改
- 將內存單元中的 2000:[1], 2000:[3], 2000:[4] 分別送入
AX, BH, CL
中查看效果
可以看到根據物理地址我們其實只能定位到兩位 16 進制數,也就是 8 bit,也就是 1 字節數據,這個和 BH 或 CL 寄存器的長度是一致的,所以直接對應存儲;但是 AX 是 16 位寄存器,也就是 2 字節的長度,這時就需要向高位尋找,用於填充 AX 的高位字節,所以 AX 的值是
{2000:[2]} {2000:[1]}
數據的存儲
一個內存單元只能存儲一字節的數據, 對於 Byte 來說只需要一個內存單元即可存放;
但對於 Word(=2Byte) 則需要兩個連續的內存單元存放, 將高位字節存放到內存的高位地址, 低位字節存放到內存的低位地址中。用下面一個例子來實踐一下
- 使用
e 2000:0
修改目標內存單元的數據, 只能寫入兩位十六進制數, 也就是 8 位二進制數
-
AX, BX, CX, DX 這些寄存器的大小都是一個字
(word=2Byte=16bit)
在這我們利用AX
將兩個字節的數據存儲到內存單元中; 首先將AX
寄存器賦值1122
-
然后將
DS
寄存器(CPU默認用DS
在內存尋址) 定位到2000:0
, 現在的狀態就是賦值前的初始狀態:
不能直接修改
DS
寄存器, 需要借助A-DX
寄存器間接修改
2000:0
處的內存狀態:
- 利用
DS
寄存器將AX
寄存器中的內容放到內存單元2000:0
中, 他會按照寄存器的大小, 自動分配相鄰的兩個內存單元, 如圖所示,11
是高位字節因此放到了內存的高位地址處;
mov [0], ax
在這里
[0]
也就是[0000]
用於定義DS
的偏移地址, 合起來也就是2000:0000
的內存地址