在內存中字的存儲
這段話的主要意思是:一個字=2B=16bit,CPU中是用兩個內存單元儲存一個字(假如獲取0地址存放的字型數據,就是獲取它的高位字節0+1位和低位字節0位的數據,數據由高地址位向低地址位讀)
問題:
(1)0地址單元中存放的字節型數據是多少? # 20H
(2)0地址字單元中存放的字型數據是多少? # 4e20H
(3)2地址字單元中存放的字節型數據是多少? # 12H
(4)2地址單元中存放的字型數據是多少? # 0012H
(5)1地址字單元中存放的字型數據是多少? # 12aEH
結論:就是我上面說的,字型數據就是它和它的下一位地址單元的數據(數據由高地址位向低地址位讀)
數據段寄存器DS和偏移量[address]
用法和cs和ip差不多,都是段寄存器的值*16+偏移量的值
為給DS數據段寄存器值
因為CPU的段寄存器都比較害羞,沒法給他們直接賦值(cs代碼寄存器用的是jmp cs:ip),所以段寄存器采用以下方法賦值
mov ax,1234H # 將ax寄存器賦值為1234H mov ds,ax # 通過ax寄存器 間接賦值
字的傳送
mov ax,[1] # []中的是偏移量 意思是將12341內存位置的字形數據賦給ax寄存器 mov al,[1] # 將12341內存位置的字節形數據賦給al(低位)寄存器 mov [1],ax # 將ax寄存器字形數據賦給12341內存位置的值 mov [1],al # 將al寄存器的字節形數據賦給12341內存位置
問題1:
內存中的情況如下圖,寫出下面指令執行后寄存器ax,bx,cx中的值?
解析:
問題2:
內存中的情況如下圖,寫出下面指令執行后寄存器ax,bx,cx中的值?
解析:
NB的move指令
mov 通用寄存器,數據 # mov ax,1234H mov 通用寄存器,寄存器 # mov bx,ax / mov bx,ds(將段寄存器的值賦給通用寄存器) mov 段寄存器,寄存器 # mov ds,ax(因為無法直接給段寄存器賦值,所以用通用寄存器當中介) mov 內存單元,寄存器 # mov [0],ax(將ax寄存器中的值賦給ds*16+0這個內存單元) mov 內存單元,寄存器 # mov ax,[0](內存單元ds*16+0的值賦給ax寄存器)
sub,add指令
數據段
我們上面操作的實際上就是數據段,具體來看下是怎樣操作數據段的
累加123B0H~123BAH的內存單元的操作
小結:
(1)字在內存中存儲時 ,要用兩個地址連續的內存單元來存放,字的低位字節存放在低地址單元中,高位字節存放再高地址單元中。
(2)用 mov 指令要訪問內存單元,可以在mov指令中只給出單元的偏移地址,此時,段地址默認在DS寄存器中。
(3)[address]表示一個偏移地址為address的內存單元。
(4)在內存和寄存器之間傳送字型數據時,高地址單元和高8位寄存器、低地址單元和低8位寄存器相對應。
(5)mov、add、sub是具有兩個操作對象的指令。jmp是具有一個操作對象的指令。
(2) 內存中的情況如圖3.6所示
各寄存器的初始值:cs=2000h,ip=0,ds=1000h,ax=0,bx=0;
① 寫出CPU執行的指令序列(用匯編指令寫出)。
② 寫出CPU執行每條指令后,CS、IP和相關寄存器的數值。
③ 再次體會:數據和程序有區別嗎?如何確定內存中的信息哪些是數據,哪些是程序?
答案:我以為jmp了以后cp的值也會改變,實際上就是它jmp的內個CP:IP
指令序列 |
CS |
IP |
DS |
AX |
BX |
|
初始值 |
2000h |
0 |
0 |
0 |
0 |
|
1 |
mov ax,6622h |
2000h |
3h |
0 |
6622h |
0 |
2 |
jmp 0ff0:0100 |
ff0h |
100h |
0 |
6622h |
0 |
3 |
mov ax,2000h |
ff0h |
103h |
0 |
2000h |
0 |
4 |
mov ds,ax |
ff0h |
105h |
2000h |
2000h |
0 |
5 |
mov ax,[8] |
ff0h |
108h |
2000h |
c389h |
0 |
6 |
mov ax,[2] |
ff0h |
10bh |
2000h |
ea66h |
0 |