OllyDbg之組合語言回顧

2021-06-23 10:08:09 字數 4016 閱讀 5531

本文從使用+從零+零開+開始+始摘錄整理

o標誌(溢位標誌)高位溢位

反映有符號數

加減運算所得結果是否溢位。

當指令的結果超出了它可能訪問的最大值,如果運算結果超過當前運算位數所能表示的範圍,則稱為溢位,of的值被置為1,否則,of的值被清為0。

a標誌(輔助進製標誌)

p標誌(奇偶標誌) 

當指令結果的二進位制格式含有偶數個1時,被設定。

z標誌(零標誌)

當運算產生的結果為0時被設定。

s標誌(符號標誌)

這個標誌在運算結果為負時設定為1。

c標誌進製標誌 (

把參與運算的數當作無符號數處理

)當運算結果的最高位發生進製(加法)或借位(減法)時,進製標誌置1,即cf=1;否則cf=0。

標誌被設定,意思是說使其等於1,被清除,則使其等於0。

nop(無操作)

執行這條指令不會對暫存器,記憶體以及堆疊造成任何影響,英文單詞的意思是」無操作」,也就是說,它沒有特殊的用途

push 

push指令-將運算元壓入堆疊中。

pop 

pop指令是出棧:它會取出堆疊頂部的第乙個字母或者第乙個值,然後存放到指定的目標位址記憶體單元中

pushad 

pushad指令把所有通用暫存器的內容按一定順序壓入到堆疊中,pushad也就相當於』push eax,push ecx,push edx,push ebx,push esp,push ebp,push esi, push edi』。

popad 

該指令與pushad正好相反,它從堆疊中取值,並將它們放到相應的暫存器中。popad等價於「pop edi,pop esi,pop esp,pop esp,pop ebx,pop edx,pop ecx,pop eax」。

mov 

該指令將第二個運算元賦值給第乙個運算元

mov al, cl

這條指令時將cl的值賦值給al

mov dword ptr ds:[400500],eax

將eax中的值給乙個雙位元組的記憶體單元,記憶體單元中數值以

小端模式儲存

mov ax,word ptr ds:[405008]

將405008記憶體單元中的兩個位元組賦值給ax

movsx (帶符號擴充套件的傳送指令)

第二個運算元可能乙個暫存器也可能是記憶體單元,第乙個運算元的位數比第二個運算元多,第二個運算元的符號位填充第乙個運算元剩餘部分。 

movzx (帶0擴充套件的傳送指令)

movzx類似於前面的語句,但是這種情況下,剩餘的部分不根據第二個運算元的正負來進行填充。

lea (取位址指令)

類似於mov指令, 但是第乙個運算元是乙個通用暫存器,並且第二個運算元是乙個記憶體單元。運算元僅僅是記憶體單元的位址,而不是裡面的內容。 如 

lea eax,dword ptr ds:[ecx+38]

中dword ptr ds:[ecx+38]

指記憶體位址

xchg (交換 暫存器/記憶體單元 和 暫存器) 

該指令交換兩個運算元的值

inc和dec

這兩個指令分別是執行增加和減少的操作,如果是inc指令的話,就加1,如果是dec指令的話,就減1。

addadd指令有兩個運算元,相加後的結果存放到第乙個運算元中。

前乙個可以為記憶體位址

adc(帶進製的加法)

在這種情況下,兩個運算元的和加上進製標誌的值,結果存放到第乙個運算元中。

加完之後進製標誌c置位1

sub subb類似

mul(無符號數的乘法)

有兩種乘法,第乙個種是mul,這種是無符號數乘法,只有乙個運算元,另乙個運算元是eax,結果存放到edx:eax中。mul ecx

這裡是無符號數eax,ecx相乘,結果存放到edx:eax中。

imul(有符號數的乘法)

imul指令用法類似於mul。

imul ecx 

該指令將有有符號數ecx乘以eax,結果存放到edx:eax中。

div(無符號除法)/idiv(有符號除法)類似

xadd(交換並相加)

正如你所猜想的一樣,這個指令其實就是xchg和add兩個簡單指令的組合。

xadd eax,ecx

相加的結果是存放到第乙個運算元中的。

neg 

該指令的目的是將運算元的符號取反,即如果我們有乙個32位的16進製制數,用neg操作以後,結果就會取反。

and 按位與

or 按位或

not 按位取反。

xor 按位異或

cmp該指令是比較

兩個運算元,實際上,它相當於sub指令,

但是相減的結構並不儲存到第乙個運算元中

。只是根據相減的結果來改變零標誌位的,當兩個運算元相等的時候,零標誌位置1

(z標誌(零標誌))

見最上。

若結果為負,s標誌(符號標誌)

位置1。

,cmp指令還允許暫存器與byte,word,dword型別的記憶體單元的值做比較。

test(邏輯比較)

該指令在一定程式上和cmp指令時類似的,兩個數值進行

與操作,結果不儲存,但是會改變相應標誌位(比如說,sf,zf,pf標誌位),程式可以根據結果來決定是否跳轉到相應的分支。

jmp – 跳轉 

je, jz – 結果為零則跳轉

jne, jnz – 結果不為零則跳轉 

js – 結果為負則跳轉

jns – 結果不為負則跳轉 

jp, jpe – 結果中1的個數為偶數則跳轉 

jnp, jnpe – 結果為1的個數為奇數則跳轉 

jo – 結果溢位了則跳轉 

jno – 結果沒有溢位則跳轉

jb, jnae – 小於則跳轉 (無符號數)

jnb, jae – 大於等於則跳轉 (無符號數)

jbe, jna – 小於等於則跳轉 (無符號數)

jnbe, ja – 大於則跳轉(無符號數)

jl, jnge –  小於則跳轉 (有符號數)

jnl, jge – 大於等於則跳轉 (有符號數)

jle, jng – 小於等於則跳轉 (有符號數)

jnle, jg – 大於則跳轉(有符號數)

jmp 

這是乙個無條件跳轉指令,即總是跳轉到指定的位址

。修改eip

je或者jz

這兩個條件跳轉指令是等價的,只是書寫的形式不同而已。我們可以看到零標誌位z被置1則跳轉。

jne或jnz

這條指令與上面乙個指令剛好相反:如果零標誌位z為0則跳轉,即,要求操作的結果非零。

js(smaller)

從上面的表中可以看出,當比較的結果為負時將跳轉,即,按前面的例子的話就是eax小於ecx。

jns這個跳轉指令與js剛好相反。當零標誌位s為0的時候跳轉,也就是說之前例子中,eax大於ecx的時候跳轉。

jp或jpe 

這個跳轉指令時當奇偶標誌位p置1的時候才會發生,也就是比較的結果中1的個數要是偶數,則跳轉

jnp 或jnpe

這條指令剛好與上一條指令剛好相反, jo

當發生溢位時,即溢位標誌位o置1的時候跳轉。

jno跟上一條指令相反,這裡是當溢位標誌位o為0時跳轉,即溢位沒有發生時。

jb如果第乙個運算元小於第二個運算元的時候跳轉。和js的區別在於js只檢查s符號標誌位,而jb檢查c進製標誌位(由c標誌位是對無符號數操作的特性可知,jb只能用於判斷兩個無符號數的大小)。

jnb和jb指令相反,這個指令是當進製/借位標誌位為0的時候跳轉,也就是說,結果為正的時候跳轉。在前面的例子中,因為eax小於ecx,所以不會發生跳轉。

jbe這個指令時小於或者等於的時候跳轉,這是判斷兩個標誌位的,當進製/借位標誌位置1或者零標誌位z置1的時候將發生跳轉,也就是說,eax要小於或者等於ecx才會發生跳轉。 jl

這個指令當小於的時候跳轉,但是與前面的jb稍微有點不同。這個指令根據符號標誌位s來決定是否跳轉

(和js一樣?傻傻分不清楚)

組合語言 知識點回顧

1.什麼叫零位址指令 一位址指令 二位址指令?指令中的位址碼字段用來指出運算元的位址。根據一條指令中所含運算元位址的數量。可分為三位址指令 雙位址指令 單位址指令和零位址指令。零位址指令只有操作碼,沒有運算元。這種指令有兩種情況 一是無需運算元,另一種是運算元為預設的 隱含的 預設為運算元在暫存器中...

組合語言 AT T組合語言

這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...

組合語言學習之組合語言源程式的輸入

在dos下輸入彙編源程式的方法 一 環境的搭建 二 熟悉debug的一些除錯指令 當顯示器顯示出提示符 時,說明已進入到debug狀態,此時,可以用debug命令列來操作 1.r 指令 用法 r 暫存器的名字 作用 用於檢視暫存器的值 register的首字母 或者修改暫存器的內容。當暫存器的名字省...