一篇前言
這是一系列的匯編語言學(xué)習(xí)的讀書筆記紧阔,以及一些自己的理解系列文章。我想我會在循序漸進(jìn)的學(xué)習(xí)中娩脾,寫下對匯編的點點滴滴,一方面是給自己立一個短期的小目標(biāo)打毛,另一方面柿赊,如果您有緣看到了這一系列的文章,希望對您有所幫助俩功。
內(nèi)存中字的存儲
CPU中,用16位存儲一個字(word)碰声,那么32位計算機(jī)中有雙字(double word)诡蜓,那么64位CPU就是4個字。高8位存放高位字節(jié)奥邮,低8位存儲低位字節(jié)万牺。而內(nèi)存單元是以字節(jié)為單位存放的罗珍,則一個字要用到2個連續(xù)地址的內(nèi)存單元來存放洽腺。這個字的高位字節(jié)存放在高位地址單元中,低位字節(jié)存放在低位地址單元中覆旱。比如我們從0地址開始存放4E20H蘸朋,這種情況如下圖
圖中,我們用0和1兩個連續(xù)的內(nèi)存單元存放數(shù)據(jù)4E20H扣唱,0藕坯、1兩個加起來存儲了一個字,這兩個內(nèi)存單元可以看作是噪沙,一個起始地址為0的字單元炼彪。對于這個字單元來說,0號單元是低地址單元正歼,1號單元是高地址單元辐马。
我們提出字的概念:字單元,即存放一個字型數(shù)據(jù)(16位)的內(nèi)存單元局义,由2個連續(xù)的內(nèi)存單元組成喜爷。我們將起始地址為N的字單元,稱為N地址字單元
DS 和 [address]
在前面的文章我們說過萄唇,CPU要想讀取內(nèi)存檩帐,必須要給出內(nèi)存單元的物理地址。在8086CPU中另萤,給出內(nèi)存物理地址的方式由 段地址 * 16 + 偏移地址湃密,而段地址,保存在段寄存器中四敞。前面我們學(xué)到CS中存放指令的段地址勾缭,那么8086還提供一個段寄存器DS,用來存放要訪問的數(shù)據(jù)的段地址目养。比如我們要讀取內(nèi)存單元地址為10000H中的數(shù)據(jù)俩由,我們可以用如下的程序訪問:
mov bx,1000H
mov ds,bx
mov al,[0]
前面我們說過,mov指令是傳送指令癌蚁。如mov ax幻梯,8可以將8送入寄存器ax中兜畸,我們也可以使用mov指令直接將內(nèi)存單元中的數(shù)據(jù)送入一個寄存器中,顯然此時mov指令的格式應(yīng)該是:mov 寄存器碘梢,內(nèi)存單元地址咬摇。
我們可以用 “[...]” 這種方式,表示一個內(nèi)存地址煞躬。[xxx]括號中的xxx表示內(nèi)存單元的偏移地址肛鹏。我們知道,只有偏移地址是無法定位一個內(nèi)存單元的恩沛,使用[xxx]時在扰,8086CPU會自動取段寄存器DS中的數(shù)據(jù)作為要訪問的內(nèi)存單元段地址。
如果我們想雷客,取得10000H內(nèi)存單元中的數(shù)據(jù)芒珠,我們可以使用mov al,[0]這個樣的方式從1000:0的內(nèi)存單元傳送到寄存器al中,這條指令執(zhí)行之前搅裙,必須要讓DS的值為1000H皱卓,那么如何修改DS的內(nèi)容呢,前面我們說過mov ax部逮,3可以將3送入寄存器ax中娜汁,但是8086CPU并不支持將數(shù)據(jù)直接送入段寄存器中,DS是一個段寄存器兄朋,所以并非如此掐禁,只好用一個通用寄存器來進(jìn)行中轉(zhuǎn),即先把1000H送入一般的通用寄存器蜈漓,可以是ax穆桂,cx,bx等融虽,再講ax或bx的內(nèi)容送入ds中享完。
例如 mov bx,1000 mov ds,bx
字的傳送
前面我們使用mov 指令在內(nèi)存和寄存器之間進(jìn)行字節(jié)型數(shù)據(jù)的傳送。8086CPU是16位的結(jié)構(gòu)有额,有16根數(shù)據(jù)總線般又,可以一次傳送16位數(shù)據(jù)(1個字word),只要在mov 指令中給16位的寄存器就可以進(jìn)行字的傳送了巍佑。
mov al,[0] //字節(jié)型數(shù)據(jù)傳送,傳送的是8位
mov ax,[0] //字型數(shù)據(jù)傳送茴迁,傳送的是連續(xù)的2個內(nèi)存單元 16位