操作符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(十六位位移)
相關文章
- 正確區分LJMP、AJMP、SJMP、JMP跳轉指令
- jQuery offset()和position()用法詳解jQuery
- SQL UNION 操作符 和 UNION ALL 操作符SQL
- jQuery offset()jQuery
- 【JavaScript】offset、client、scroll、mouseover和mouseenter區別JavaScriptclient
- 理解Kafka offsetKafka
- Kafka Offset StorageKafka
- MS-SQL 錯誤: The offset specified in a OFFSET clause may not be negativeSQL
- == 和 === 操作符詳細解析
- [MASM拾遺]OffsetASM
- jquery position()函式和offset()函式的區別jQuery函式
- Apr.7.2024小結——彙編中jmp和call的用法
- RxJava 學習筆記 -- 條件操作符和布林操作符RxJava筆記
- 【C】 25_#和##操作符分析
- 條件和布林操作符
- SQL UNION 和 UNION ALL 操作符SQL
- 比特幣學習筆記————附錄1 交易指令碼的操作符、常量和符號比特幣筆記指令碼符號
- 關於 MYSQL auto_increment_offset和auto_increment_incrementMySqlREM
- mysql的auto_increment_offset和auto_increment_increment配置MySqlREM
- offset與style區別
- Rocketmq offset進度管理MQ
- PHP字串offset取值特性PHP字串
- 學 Win32 彙編[28] - 跳轉指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等Win32JS
- 【C進階】17、++和--操作符分析
- 64位下JMP遠跳地址的計算方法
- Flutter 路由動畫Offset小記Flutter路由動畫
- Laravel 中 offset,limit 的使用LaravelMIT
- [譯] RxJS: 理解 publish 和 share 操作符JS
- javaScript真值和假值以及相等操作符JavaScript
- RxJava 和 RxAndroid 二(操作符的使用)RxJavaAndroid
- Spring整合Kafka實現批量消費和手動提交offsetSpringKafka
- kafka系列之(3)——Coordinator與offset管理和Consumer RebalanceKafka
- SAS JMP Statistical Discovery Pro for mac 資訊統計處理工具Mac
- RxJava操作符之建立操作符(三)RxJava
- mysql分頁-limit offset分頁MySqlMIT
- rocketMq 訊息偏移量 OffsetMQ
- kafka 0.11檢視offset命令Kafka
- Spark createDirectStream 維護 Kafka offset(Scala)SparkKafka