操作符offset 和 jmp指令
轉(zhuǎn)移指令的原理
轉(zhuǎn)移指令:可以修改IP或者同時(shí)修改CS和IP的指令(jmp、loop、call)
總的來說,轉(zhuǎn)移指令就是可以控制CPU執(zhí)行內(nèi)存中某處代碼的指令。
8086的轉(zhuǎn)移行為有一下幾類:
- 只修改ip時(shí),稱為段內(nèi)轉(zhuǎn)移,比如:jmp ax
- 同時(shí)修改cs和ip,稱為段間轉(zhuǎn)移,比如:jmp 1000:0
由于轉(zhuǎn)移指令對IP的修改范圍不同,段內(nèi)轉(zhuǎn)移,又分為:短轉(zhuǎn)移和近轉(zhuǎn)移
- 短轉(zhuǎn)移IP的修改范圍為:-128~127
- 近轉(zhuǎn)移的IP修改范圍為:-32768~32767
loop——》無條件轉(zhuǎn)移指令
jmp——》條件轉(zhuǎn)移指令
操作符offset
偽指令offset在匯編語言中的由編譯器處理的符號,它的功能是取得標(biāo)號的偏移地址。
assume cs:code code segmentstart: mov ax,offset start ;相當(dāng)于mov ax,0;start所標(biāo)記的是代碼段的第一條指令,偏移地址為0s: mov ax,offset s ;相當(dāng)于mov ax,3;s所標(biāo)記的指令是代碼段中的第二條指令,第一條指令的長度為3byte,則s的偏移地址為3 code ends end start問題:有如下程序段,填寫兩條指令,使改程序在運(yùn)行中將s處的第一條指令復(fù)制到s0處:
代碼如下:
JMP指令
8086CPU執(zhí)行過程
①CPU從cs和ip所組合出來的地址讀取數(shù)據(jù),將指令放到指令緩沖器中
②IP=IP+所讀指令的字節(jié)數(shù)
③執(zhí)行指令緩沖器中的內(nèi)容,跳轉(zhuǎn)到第一步
再加一條指令:
jmp smov bx,1000Hmov bx,1000H s: mov ax,1000H ;由觀察可得此時(shí)**JMP指令的機(jī)器碼是EB07**jmp跳轉(zhuǎn)指令編譯后的機(jī)器碼和指令的長度有關(guān)
CPU在執(zhí)行jmp指令的時(shí)候,并不需要跳轉(zhuǎn)的目的地址就可以實(shí)現(xiàn)對IP寄存器的修改,只要做一個(gè)加法就好了
編譯器如何計(jì)算指令長度?
標(biāo)號地址 - JMP指令后第一個(gè)字節(jié)的地址
JMP指令可能存在的一個(gè)問題:
s: mov ax,1000Hjmp s ;jmp在下面由標(biāo)號地址-JMP指令后第一個(gè)字節(jié)的地址計(jì)算得到:(8-D=FB)——》(8-13=-5)
計(jì)數(shù)器中是沒有減法的——》加上一個(gè)負(fù)數(shù)
涉及到補(bǔ)碼:
將一個(gè)正數(shù)變成二進(jìn)制之后按位取反(0變1,1變0),再加1
eg:5的二進(jìn)制:0000 0101
取反:1111 1010 +1 =1111 1011(FB)
jmp指令的跳轉(zhuǎn)范圍:(向前跳 or 向后跳)
;跳轉(zhuǎn)范圍也叫做位移范圍 八位位移(-128~127)
十六位位移(-32768~32767)
可以指定是八位位移還是十六位位移:
jmp short s(八位位移)
jmp near ptr s(十六位位移)
總結(jié)
以上是生活随笔為你收集整理的操作符offset 和 jmp指令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加装的硬盘进入后点不了文件夹_【装机帮扶
- 下一篇: 界面设计方法(2) — 2.界面的布局