內存中數據的存儲與獲取


數據的獲取

CPU 通過段地址和偏移地址獲取內存中的數據, 根據寄存器的大小獲取相應的字節數目: mov al,ds:[0]

ds 為段地址寄存器, [0] 表示偏移地址為 0
物理地址 = 段地址 * 0x10 + 偏移地址

從物理地址獲取數據需要注意存儲該數據寄存器的長度,下面將通過實例進行展示

  1. 先對目標地址 2000:0 中的數據初始化,賦值為 "123456789A`

  1. 寫入指令將 ds 段地址寄存器賦值為 2000: 用於尋找物理地址 2000:0 (0x20_000H)

注意 ds 寄存器不能直接修改,需要通過數據寄存器間接修改

  1. 將內存單元中的 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) 則需要兩個連續的內存單元存放, 將高位字節存放到內存的高位地址, 低位字節存放到內存的低位地址中。用下面一個例子來實踐一下

  1. 使用 e 2000:0 修改目標內存單元的數據, 只能寫入兩位十六進制數, 也就是 8 位二進制數

  1. AX, BX, CX, DX 這些寄存器的大小都是一個字 (word=2Byte=16bit) 在這我們利用 AX 將兩個字節的數據存儲到內存單元中; 首先將 AX 寄存器賦值 1122

  2. 然后將 DS 寄存器(CPU默認用 DS 在內存尋址) 定位到 2000:0, 現在的狀態就是賦值前的初始狀態:

不能直接修改 DS 寄存器, 需要借助 A-DX 寄存器間接修改

2000:0 處的內存狀態:

  1. 利用 DS 寄存器將 AX 寄存器中的內容放到內存單元 2000:0 中, 他會按照寄存器的大小, 自動分配相鄰的兩個內存單元, 如圖所示, 11 是高位字節因此放到了內存的高位地址處;
mov [0], ax

在這里 [0] 也就是 [0000] 用於定義 DS 的偏移地址, 合起來也就是 2000:0000 的內存地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM