寄存器(記憶體通路)
3.1 記憶體中字的存儲
- 把0位址開始存放 4e20
- 0号單元是低位址單元,1号單元是高位址單元
20 | |
---|---|
1 | 4e |
2 | 12h |
- 任何兩個位址連續的記憶體單元,n号單元和n+1号單元,可以将他們看成兩個記憶體單元,也可以看成一個位址為n的字單元中的高位位元組單元和低位位元組單元
- 高位單元:n+ 低位單元:n
3.2 DS和[Address]
- CPU要賭氣一個記憶體單元的時候,必須先給出這個記憶體單元的位址
- 記憶體位址是由:段位址和偏移位址組成的
- CPU中有一個DS寄存器,通常用來存放要通路的資料的段位址
mov bx, 1000
mov ds, bx
mov al, [0]
- 上面三條指令将10000(1000:0)中的資料讀到al中
mov al, [0]
- 已知的mov指令可以用完成兩種傳送功能
-
- 将資料直接送入寄存器
- 将寄存器中的内容送入另一個寄存器中
-
除此之外,mov指令還可以将一個記憶體單元中的内容送入一個寄存器
*上面就是 将記憶體偏移位址為0的内容送入ax低八位(al)寄存器
- mov指令格式:
- mov 寄存器,記憶體單元位址
- […]表示一個記憶體單元,”[…]“中的0表示記憶體單元的偏移位址
- 執行指令時 CPU會自動取DS中的資料為記憶體單元的段位址
-
- 将1000放入ds ,但是不會能直接放入到ds,ds是一個段寄存器 不是通用寄存器,不支援将資料直接送入 需要借助通用寄存器
- 用mov al, [0] 完成傳送 (mov指令中的【】說明操作對象是一個記憶體單元的偏移位址,是0 它的段位址預設放在ds中
- 資料 -> 通用寄存器 -> 段寄存器
- Mov bx, 1000 為将資料送入寄存器
- mov bx, 1000; mov ds, bx; mov [0], al; 将資料從寄存器送入記憶體單元 最終的結果:就是把al寄存器中的内容送入[0](1000:0)記憶體單元中
- mov bx, 1000; mov ds, bx; mov al, [0]; 将記憶體單元送入寄存器 最終結果:就是把[0](1000:0)記憶體單元送入al寄存器
3.3 字的傳送
- 16結構的從CPU 有16根資料線,是以一次性傳送16位的資料,也就是一次性傳送一個字
-
mov bx, 1000 mov ds, bx # 上面為:将1000送入到ds中 設定預設段位址為:1000 mov ax, [0] # 将1000:0處的字型資料送入 ax, 因為是ax 16位寄存器 是以是字資料,al為8位寄存器就是直接資料 也可以稱為16個位元組資料或一個字資料 mov [0], cx # 将cx中的16位資料送到1000:0處
彙編(四)字的存儲、DS和[address]、字的傳送、mov、add、sub指令、資料段 彙編(四)字的存儲、DS和[address]、字的傳送、mov、add、sub指令、資料段 -
答案:執行步驟詳解
mov ax, 1000 # 将1000指派給ax ax=1000 mov ds, ax # 将ax指派給ds為預設段位址 ds=1000 mov ax, [0] # 将 ds:0(23) 指派給ax 因為ds:0是位元組單元 而ax是字單元 是以自動會把高八位ds:1(11)拉出來 是以ax=1123 mov bx, [2] # 将 ds:2(22) 指派給bx 拖一個高位址 bx=6622 mov cx, [1] # 将 ds:1(11) 指派給cx 拖一個告地狀 cx=2211 add bx, [1] # 将 ds:1(11) 拖一個高位址 2211加上bx(6622) bx=8833 add cx, [2] # 将 ds:2(22) 6622+2211 cx=8833 mov al, [1] # 如果是指派給位元組寄存器 那麼 al的值為 ds:1(11) ax 8811
-
第二題答案:
-
彙編(四)字的存儲、DS和[address]、字的傳送、mov、add、sub指令、資料段 -
彙編(四)字的存儲、DS和[address]、字的傳送、mov、add、sub指令、資料段 mov ax, 1000 # 将ax設定為 1000 mov ds, ax # 将段位址設定為 ax=1000 mov ax, 2c34 # 将ax 設定為2c34 十進制:11316 mov [0], ax # 将1000:0 設定為ax mov 10000:0, ax mov bx, [0] # 将bx 設定為 1000:0 = ds:0 = 2c34 sub bx, [2] # bx = bx-ds:2 拖一位高位址 ds:2 = 1122 bx = 2c34 - 1122 = 1b12 mov [2], bx # 将ds:2的值設定為 bx 1b12
3.4 mov、add、sub指令
-
mov指令的幾種形式
-
- mov 寄存器, 資料 # 這裡的寄存器為通用寄存器
- mov 寄存器,寄存器
- mov 寄存器,記憶體單元
- mov 記憶體單元,寄存器
- mov 段寄存器,寄存器
- mov 寄存器,段寄存器
-
add sub 是一樣的
-
彙編(四)字的存儲、DS和[address]、字的傳送、mov、add、sub指令、資料段 3.5 資料段
- 我們可以根據需要将一組記憶體單元定義為一個段(可以是代碼段、資料段等)
- 我麼可以将一組資料長度為n(n<=64)、位址連續、起始位址為16的倍數的記憶體單元當做專門存資料的記憶體空間,進而定義了一個資料段。
- 比如123B0~123B9這個空間來存放資料:
- 段位址:123B
- 長度:10位元組 (0~9 十個位元組)
- 如何通路資料段中的資料?
- 将一段記憶體當做數段,是我們在程式設計的時候的一種安排,我們可以在具體操作的時候,用ds存放資料段的段位址,在根據需要,用相關指令通路資料段中的具體單元
- 要累加這個資料段中的前3個單元中的資料,代碼如下:
-
mov ax, 123b mov ds, ax mov al, [0] # 隻有用8位位元組寄存器(al)才可以,不然會拖一個高位址記憶體單元過來 add al, [1] add al, [2]
- 要累加這個資料段中前3個字型資料,代碼如下:
mov ax, 123b mov ds, ax mov ax, [0] # 一個字型資料 占兩個記憶體單元,是以便宜位址是0,2,4 add ax, [2] add ax, [4]
小結:
- 字在記憶體中存儲時,要用兩個連續的記憶體單元來存放,字的地位位元組存放在低位址單元中。高位位元組存放在高位址單元中
- 用mov 指令要通路記憶體單元,可以在mov指令中給出單元的偏移位址,此時段位址預設在ds寄存器中
- [address] 表示一個 段位址為ds 偏移位址為address的記憶體單元
- 在記憶體和寄存器之間傳送字型資料時。高位址單元和高8位寄存器、低位址單元和低8位寄存器相對應。
- mov、add、sub 是具有兩個操作隊形的指令 、jmp(無條件跳轉)是具有一個操作對象的指令
- 可以根據自己的推測在 debug中實驗指令的格式是否正确 以及結果