操作符offset 和 jmp指令
轉移指令的原理
轉移指令:可以修改IP或者同時修改CS和IP的指令(jmp、loop、call)
總的來說,轉移指令就是可以控制CPU執行記憶體中某處程式碼的指令。
8086的轉移行為有一下幾類:
- 只修改ip時,稱為段內轉移,比如:jmp ax
- 同時修改cs和ip,稱為段間轉移,比如:jmp 1000:0
由於轉移指令對IP的修改範圍不同,段內轉移,又分為:短轉移和近轉移
- 短轉移IP的修改範圍為:-128~127
- 近轉移的IP修改範圍為:-32768~32767
loop——》無條件轉移指令
jmp——》條件轉移指令
操作符offset
偽指令offset在組合語言中的由編譯器處理的符號,它的功能是取得標號的偏移地址。
assume cs:code
code segment
start: mov ax,offset start ;相當於mov ax,0
;start所標記的是程式碼段的第一條指令,偏移地址為0
s: mov ax,offset s ;相當於mov ax,3
;s所標記的指令是程式碼段中的第二條指令,第一條指令的長度為3byte,則s的偏移地址為3
code ends
end start
問題:有如下程式段,填寫兩條指令,使改程式在執行中將s處的第一條指令複製到s0處:
程式碼如下:
;問題:有如下程式段,填寫兩條指令,使改程式在執行中將s處的第一條指令複製到s0處:
assume cs:code
code segment
s: mov ax,bx ;mov ax,bx機器碼佔兩個位元組
mov si,offset s
mov di,offset s0
mov dx,cs:[si] ;資料從哪裡來
mov cs:[di],dx ;資料到哪裡去
s0: nop ;cpu遇到nop指令什麼都不做,nop指令佔一個位元組
nop
code ends
end s
JMP指令
8086CPU執行過程
①CPU從cs和ip所組合出來的地址讀取資料,將指令放到指令緩衝器中
②IP=IP+所讀指令的位元組數
③執行指令緩衝器中的內容,跳轉到第一步
jmp s
mov bx,1000H
s: mov ax,1000H ;由觀察可得此時**JMP指令的機器碼是EB04**
再加一條指令:
jmp s
mov bx,1000H
mov bx,1000H
s: mov ax,1000H ;由觀察可得此時**JMP指令的機器碼是EB07**
jmp跳轉指令編譯後的機器碼和指令的長度有關
CPU在執行jmp指令的時候,並不需要跳轉的目的地址就可以實現對IP暫存器的修改,只要做一個加法就好了
編譯器如何計算指令長度?
標號地址 - JMP指令後第一個位元組的地址
JMP指令可能存在的一個問題:
s: mov ax,1000H
jmp s ;jmp在下面
由標號地址-JMP指令後第一個位元組的地址計算得到:(8-D=FB)——》(8-13=-5)
計數器中是沒有減法的——》加上一個負數
涉及到補碼:
將一個正數變成二進位制之後按位取反(0變1,1變0),再加1
eg:5的二進位制:0000 0101
取反:1111 1010 +1 =1111 1011(FB)
jmp指令的跳轉範圍:(向前跳 or 向後跳)
;跳轉範圍也叫做位移範圍 八位位移(-128~127)
十六位位移(-32768~32767)
可以指定是八位位移還是十六位位移:
jmp short s(八位位移)
jmp near ptr s(十六位位移)
相關文章
- jmp使用
- 【JavaScript】offset、client、scroll、mouseover和mouseenter區別JavaScriptclient
- jmp跳轉的本質
- 比特幣學習筆記————附錄1 交易指令碼的操作符、常量和符號比特幣筆記指令碼符號
- Apr.7.2024小結——彙編中jmp和call的用法
- 理解Kafka offsetKafka
- RxJava 學習筆記 -- 條件操作符和布林操作符RxJava筆記
- 條件和布林操作符
- 【C】 25_#和##操作符分析
- [MASM拾遺]OffsetASM
- 【C進階】17、++和--操作符分析
- offset大家族(一)
- offset與style區別
- Rocketmq offset進度管理MQ
- javaScript真值和假值以及相等操作符JavaScript
- ES2020新特性鏈操作符 '?.'和'??'
- Spring整合Kafka實現批量消費和手動提交offsetSpringKafka
- Laravel 中 offset,limit 的使用LaravelMIT
- RxJava操作符之組合操作符(六)RxJava
- 詳解 JavaScript 建構函式和 "new" 操作符JavaScript函式
- NgRx 裡 first 和 take(1) 操作符的區別
- mysql分頁-limit offset分頁MySqlMIT
- 常見的page,client,offset系列client
- JavaScript--元素偏移量(offset)JavaScript
- Flutter 路由動畫Offset小記Flutter路由動畫
- kafka offset 過期處理策略Kafka
- Zblog unserialize(): Error at offset 2 of 686 bytesError
- rocketMq 訊息偏移量 OffsetMQ
- JavaScript in 操作符JavaScript
- 64位下JMP遠跳地址的計算方法
- 08 指令和程式
- Array and string offset access syntax with curly braces is deprecated
- 帶你讀 MySQL 原始碼:limit, offsetMySql原始碼MIT
- JavaScript中 |、& 、!!操作符JavaScript
- Java 操作符(3)Java
- RxJS操作符(一)JS
- RxJS操作符(二)JS
- 操作符詳解