日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言随笔(2)-CPU指令周期和无条件转移指令(包括call和ret指令)

發(fā)布時間:2025/6/17 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言随笔(2)-CPU指令周期和无条件转移指令(包括call和ret指令) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

指令周期

??????在執(zhí)行一條指令的過程中,由CPU完成的操作序列構(gòu)成一個指令周期,通常每一個指令周期一定會包含兩個子周期:即取指令子周期執(zhí)行指令子周期。在取指令子周期,CPU將要執(zhí)行的指令從內(nèi)存中CS:IP指向的存儲單元內(nèi)讀出(x86由PC指向內(nèi)存中要執(zhí)行的指令);在執(zhí)行指令子周期,執(zhí)行指令指定的操作。另外,將檢查中斷請求的操作也常作為一個子周期包含在指令周期中,即中斷子周期
??????1,取指子周期:它所包含的微操作一般為:對于8086cpu來說,計算出實際指令存放的物理地址,將其送上地址總線傳送到內(nèi)存,取得該地址上存儲的指令,隨后IP中的值自動增加。
??????2,執(zhí)行指令子周期:執(zhí)行每一條指令所指定的操作。
??????3,中斷子周期:檢查當前是否有中斷請求。若有的話,8086CPU從中斷信息中取得中斷類型碼,將標志寄存器的值入棧(pushf和popf),設(shè)置標志寄存器相關(guān)位上的值,將當前的CS:IP入棧,最后通過中斷類型碼將CS:IP指向相應(yīng)的中斷處理程序。

代碼段

??????之前講過,在編程時可以根據(jù)需要將一組內(nèi)存單元定義為一個段。當我們將一段代碼存放在合適的內(nèi)存單元中時,‘合適’指的是:代碼長度不能大于64KB,必須是連續(xù)的內(nèi)存單元,內(nèi)存的起始地址為16的整數(shù)倍,這樣就可以將其定義為一個代碼段。通過設(shè)置CS:IP指向其起始地址就可以執(zhí)行此代碼段。

轉(zhuǎn)移指令

??????可以修改IP,或同時修改CS和IP的指令統(tǒng)稱為轉(zhuǎn)移指令。其中:
??????只修改IP的轉(zhuǎn)移行為稱為段內(nèi)轉(zhuǎn)移,且當IP的修改范圍為-128-127時,稱為段內(nèi)短轉(zhuǎn)移;當IP的修改范圍為-32768-32767時,稱為段內(nèi)近轉(zhuǎn)移。同時修改CS和IP的轉(zhuǎn)移行為稱為段間轉(zhuǎn)移。
??????也可分為:無條件轉(zhuǎn)移指令,條件轉(zhuǎn)移指令,循環(huán)指令,過程和中斷。

無條件轉(zhuǎn)移指令(jmp)

??????jmp指令一般要給出兩種信息:(1)轉(zhuǎn)移的目的地址(2)轉(zhuǎn)移的距離(段間轉(zhuǎn)移、段內(nèi)短轉(zhuǎn)移或段內(nèi)近轉(zhuǎn)移)
??????1,根據(jù)相對位移進行轉(zhuǎn)移的jmp指令:
??????這類轉(zhuǎn)移包含兩種jmp轉(zhuǎn)移指令,均屬于段內(nèi)轉(zhuǎn)移。分別是段內(nèi)短轉(zhuǎn)移 jmp short 標號和段內(nèi)近轉(zhuǎn)移 jmp near ptr 標號。含義都是轉(zhuǎn)移到標號處執(zhí)行指令。轉(zhuǎn)移位移分別用8位和16位補碼來表示。
示例代碼如下:

assume cs:codesg codesg segmentstrart: mov ax,0mov bx,0jmp short sadd ax,1s:inc axcodesg ends end start

在debug中的對應(yīng)的機器碼如下:

0BBD:0000 B80000 MOV AX,0000 0BBD:0003 B80000 MOV BX,0000 0BBD:0006 EB03 JMP 000B 0BBD:0008 050100 ADD AX,0001 0BBD:000B 40 INC AX

??????其中EB03機器碼中的03表示目標指令所在地址基于當前IP的相對位移。在jmp short s的執(zhí)行指令子周期前,IP已經(jīng)變?yōu)?008,所以在執(zhí)行指令子周期中,CPU通過相對位移03計算出目標指令地址應(yīng)該為0008+03,即應(yīng)跳轉(zhuǎn)到000B處,故設(shè)置IP值為000B,從而執(zhí)行指令子周期結(jié)束。
??????jmp near ptr 標號也是采用類似的方式。
??????2,轉(zhuǎn)移的目的地址在指令中的jmp指令
??????jmp far ptr 標號,實現(xiàn)的是段間轉(zhuǎn)移。執(zhí)行效果為:用標號的段地址和偏移地址分別來修改CS和IP。
??????3,轉(zhuǎn)移地址在寄存器中的jmp指令
??????jmp reg,效果為:將該寄存器中的值賦給IP。實現(xiàn)的是段內(nèi)近轉(zhuǎn)移。
??????4,轉(zhuǎn)移地址在內(nèi)存中的jmp指令
??????jmp word ptr 內(nèi)存單元地址,效果為:在內(nèi)存單元地址開始處存放著一個字,是轉(zhuǎn)移的目的偏移地址(用來修改IP)。實現(xiàn)段內(nèi)轉(zhuǎn)移。
??????jmp dword ptr 內(nèi)存單元地址,效果為:在內(nèi)存單元地址開始處存放著兩個字,高地址處的是轉(zhuǎn)移的目的段地址(用來修改CS),低地址處是轉(zhuǎn)移的目的偏移地址(用來修改IP)。實現(xiàn)段間轉(zhuǎn)移。

循環(huán)指令(loop)

??????loop指令為循環(huán)指令,所有的循環(huán)指令都是短轉(zhuǎn)移,即在其機器碼中包含轉(zhuǎn)移的位移,而不是目的地址。且對IP的修改范圍為-128-127,采用8位補碼來表示。
??????loop 標號,效果為:將CX寄存器中的值減一,如果CX不為0,就跳轉(zhuǎn)到標號處開始執(zhí)行(jmp short 標號);若CX為0,就什么也不做,程序向下繼續(xù)執(zhí)行。

條件轉(zhuǎn)移指令(jcxz)

??????jcxz指令為有條件轉(zhuǎn)移指令,所有的有條件轉(zhuǎn)移指令都是短轉(zhuǎn)移,即在其機器碼中包含轉(zhuǎn)移的位移,而不是目的地址。且對IP的修改范圍為-128-127,采用8位補碼來表示。
??????jcxz 標號,效果為:如果CX為0,就跳轉(zhuǎn)到標號處開始執(zhí)行(jmp short 標號);如果CX不為0,就什么也不做,程序向下繼續(xù)執(zhí)行。

實現(xiàn)子程序設(shè)計的轉(zhuǎn)移指令(call和ret)

??????一:call指令
??????CPU執(zhí)行call指令的操作為兩步:將當前的IP或CS和IP壓入棧中;進行轉(zhuǎn)移。
??????call指令不能實現(xiàn)短轉(zhuǎn)移,除此之外,call指令實現(xiàn)轉(zhuǎn)移的原理和jmp指令的原理相同。簡單的講解如下:
??????1,根據(jù)位移進行轉(zhuǎn)移的call指令
??????call 標號,效果為:將當前的IP壓棧后(push IP),轉(zhuǎn)到標號處執(zhí)行命令(jmp near ptr 標號)。轉(zhuǎn)移范圍為:-32768-32767,采用16補碼的段內(nèi)近轉(zhuǎn)移。
??????下面程序執(zhí)行后,IP中的值為0006。因為當call 指令執(zhí)行時,IP已經(jīng)為0006了(取指子周期),call執(zhí)行的功能是將IP入棧并跳到標號處繼續(xù)執(zhí)行程序,POP AX將原IP值0006賦給ax。

0BBD:0000 B80000 MOV AX,0000 0BBD:0003 E80100 CALL S 0BBD:0006 40 INC AX 0BBD:0007 58 S: POP AX

??????2,轉(zhuǎn)移目的地址在指令中的call指令
??????call far ptr 標號,實現(xiàn)段間轉(zhuǎn)移。效果為:將CS入棧(push CS),將IP入棧(push IP),令CS為標號所在段的段地址,IP為標號所在段中的偏移地址,即jmp far ptr 標號。
??????3,轉(zhuǎn)移地址在寄存器中的call指令
??????call reg,效果為:將IP入棧(push IP),令I(lǐng)P中的值為該寄存器中的值(jmp reg)。
??????4,轉(zhuǎn)移地址在內(nèi)存中的call指令
??????call word ptr 內(nèi)存單元地址,效果為:將IP入棧(push IP),令I(lǐng)P中的值為內(nèi)存單元地址開始處的一個字(jmp word ptr 內(nèi)存單元地址)。
??????call dword ptr 內(nèi)存單元地址,效果為:將CS入棧(push CS),將IP入棧(push IP),在內(nèi)存單元地址開始處存放著兩個字,高地址處的是轉(zhuǎn)移的目的段地址(用來修改CS),低地址處是轉(zhuǎn)移的目的偏移地址(用來修改IP),即為jmp dword ptr 內(nèi)存單元地址。
??????二:ret和retf指令
??????1,ret指令,效果為:用棧頂?shù)臄?shù)據(jù)來修改IP的內(nèi)容(pop IP),來實現(xiàn)近轉(zhuǎn)移。
??????2,retf指令,效果為:用棧頂?shù)臄?shù)據(jù)來修改CS和IP的內(nèi)容(先pop IP,后pop CS),來實現(xiàn)遠轉(zhuǎn)移。

總結(jié)

以上是生活随笔為你收集整理的汇编语言随笔(2)-CPU指令周期和无条件转移指令(包括call和ret指令)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。