輕創(chuàng)靈感網(wǎng)站百度自動(dòng)點(diǎn)擊器怎么用
文章目錄
- 前言
- 一、轉(zhuǎn)移綜述
- 1.1 :背景:
- 1.2 轉(zhuǎn)移指令
- 1.3 轉(zhuǎn)移指令的分類
- 按轉(zhuǎn)移行為
- 根據(jù)指令對(duì)IP修改的范圍不同
- 二、操作符offset
- 2.1 offset操作符是干什么的?
- 標(biāo)號(hào)是什么?
- 2.2 nop是什么?
- 三、jmp指令
- 3.1 jmp指令的功能
- 3.2 jmp指令:依據(jù)位移進(jìn)行轉(zhuǎn)移
- 3.3 兩種段內(nèi)轉(zhuǎn)移
- 短轉(zhuǎn)移
- 近轉(zhuǎn)移
- 3.4 遠(yuǎn)轉(zhuǎn)移:jmp far ptr 標(biāo)號(hào)
- 遠(yuǎn)轉(zhuǎn)移jmp far ptr 標(biāo)號(hào)
- 近轉(zhuǎn)移jmp near ptr 標(biāo)號(hào)
- 3.5 轉(zhuǎn)移地址在寄存器中的jmp指令
- 3.6 轉(zhuǎn)移地址在內(nèi)存中的jmp指令
- jmp word ptr 內(nèi)存單元地址
- jmp dword ptr 內(nèi)存單元地址
- 總結(jié)
前言
在計(jì)算機(jī)編程的世界里,匯編語(yǔ)言扮演著一種特殊而重要的角色。它是一種低級(jí)語(yǔ)言,直接與計(jì)算機(jī)硬件進(jìn)行交互,提供了對(duì)計(jì)算機(jī)體系結(jié)構(gòu)底層操作的直接控制。在匯編語(yǔ)言中,“轉(zhuǎn)移” 是一項(xiàng)基本而關(guān)鍵的操作,它使得程序能夠靈活地改變執(zhí)行的流程,實(shí)現(xiàn)分支和循環(huán)等基本結(jié)構(gòu)。其中,offset 操作符和 JMP 指令是在匯編中常用于實(shí)現(xiàn)轉(zhuǎn)移的兩個(gè)關(guān)鍵元素。
匯編中的“轉(zhuǎn)移”綜述:
“轉(zhuǎn)移” 在匯編語(yǔ)言中是一種機(jī)制,允許程序在執(zhí)行過程中跳轉(zhuǎn)到其他位置繼續(xù)執(zhí)行。這種能力使得程序能夠根據(jù)不同的條件或需要,選擇性地執(zhí)行特定的代碼塊。在這個(gè)過程中,涉及到兩個(gè)主要元素:offset 操作符和 JMP 指令。
操作符 offset:
offset 操作符用于獲取標(biāo)簽或變量在代碼段中的偏移量。這個(gè)偏移量表示標(biāo)簽或變量相對(duì)于代碼段的起始地址的位置。通過 offset,程序能夠動(dòng)態(tài)地處理內(nèi)存中的數(shù)據(jù)和執(zhí)行跳轉(zhuǎn)等操作。這為編程提供了更大的靈活性,使得代碼能夠更容易地適應(yīng)不同的情境和需求。
JMP 指令:
JMP 指令是匯編語(yǔ)言中的跳轉(zhuǎn)指令,用于改變程序的執(zhí)行流程。通過 JMP,程序可以無(wú)條件地跳轉(zhuǎn)到指定的地址,實(shí)現(xiàn)代碼的非順序執(zhí)行。這是實(shí)現(xiàn)循環(huán)、條件分支等邏輯的基礎(chǔ),為程序的控制流提供了關(guān)鍵的控制點(diǎn)。
一、轉(zhuǎn)移綜述
1.1 :背景:
一般情況下指令是順序地逐條執(zhí)行的,而在實(shí)際中,常需要改變程序的執(zhí)行流程。
1.2 轉(zhuǎn)移指令
可以控制CPU執(zhí)行內(nèi)存中某處代碼的指令
可以修改IP,或同時(shí)修改CS和IP的指令
1.3 轉(zhuǎn)移指令的分類
按轉(zhuǎn)移行為
段內(nèi)轉(zhuǎn)移:只修改IP,如jmp ax
段內(nèi)轉(zhuǎn)移(Jump within a Segment):
當(dāng)我們只需要在當(dāng)前代碼段內(nèi)進(jìn)行跳轉(zhuǎn)時(shí),我們使用段內(nèi)轉(zhuǎn)移。這就像是在當(dāng)前程序的一本書中的不同章節(jié)之間翻頁(yè)。例如,jmp ax 指令就是一種段內(nèi)轉(zhuǎn)移。這里,ax 寄存器中存儲(chǔ)的值將被直接加載到指令指針寄存器(IP),從而控制程序跳轉(zhuǎn)到 ax 寄存器所指示的內(nèi)存地址。
段間轉(zhuǎn)移:同時(shí)修改CS和IP,如jmp 1000:0
段間轉(zhuǎn)移(Jump between Segments):
有時(shí)候我們需要從一個(gè)代碼段跳轉(zhuǎn)到另一個(gè)代碼段,就像是關(guān)閉一本書并打開另一本一樣。這時(shí),我們使用段間轉(zhuǎn)移。例如,jmp 1000:0 指令就是一種段間轉(zhuǎn)移。這里,1000 是新的代碼段的地址,而 0 是該段內(nèi)的偏移地址。同時(shí),指令指針寄存器(IP)會(huì)被設(shè)置為 0,代碼段寄存器(CS)則會(huì)被設(shè)置為 1000,這樣程序就會(huì)從新的代碼段開始執(zhí)行。
總的來(lái)說,這些跳轉(zhuǎn)指令是為了使程序能夠按照我們的設(shè)計(jì)在不同的部分之間流動(dòng),從而實(shí)現(xiàn)更復(fù)雜的邏輯和功能。
根據(jù)指令對(duì)IP修改的范圍不同
段內(nèi)短轉(zhuǎn)移:IP修改范圍為-128~127
在匯編語(yǔ)言中,段內(nèi)轉(zhuǎn)移可以分為兩種:短轉(zhuǎn)移和近轉(zhuǎn)移,它們主要是根據(jù)轉(zhuǎn)移的范圍不同而區(qū)分的。
段內(nèi)短轉(zhuǎn)移(Short Jump within a Segment):
短轉(zhuǎn)移是一種限制在較小范圍內(nèi)的跳轉(zhuǎn),它的目的是在當(dāng)前代碼段內(nèi)進(jìn)行跳轉(zhuǎn)。IP(指令指針寄存器)的修改范圍是 -128 到 127。這就像是在一本小冊(cè)子的一頁(yè)上進(jìn)行跳轉(zhuǎn),適用于相對(duì)較短的代碼段。例如,jmp short label 就是一種短轉(zhuǎn)移指令。這里 short 關(guān)鍵字表示這是一個(gè)短跳轉(zhuǎn)。
段內(nèi)近轉(zhuǎn)移:IP修改范圍為-32768~32767
段內(nèi)近轉(zhuǎn)移(Near Jump within a Segment):
近轉(zhuǎn)移是一種更廣泛的跳轉(zhuǎn),允許在當(dāng)前代碼段內(nèi)進(jìn)行更大范圍的跳轉(zhuǎn)。IP 的修改范圍是 -32768 到 32767。這就像是在一本厚重的書中的章節(jié)之間進(jìn)行跳轉(zhuǎn),適用于相對(duì)較大的代碼段。例如,jmp near label 就是一種近轉(zhuǎn)移指令。
總的來(lái)說,短轉(zhuǎn)移和近轉(zhuǎn)移的區(qū)別在于它們?cè)试S的跳轉(zhuǎn)范圍大小不同。選擇使用哪一種取決于你的程序的結(jié)構(gòu)和需求,以便更有效地管理程序的執(zhí)行流程。
二、操作符offset
2.1 offset操作符是干什么的?
在匯編語(yǔ)言中,offset 操作符用于獲取一個(gè)標(biāo)簽(label)或變量在代碼段中的偏移量。這個(gè)偏移量表示標(biāo)簽或變量相對(duì)于代碼段的起始地址的位置。
標(biāo)號(hào)是什么?
在匯編語(yǔ)言中,標(biāo)號(hào)(label)是一種用于標(biāo)識(shí)代碼位置的符號(hào)。你可以把標(biāo)號(hào)看作是程序中的地標(biāo)或標(biāo)記,幫助程序員更容易地定位和引用特定的代碼塊或數(shù)據(jù)。
舉個(gè)例子,如果你有一個(gè)循環(huán)的開始處,你可以在那里放置一個(gè)標(biāo)號(hào),類似于這樣:
start_of_loop:; 這里是循環(huán)的代碼; ...jmp start_of_loop ; 跳轉(zhuǎn)回循環(huán)開始處
在這個(gè)例子中,start_of_loop 就是一個(gè)標(biāo)號(hào),它標(biāo)識(shí)了循環(huán)的開始位置。當(dāng)程序執(zhí)行到 jmp start_of_loop 時(shí),它會(huì)跳轉(zhuǎn)回這個(gè)標(biāo)號(hào)所標(biāo)識(shí)的位置,實(shí)現(xiàn)循環(huán)的目的。
總的來(lái)說,標(biāo)號(hào)是匯編語(yǔ)言中用于標(biāo)記和引用代碼位置的一種方式,使得程序結(jié)構(gòu)更加清晰,易于理解和維護(hù)。
回到offset,舉個(gè)例子,假設(shè)有一個(gè)標(biāo)簽為 myLabel,你可以使用 offset 操作符來(lái)獲取它相對(duì)于代碼段起始位置的偏移量,就像這樣:
mov ax, offset myLabel
在這個(gè)例子中,ax 寄存器將被設(shè)置為 myLabel 相對(duì)于代碼段的偏移量。這個(gè)偏移量可以在程序中用于計(jì)算地址或進(jìn)行跳轉(zhuǎn)等操作。
總的來(lái)說,offset 操作符是用于獲取標(biāo)簽或變量在代碼段中的位置信息,使程序能夠動(dòng)態(tài)地處理內(nèi)存中的數(shù)據(jù)和執(zhí)行跳轉(zhuǎn)等操作。
2.2 nop是什么?
NOP 是匯編語(yǔ)言中的一個(gè)指令,它代表 “No Operation”,中文可以理解為“無(wú)操作”或“空操作”。這個(gè)指令在程序執(zhí)行時(shí)不做任何有意義的操作,實(shí)際上就是告訴計(jì)算機(jī)處理器不要執(zhí)行任何操作,只是簡(jiǎn)單地占用一個(gè)時(shí)鐘周期。
為什么會(huì)需要這樣的指令呢?有時(shí)候在編寫匯編代碼時(shí),為了滿足一些特定的要求,比如調(diào)整指令的對(duì)齊方式或者是占用一些字節(jié)的空間,我們可能會(huì)需要插入一些沒有實(shí)際操作的指令。NOP 就是為了滿足這種需要而設(shè)計(jì)的。
在匯編語(yǔ)言中,NOP 可以寫作 NOP,也可以寫作 NOOP,這兩者是等效的。一個(gè)典型的使用場(chǎng)景是在調(diào)試或優(yōu)化匯編代碼時(shí),通過插入一些 NOP 指令,可以方便地觀察程序的行為或者調(diào)整指令的布局,而不改變實(shí)際的邏輯。
三、jmp指令
3.1 jmp指令的功能
無(wú)條件轉(zhuǎn)移,可以只修改IP,也可以同時(shí)修改CS和IP
jmp指令要給出兩種信息:
轉(zhuǎn)移的目的地址
轉(zhuǎn)移的距離
- 段間轉(zhuǎn)移(遠(yuǎn)轉(zhuǎn)移): jmp 2000:1000
- 段內(nèi)短轉(zhuǎn)移: jmp short 標(biāo)號(hào) ; IP的修改范圍為 -128~127,8位的位移
- 段內(nèi)近轉(zhuǎn)移: jmp near ptr 標(biāo)號(hào) ; IP的修改范圍為 -32768~32767,16位的位移
3.2 jmp指令:依據(jù)位移進(jìn)行轉(zhuǎn)移
引子:常見指令中的立即數(shù)均在機(jī)器指令中有體現(xiàn)問題:
jmp short 指令中,轉(zhuǎn)移到了哪里?
jmp short 的機(jī)器指令中,包含的是跳轉(zhuǎn)到指令的相對(duì)位置,而不是轉(zhuǎn)移的目標(biāo)地址。
下邊程序jmp short s指令的讀取和執(zhí)行:
(1)(IP)=0003,CS:IP指向EB 05(jmp 的
機(jī)器碼)
(2)讀取指令碼EB 05進(jìn)入指令緩沖器;
(3)(IP)=(IP)+所讀取指令的長(zhǎng)度
=(IP)+2=0005,CS:IP指向add ax, 0001;
(4)CPU執(zhí)行指令緩沖器中的指令
EB05;
(5)指令EB 05執(zhí)行后,
(IP)=(IP)+05=000AH,CS:IP指向inc ax
3.3 兩種段內(nèi)轉(zhuǎn)移
短轉(zhuǎn)移
短轉(zhuǎn)移:“jmp short 標(biāo)號(hào)”
功能:(IP)=(IP)+8位位移
原理
(1)8位位移=
“標(biāo)號(hào)”處的地址-jmp指令
后的第一個(gè)字節(jié)的地址;
(2)short指明此處的位移為8位位移;
(3)8位位移的范圍為-128~127,用補(bǔ)碼
表示;
(4)8位位移由編譯程序在編譯時(shí)算出。
近轉(zhuǎn)移
近轉(zhuǎn)移:指令“jmp near ptr 標(biāo)號(hào)”
功能: (IP)=(IP)+16位位移
原理
(1)16位位移=
“標(biāo)號(hào)”處的地址-jmp指令
后的第一個(gè)字節(jié)的地址;
(2)near ptr指明此處的位移為16位位移,
進(jìn)行的是段內(nèi)近轉(zhuǎn)移;
(3)16位位移的范圍為 -32769~32767,
用補(bǔ)碼表示;
(4)16位位移由編譯程序在編譯時(shí)算出。
3.4 遠(yuǎn)轉(zhuǎn)移:jmp far ptr 標(biāo)號(hào)
遠(yuǎn)轉(zhuǎn)移jmp far ptr 標(biāo)號(hào)
段間轉(zhuǎn)移
far ptr指明了跳轉(zhuǎn)到的目的地址,即包含了標(biāo)號(hào)的段地址CS和偏移地址IP。
近轉(zhuǎn)移jmp near ptr 標(biāo)號(hào)
near ptr 指明了相對(duì)于當(dāng)前IP的轉(zhuǎn)移位移,而不是轉(zhuǎn)移的目的地址。
3.5 轉(zhuǎn)移地址在寄存器中的jmp指令
指令格式:jmp 16位寄存器
功能:IP =(16位寄存器)
舉例:
jmp ax
jmp bx
3.6 轉(zhuǎn)移地址在內(nèi)存中的jmp指令
jmp word ptr 內(nèi)存單元地址
段內(nèi)轉(zhuǎn)移
功能:從內(nèi)存單元地址處開始存放著一個(gè)字,是轉(zhuǎn)移的目的偏移地址。
mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
執(zhí)行后,(IP)=0123H
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]
執(zhí)行后,(IP)=0123H
jmp dword ptr 內(nèi)存單元地址
段間轉(zhuǎn)移
功能:從內(nèi)存單元地址處開始存放著一個(gè)字,是轉(zhuǎn)移的目的偏移地址。
mov ax,0123H
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
執(zhí)行后,
(CS)=0
(IP)=0123H
CS:IP指向0000:0123
mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
執(zhí)行后,
(CS)=0
(IP)=0123H
CS:IP指向0000:0123
總結(jié)
總體而言,匯編語(yǔ)言中的“轉(zhuǎn)移”是編程中不可或缺的一部分。通過 offset 操作符和 JMP 指令,程序員能夠以底層的方式控制程序的執(zhí)行流程,實(shí)現(xiàn)更復(fù)雜和靈活的邏輯。這種能力為編程帶來(lái)了更高的自由度,同時(shí)也要求程序員對(duì)計(jì)算機(jī)體系結(jié)構(gòu)有更深入的理解。在深入學(xué)習(xí)匯編語(yǔ)言的過程中,理解和掌握這些“轉(zhuǎn)移”的機(jī)制將成為編程技能中的重要一環(huán)。