匯編語言之寄存器詳解
上圖是cpu中三個(gè)組成部分:寄存器 運(yùn)算器 控制器。其中寄存器是cpu中程序員用指令讀取的唯一部件(調(diào)劑界面中的 寄存器窗口)。如果是16位cpu,就是處理,傳輸,暫時(shí)存儲(chǔ)的數(shù)據(jù)長度都是16位。所以16位的cpu,寄存器也是16位?!秴R編語言》這本書中使用的是16位寄存器位例子來講的,所以下面的內(nèi)容也都是16位寄存器的。
ps:查看處理器型號(hào)以及幾核cpu,我現(xiàn)在的電腦4核64位
寄存器名字
16位的寄存器有:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。
32位寄存器就是前面加個(gè)E,64位前面加個(gè)R。
vs中解決方案平臺(tái)選擇x86——32位寄存器,可以存數(shù)32位二進(jìn)制數(shù)據(jù)
vs中解決方案平臺(tái)選擇x64——64位
各種類型的寄存器
在下面介紹各個(gè)寄存器的時(shí)候,都用16位的寄存器作為介紹。同種類型的32位和64位寄存器功能一樣,只是處理的數(shù)據(jù)寬度更大了。同時(shí)介紹一些匯編指令(匯編指令不區(qū)分大小寫)。
1.通用寄存器——AX BX CX DX
作用:存放一般性的數(shù)據(jù)
傳送指令:move
mov 轉(zhuǎn)移指令,大部分的寄存器都可以用這個(gè)指令來改變其值。常用的有:不僅限于下面幾種
1.move 某一個(gè)合法寄存器 某一個(gè)合法寄存器
將一個(gè)寄存器的內(nèi)容傳送到另一個(gè)寄存器
比如:move 段寄存器(ds,cs),通用寄存器——段寄存器的值不能直接通過數(shù)據(jù)來設(shè)定
2.move 某一個(gè)合法寄存器 數(shù)據(jù)
將數(shù)據(jù)直接傳入寄存器
3.move 某一個(gè)合法寄存器 [內(nèi)存單元的偏移地址]
將一個(gè)內(nèi)存單元中的內(nèi)容存入一個(gè)寄存器中,后面將DS寄存器的時(shí)候再講。
算術(shù)運(yùn)算指令:add,sub
add 寄存器,數(shù)據(jù)/寄存器/內(nèi)存單元
add 內(nèi)存單元,寄存器
(
如何記住一個(gè)二進(jìn)制數(shù)據(jù)左移1位相當(dāng)于乘以2,左移n位,相當(dāng)于乘以2的N倍:
一個(gè)10進(jìn)制的數(shù)左移1位,相當(dāng)于乘以10,左移n位,相當(dāng)于乘以10的N倍。
)
2.CS,IP——代碼段
CS(code)
IP(instruction pointer)
是最關(guān)鍵的兩個(gè)寄存器,代碼段寄存器和指令指針寄存器 ,他們的內(nèi)容提供了cpu要執(zhí)行指令的地址。
而cpu就是一直重復(fù)讀指令,執(zhí)行指令的過程。cpu就認(rèn)這個(gè)指向的地址為指令,然后進(jìn)行執(zhí)行指令,所以把 代碼段的起始地址設(shè)置成cs:ip,讓程序開始執(zhí)行。
1:從cs:ip(段地址的方式)指向的內(nèi)存單元中讀取指令,讀進(jìn)來以后進(jìn)入指令緩存器
2:ip = ip + 所讀指令的長度,從而指向下一條指令
3:執(zhí)行指令
4:回到第一步
疑問:
1. 怎么知道指令的長度的
2.什么時(shí)候修改cs 和 ip 的值的 (下面介紹)
最簡單的轉(zhuǎn)移指令——jmp
用來改變cs和ip的值的指令,CS*16 + IP 指向的內(nèi)容被當(dāng)作指令來執(zhí)行
jmp 某一個(gè)合法寄存器——改變IP的值
用這個(gè)寄存器的值改變IP寄存器的值,含義上[ mov IP寄存器,某一合法寄存 ] ,只不是mov不能用于IP寄存器。
jmp 段地址:偏移地址——同時(shí)修改CS的值,和IP的值
含義上,[ mov CS 段地址 ,move IP 偏移地址 ]
(
8080 8085 8位機(jī)、 8086 16位機(jī)。8086的cpu16位,地址總線20位,給物理地址的方式(20位) = 段地址(16位)*16(左移4位) + 段內(nèi)偏移(16位,段最大長度是2^16 = 64k))
32位cpu 也可以開啟36位地址模式,所以也可以用用 36位物理尋址方式=段地址(32位)*16(左移四位) +段內(nèi)偏移(32位,段最大長度是2^32 =4G)
所以一個(gè)段的其實(shí)地址一定是16的倍數(shù)(16進(jìn)制表示,最后一位肯定是0)
所以看map文件中的地址 也是 使用的段+段內(nèi)偏移,只不是那個(gè)段是指的是段號(hào)。
)
3.DS——數(shù)據(jù)段
DS(data)
存放要訪問的數(shù)據(jù)的段地址,再通過加上偏移地址,把數(shù)據(jù)所在的內(nèi)存地址賦值上。
通過move指令進(jìn)行設(shè)置其值,先把其值賦值給一般寄存器,再通過一般計(jì)算器傳送給DS
move bx,1000H
move ds,bx
move al,[0]————訪問到了ds:0所指的內(nèi)存單元了
4.SS,SP——??臻g(高地址往低地址增長)
SS(stack) SP(instruction pointer)
任意時(shí)刻,ss:sp指向棧頂元素的內(nèi)存地址。
cpu不保證對(duì)棧的操作不超過空間
cpu只知道棧頂在何處(ss:sp),而不知道棧空間大小
就像cpu只知道當(dāng)前要執(zhí)行的指令在何處(cs:ip),而不知道要執(zhí)行的指令有多少
程序定義了棧段以后,把ss:sp指向我們定義的棧端就可以了
入棧出棧指令 Push 和 Pop 指令
ss:sp指向的內(nèi)存單元處的數(shù)據(jù)取出,sp = sp + 2
或者
往 ss:sp指向的內(nèi)存單元處 存入數(shù)據(jù),sp = sp - 2
push/pop 寄存器/段寄存器/[內(nèi)存單元的偏移地址](段地址由ds指示)
《匯編語言》
相關(guān)文章
使用匯編語言實(shí)現(xiàn)if else 循環(huán)函數(shù)調(diào)用的具體方法
這篇文章主要介紹了使用匯編語言實(shí)現(xiàn)if else 循環(huán)函數(shù)調(diào)用的具體方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01