這篇文章主要介紹了匯編語言 寄存器內存訪問原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
在內存中字的存儲
這段話的主要意思是:一個字=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),所以段寄存器采用以下方法賦值
字的傳送
問題1:
內存中的情況如下圖,寫出下面指令執行后寄存器ax,bx,cx中的值?
解析:
問題2:
內存中的情況如下圖,寫出下面指令執行后寄存器ax,bx,cx中的值?
解析:
NB的move指令
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 |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持html5模板網。