彙編指令細節篇

2021-10-19 12:50:40 字數 3501 閱讀 1545

本篇基於x86架構,intel格式。

at&t格式語義上差不多,語法上特徵%。

記憶體單元的符號位址。 $

?@b(預定義符號)

@f等等查表說明書

.386 //使用386指令集

.model flat //使用flat平坦記憶體模式

option casemap:none //大小寫敏感

pf 低8位有效 //奇偶標誌位pf檢測最低有效位元組(低8位)中 1 的個數。

af bit3向bit4有進製(借位)

tf(trap flag)

if(intcrrupt flag)

df(direction flag)

assume 將段名和對應的段暫存器關聯起來

最重要的符號之一被稱為當前位址計數器(current location counter),表示為 $。

例如,下面的語句宣告了乙個變數 selfptr,並將其初始化為該變數的偏移量:

selfptr dword $

inc 和 dec 指令不會影響進製標誌位cf。

di必須屬於es段

無條件傳送

查詢工作方式

中斷方式

dma方式

movzx無符號擴充套件傳送

movsx有符號擴充套件傳送

lahf載入eflags暫存器內容到ah

sahf儲存ah內容到eflags暫存器

xchg交換資料(不能記憶體和記憶體交換)

neg(非)指令通過把運算元轉換為其二進位制補碼,將運算元的符號取反。

在非零運算元上應用 neg 指令總是會將進製標誌cf位置 1。

align偽指令:對齊乙個變數

注:靠填充cc對齊。

如果陣列定義佔據了多行,那麼 lengthof 只針對第一行定義的資料。

計算結果的最高有效位產生的進製(c即f位)與結果的最高位進行 異或操作,異或的結果存入溢岀標誌位。

插入乙個標號,並定義它的大小屬性,但是不為這個標號分配儲存空間

兩步:

迴圈目標必須距離當前位址計數器 -128 到 +127 位元組範圍內。

pushfd 指令把 32 位 eflags 暫存器內容壓入堆疊。

popfd 指令則把棧頂單元內容彈出到 eflags 暫存器。

pushad 指令按照 eax、ecx、edx、ebx、esp(執行 pushad 之前的值)、ebp、esi 和 edi 的順序,將所有 32 位通用暫存器壓入堆疊。

popad 指令按照相反順序將同樣的暫存器彈出堆疊。

uses 運算子與 proc 偽指令一起使用,讓程式設計師列出在該過程中修改的所有暫存器名(即保護此暫存器原先的環境)。

uses 告訴彙編器做兩件事情:

microsoft 在 64 位程式中使用統一模式來傳遞引數並呼叫過程,稱為 microsoft x64 呼叫規範。

程式設計師只有在呼叫windows api 的函式或用c/c++ 編寫的函式時,才會使用這個呼叫規範。該呼叫規範的一些基本特性如下所示:

call 指令將 rsp(堆疊指標)暫存器減 8,因為位址是 64 位的。

前四個引數依序存入 rcx、rdx、r8 和 r9 暫存器,並傳遞給過程。如果只有乙個引數,則將其放入 rcx。如果還有第二個引數,則將其放入 rdx,以此類推。其他引數,按照從左到右的順序壓入堆疊。

呼叫者的責任還包括在執行時堆疊分配至少 32 位元組的影子空間(shadow space),這樣,被呼叫的過程就可以選擇將暫存器引數儲存在這個區域中。

在呼叫子程式時,堆疊指標(rsp)必須進行 16 位元組邊界對齊(16 的倍數)。call 指令把 8 位元組的返回值壓入堆疊,因此,除了已經減去的影子空間的 32 之外,呼叫程式還必須從堆疊指標中減去 8。

test 指令是一種非破壞性的 and 操作,並適當地設定 cpu 標誌位。

not 指令不影響標誌位。

cmp(比較)指令執行從目的運算元中減去源運算元的隱含減法操作,並且不修改任何運算元。

stc cf進製標誌位置 1

clc cf進製標誌位清零

std 將方向標誌位df置1

cld 將方向標誌位df清零

sti 允許中斷發生

cli 禁止中斷發生

這兩個指令只能在核心模式下執行,不可以在使用者模式下執行

基於特定標誌位的值跳轉

基於兩數是否相等,或是否等於(e)cx 的值跳轉

基於無符號運算元的比較跳轉

基於有符號運算元的比較跳轉

and 遮蔽作用

or 保留作用

cbw 位元組轉字指令

cwd 字轉雙字指令

cdq 雙子轉四字

邏輯左移

邏輯右移

shl邏輯左移

shr邏輯右移

邏輯移位 (logic shift),空出來的位用 0 填充

算術左移

算術右移

sal算術左移

sar算術右移

算術移位 (arithmetic shift),空出來的位用原資料的符號位填充

迴圈左移

迴圈右移

rol迴圈左移

ror迴圈右移

最高(低)位複製到進製標誌位和最低(高)位左移

右移rcl帶進製的迴圈左移

rcr帶進製的迴圈右移

shld雙精度左移

shrd雙精度右移

adc指令:帶進製加法

sbb指令:帶借位減法

addr 運算子只能與 invoke 一起使用,

在使用 invoke 呼叫過程時,它可以傳遞指標引數。

proc 定義

proto 宣告

invoke 呼叫

注:[x]:b,w,d

movsx 傳送字串

cmpsx 比較字串

scasx 掃瞄字串

stosx 儲存字串

lodsx 從字串載入到累加器

配合rep指令使用

repne scasb 不相等則重複查詢的字串搜尋指令,

在使用此指令之前bai要指du定:查詢的基址ds,偏移指標di,和查詢長度cx以及目標字元al(以ascii存放)

掃瞄ds:di所指字元是否與al中字元匹配,若不匹配,則零標誌zf=0,di++,cx–直到找到匹配的字元或者找遍整個指定的區域(即cx為0為止)

若找到了與al值相等的字元ascii碼,改變zf=1,退出查詢

lodsb、lodsw 和 lodsd 指令分別從 esi 指向的記憶體位址載入乙個位元組或乙個字到 al/ax/eax。

esi 按照方向標誌位的狀態遞增或遞減。

安卓逆向 重溫Thumb彙編指令細節

主要內容 1.thumb指令集詳解 2.thumb直接訪問的暫存器 3.thumb指令集組成部分詳解 4.thumb和arm狀態卻換 5.thumb的常見應用場景 arm處理器支援兩種指令集 arm指令集和thumb指令集。arm指令集指令長度為32位,thumb指令集指令長度為16位。在16位外部...

mo彙編指令 彙編指令大全

一 資料傳輸指令 它們在存貯器和暫存器 暫存器和輸入輸出埠之間傳送資料.1.通用資料傳送指令.mov 傳送字或位元組.movsx 先符號擴充套件,再傳送.movzx 先零擴充套件,再傳送.push 把字壓入堆疊.pop 把字彈出堆疊.pusha 把ax,cx,dx,bx,sp,bp,si,di依次壓...

彙編 彙編指令大全

一 資料傳輸指令 它們在存貯器和暫存器 暫存器和輸入輸出埠之間傳送資料.1.通用資料傳送指令.mov 傳送字或位元組.movsx 先符號擴充套件,再傳送.movzx 先零擴充套件,再傳送.push 把字壓入堆疊.pop 把字彈出堆疊.pusha 把ax,cx,dx,bx,sp,bp,si,di依次壓...