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