匯編語言:寄存器(內存訪問)

一篇前言

這是一系列的匯編語言學習的讀書筆記,以及一些自己的理解系列文章。我想我會在循序漸進的學習中,寫下對匯編的點點滴滴,一方面是給自己立一個短期的小目標,另一方面,如果您有緣看到了這一系列的文章,希望對您有所幫助。

內存中字的存儲

CPU中,用16位存儲一個字(word),那么32位計算機中有雙字(double word),那么64位CPU就是4個字。高8位存放高位字節(jié),低8位存儲低位字節(jié)。而內存單元是以字節(jié)為單位存放的,則一個字要用到2個連續(xù)地址的內存單元來存放。這個字的高位字節(jié)存放在高位地址單元中,低位字節(jié)存放在低位地址單元中。比如我們從0地址開始存放4E20H,這種情況如下圖


圖中,我們用0和1兩個連續(xù)的內存單元存放數(shù)據(jù)4E20H,0、1兩個加起來存儲了一個字,這兩個內存單元可以看作是,一個起始地址為0的字單元。對于這個字單元來說,0號單元是低地址單元,1號單元是高地址單元。
我們提出字的概念:字單元,即存放一個字型數(shù)據(jù)(16位)的內存單元,由2個連續(xù)的內存單元組成。我們將起始地址為N的字單元,稱為N地址字單元

DS 和 [address]

在前面的文章我們說過,CPU要想讀取內存,必須要給出內存單元的物理地址。在8086CPU中,給出內存物理地址的方式由 段地址 * 16 + 偏移地址,而段地址,保存在段寄存器中。前面我們學到CS中存放指令的段地址,那么8086還提供一個段寄存器DS,用來存放要訪問的數(shù)據(jù)的段地址。比如我們要讀取內存單元地址為10000H中的數(shù)據(jù),我們可以用如下的程序訪問:

mov bx,1000H
mov ds,bx
mov al,[0]

前面我們說過,mov指令是傳送指令。如mov ax,8可以將8送入寄存器ax中,我們也可以使用mov指令直接將內存單元中的數(shù)據(jù)送入一個寄存器中,顯然此時mov指令的格式應該是:mov 寄存器,內存單元地址。
我們可以用 “[...]” 這種方式,表示一個內存地址。[xxx]括號中的xxx表示內存單元的偏移地址。我們知道,只有偏移地址是無法定位一個內存單元的,使用[xxx]時,8086CPU會自動取段寄存器DS中的數(shù)據(jù)作為要訪問的內存單元段地址。
如果我們想,取得10000H內存單元中的數(shù)據(jù),我們可以使用mov al,[0]這個樣的方式從1000:0的內存單元傳送到寄存器al中,這條指令執(zhí)行之前,必須要讓DS的值為1000H,那么如何修改DS的內容呢,前面我們說過mov ax,3可以將3送入寄存器ax中,但是8086CPU并不支持將數(shù)據(jù)直接送入段寄存器中,DS是一個段寄存器,所以并非如此,只好用一個通用寄存器來進行中轉,即先把1000H送入一般的通用寄存器,可以是ax,cx,bx等,再講ax或bx的內容送入ds中。
例如 mov bx,1000 mov ds,bx

字的傳送

前面我們使用mov 指令在內存和寄存器之間進行字節(jié)型數(shù)據(jù)的傳送。8086CPU是16位的結構,有16根數(shù)據(jù)總線,可以一次傳送16位數(shù)據(jù)(1個字word),只要在mov 指令中給16位的寄存器就可以進行字的傳送了。

mov al,[0]    //字節(jié)型數(shù)據(jù)傳送,傳送的是8位
mov ax,[0]    //字型數(shù)據(jù)傳送,傳送的是連續(xù)的2個內存單元 16位
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容