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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

操作符offset 和 jmp指令

發(fā)布時(shí)間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作符offset 和 jmp指令 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(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處:

代碼如下:

;問題:有如下程序段,填寫兩條指令,使改程序在運(yùn)行中將s處的第一條指令復(fù)制到s0處: assume cs:code code segments: mov ax,bx ;mov ax,bx機(jī)器碼占兩個(gè)字節(jié)mov si,offset smov di,offset s0mov dx,cs:[si] ;數(shù)據(jù)從哪里來mov cs:[di],dx ;數(shù)據(jù)到哪里去s0: nop ;cpu遇到nop指令什么都不做,nop指令占一個(gè)字節(jié)nop code ends end s

JMP指令

8086CPU執(zhí)行過程
①CPU從cs和ip所組合出來的地址讀取數(shù)據(jù),將指令放到指令緩沖器中
②IP=IP+所讀指令的字節(jié)數(shù)
③執(zhí)行指令緩沖器中的內(nèi)容,跳轉(zhuǎn)到第一步

jmp smov bx,1000H s: mov ax,1000H ;由觀察可得此時(shí)**JMP指令的機(jī)器碼是EB04**

再加一條指令:

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(十六位位移)

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的操作符offset 和 jmp指令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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