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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

汇编语言之转移指令和原理

發布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言之转移指令和原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


1、引言

可以修改IP,或同時修改CS和IP的指令統稱為轉移指令。概括地講,轉移指令就是可以控制CPU執行內存

中某處代碼的指令。

8086CPU的轉移行為有以下幾類:

1. 同時修改CS和IP時,稱為段間轉移,比如:jmp 100:2a7。

2. 只修改IP時,稱為段內轉移,比如:jmp ax。

由于轉移指令對IP的修改范圍不同,段內轉移又分為“短轉移”和“近轉移”。

3. 段內短轉移IP的修改范圍為-128~127。

4. 段內近轉移IP的修改范圍為-32768~32767。

8086CPU的轉移指令分為以下幾類:

1. 無條件轉移指令(比如:jmp)

2. 條件轉移指令

3. 循環指令

4. 過程

5. 中斷

這些轉移指令轉移的前提條件可能不同,但轉移的基本原理是相同的,我們在這一章主要通過深入學習無條件

轉移指令jmp來理解CPU執行轉移指令的基本原理。

2、?jmp指令

Jmp為無條件轉移指令,可以只修改IP,也可以同時修改CS和IP。

Jmp指令要給出兩種信息:

1. 轉移的目的地址。

2. 轉移的距離(段間轉移、段內短轉移、段內近轉移)。

不同的給出目的地址的方法,和不同的轉移位置,對應有不同格式的jmp指令,下面的幾節內容中,我們以

給出目的地址的不同方法為主線,講解jmp指令的主要應用格式和CPU執行轉移指令的基本原理。

3、?依據位移進行轉移的jmp指令

Jmp short 標號(轉到標號處執行指令)。

這種格式的jmp指令,實現的是段內短轉移,它對IP的修改范圍為-128~127,也就是說,它向前轉移時可以

最多越過128個字節,向后轉移可以最多越過127個字節。Jmp指令中的“short”符號,說明指令進行的是短

轉移,jmp指令中的“標號”是代碼段中的標號,指明了指令要轉移的目的地,轉移指令執行結束后,CS:IP應該

指向標號處的指令。

請看下面一段代碼:

Mov ax, 0

Jmp short s

Add ax, 1

? S:add ax, 2

最下面那條指令中的S就是標號,jmp short s指令執行后,CS:IP指向s:add ax, 2,上面那條指令add ax,

1已被跳過,沒有被CPU執行。

在“jmp short 標號”指令所對應的機器碼中,不包含轉移的目的地址,而包含的是轉移的位移,這個位移是

編譯器根據匯編指令中的“標號”計算出來的,具體的計算方法如下圖所示:

上圖中,標號處的指令s0:inc bx的偏移地址為6,指令jmp s0后的第一個字節的偏移地址為3,位移量就是

6-3=3。

標號處的指令s:inc ax的偏移地址為0,指令jmp s下的第一個字節的偏移地址為9,位移量就是0-9=﹣9。

“Jmp short 標號”的功能為:IP=IP+8位位移:

1.8位位移=標號處的地址-jmp指令后的第一個字節的地址。

2.short指明此處的位移為8位位移。

3.8位位移的范圍為﹣128~127,用補碼表示(本教程不講解補碼,若你想了解,請看相關書籍)。

4.8位位移由編譯程序在編譯時算出。

還有一種和“jmp short 標號”功能相近的指令格式:“jmp near ptr 標號”,它實現的是段內近轉移。

“jmp near ptr 標號”的功能為:IP=IP+16位位移。

1.16位位移=標號處的地址-jmp指令后的第一個字節的地址。

2.near ptr指明此處的位移為16位位移,進行的是段內近轉移。

3.16位位移的范圍為﹣32768~32767,用補碼表示。

4.16位位移由編譯程序在編譯時算出。

上圖中,標號處的指令s0:inc bx的偏移地址為6,指令jmp s0后的第一個字節的偏移地址為3,位移量就是 6-3=3。 標號處的指令s:inc ax的偏移地址為0,指令jmp s下的第一個字節的偏移地址為9,位移量就是0-9=﹣9。 “Jmp short 標號”的功能為:IP=IP+8位位移: 1.8位位移=標號處的地址-jmp指令后的第一個字節的地址。 2.short指明此處的位移為8位位移。 3.8位位移的范圍為﹣128~127,用補碼表示(本教程不講解補碼,若你想了解,請看相關書籍)。 4.8位位移由編譯程序在編譯時算出。 還有一種和“jmp short 標號”功能相近的指令格式:“jmp near ptr 標號”,它實現的是段內近轉移。 “jmp near ptr 標號”的功能為:IP=IP+16位位移。 1.16位位移=標號處的地址-jmp指令后的第一個字節的地址。 2.near ptr指明此處的位移為16位位移,進行的是段內近轉移。 3.16位位移的范圍為﹣32768~32767,用補碼表示。 4.16位位移由編譯程序在編譯時算出。

4、?轉移地址在指令中或寄存器中的jmp指令

“Jmp far ptr 標號”實現的是段間轉移(又稱為遠轉移),功能如下: CS=標號所在段的段地址,IP=標號在段中的偏移地址; “Far ptr”指明了指令用標號的段地址和偏移地址修改CS和IP。 在“jmp far ptr 標號”指令所對應的機器碼中,包含轉移目的地的地址。 轉移的目的地在寄存器中的jmp指令,指令格式為: Jmp 16位通用寄存器。 功能:IP=16位通用寄存器 這種指令我們在前面的內容(參見2.6節)中已經講過,這里就不再詳述。

5、轉移地址在內存中的jmp指令

轉移地址在內存中的jmp指令有兩種格式: 1. “jmp word ptr 內存單元地址”(段內轉移)。 功能:從內存單元地址處開始存放著一個字,是轉移的目的偏移地址。內存單元地址可用尋址方式的任一格式 給出,比如,下面的指令: Mov ax, 123H Mov DS:[200], ax Jmp word ptr DS:[200] 執行后,IP=123H 又比如,下面的指令: Mov ax, 123H Mov [bx], ax Jmp word ptr [bx] 執行后,IP=123H 2. “jmp dword ptr 內存單元地址”(段間轉移)。 功能:從內存單元地址處開始存放著兩個字,高地址處的字是轉移的目的段地址,低地址處的字是轉移的目的 偏移地址。 CS=內存單元地址+2 IP=內存單元地址 內存單元地址可用尋址方式的任一格式給出。比如,下面的指令: Mov ax, 123H Mov DS:[200], ax Mov word ptr DS:[202], 100 Jmp dword ptr DS:[200] 執行后,CS=100H,IP=123H,CS:IP指向100:123。 又比如,下面的指令: Mov ax, 123H Mov [bx], ax Mov word ptr [bx+2], 100 Jmp dword ptr [bx] 執行后,CS=100H,IP=123H,CS:IP指向100:123。 在上面的指令中,我們接觸到了一個新的符號“dword”,它表示什么意思呢?前面我們已學過,Byte表示字 節,word表示字,dword則表示雙字。

6 、CALL指令

Call和ret指令都是轉移指令,它們都修改IP,或同時修改CS和IP,它們經常被共同用來實現子程序的設 計。這兩節,我們講解call和ret指令的原理。 CPU執行call指令時,進行兩步操作:1.將當前的IP或CS和IP壓入棧中。2.轉移。 Call指令不能實現短轉移,除此之外,call指令實現轉移的方法和jmp指令的原理相同,下面我們以給出轉 移目的地址的不同方法為主線,講解call指令的主要應用格式。 1. 依據位移進行轉移的call指令。 Call 標號(將當前的IP壓入棧后,轉到標號處執行指令)。指令執行時,它的功能相當于: Push IP Jmp near ptr 標號 2. 轉移地址在指令中的call指令。 Call far ptr 標號(實現的是段間轉移)。 指令執行時,它的功能相當于: Push CS Push IP Jmp far ptr 標號 3. 轉移地址在寄存器中的call指令。 指令格式:call 16位通用寄存器 指令執行時,它的功能相當于: Push IP Jmp 16位通用寄存器 4. 轉移地址在內存中的call指令。 這種call指令有兩種格式: 格式1:call word ptr 內存單元地址 指令執行時,它的功能相當于: Push IP Jmp word ptr 內存單元地址 格式2:call dword ptr 內存單元地址 指令執行時,它的功能相當于: Push CS Push IP Jmp dword ptr內存單元地址

7、?子程序

Ret指令用棧中的數據修改IP的數值,從而實現近轉移。Ret指令執行時,進行下面兩步操作: 1. IP=(SS×16+SP)中的數據 2. SP=SP+2 指令執行時,它的功能相當于:pop IP 學習了call和ret指令,現在來看一下,如何將它們配合使用來實現子程序的機制。請看下面的一段代碼: Mov ax, 1 Mov cx, 3 Call s Mov bx, ax Mov ax, 4c00H Int 21H S:add ax,ax Loop s Ret 我們來分析一下CPU執行這一段代碼的過程。 1. CPU執行第一、第二條指令后,CS:IP指向call s。 2. CPU將call s指令的機器碼讀入,IP指向call s后的指令mov bx, ax。 3. 執行call s指令,將當前IP值(指令mov bx, ax的偏移地址)壓入棧中,并將IP的值改變為標號s處的 偏移地址。 4. CPU從標號s處執行指令,直至loop指令循環完畢。 5. CPU指向并執行ret指令,從棧中彈出一個數據(即先前壓入棧中的指令mov bx, ax的偏移地址)送入 IP,則CS:IP指向指令mov bx, ax。 6. CPU執行指令mov bx, ax,并向下繼續執行,直到執行int 21H后,程序結束。 上面第3、第5項是重點,它揭示了子程序執行完之后,如何讓CPU接著call指令向下執行。什么是子程序? 具有一定功能的程序段,我們稱之為子程序。比如,上面的那一段代碼,s:add ax, bx到ret那3條指令就是一個 簡單的子程序,它的功能是把ax中的數值累加3次,累加次數放在cx中,用循環指令loop實現累加。 在需要的時候,我們用call指令轉去執行它,執行完子程序后,要讓CPU接著call指令向下執行,則需要用 到ret指令,call指令轉去執行子程序之前,call指令后面的指令的地址將被存儲在棧中,在子程序的后面使用ret 指令,用棧中的數據設置IP的值,從而轉到call指令后面的代碼處繼續執行。 在上面那一段代碼中,int 21H和loop這兩條指令可能你看不懂,不過沒關系,不影響討論call和ret指令。

總結

以上是生活随笔為你收集整理的汇编语言之转移指令和原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。