1. 程式人生 > >x64 ASM 常用匯編指令

x64 ASM 常用匯編指令

語法習慣

這裡主要說AT&T風格的組合語言風格。因為gdb看反彙編預設的風格就是AT&T風格的,Intel風格的這裡就不做介紹。
- 立即數,$ 開頭
- 暫存器,% 開頭
- 取地址裡面的值,偏移量(%暫存器)// 除了 lea 取地址指令)外,lea就是取地址 load effecive address
- 整形操作通用字尾,字尾 [b w l q 1 2 4 8] byte word l… quadruple, 表示多少位元組
- 浮點指令還有三個 [s d t 4 8 16] single double extended (修飾精度: precision)
- S -> Scr, D -> Dst, I -> Immediate, R -> Register //表示源,目的運算元,立即數,暫存器

常用指令

資料傳送

mov S, D D <- S
movabs I, R D <- S
// I 表示 immediate date,立即數 常數
// S 表示 Src,立即數,記憶體,暫存器 都可以
// D 表示 Dst,立即數,記憶體,暫存器 都可以
// R 表示 Register,暫存器,如下面表示指令的目的運算元只能是暫存器
movslq S, R // move sign-extend double world (eg, int 轉 long 賦值)
movsbq S, R // move sign-extend byte
movzbq S, R

// move zero-extend byte

棧幀指令

// 單運算元指令
// 這裡可以這裡理解 S D, Src 讀操作,Dst 寫操作
push S 常用來存 frame pointer 呼叫棧的一層函式棧幀

push S, 完成這些操作
%rsp = %rsp - 8, 壓棧導致執行緒執行呼叫棧增長,棧向低地址增長,x64一個地址 8 個 Byte
%rsp = S, S 放到 %rsp 指向的棧頂地址

pop D

pop D, 完成這些操作
D = %rsp, 當前存在%rsp指向的 stack pointer地址中的值賦給 D
%rsp = %rsp + 8

, 弾棧導致執行緒執行呼叫棧減小,棧向高地址回縮

leave
ret

操作地址

// x64 彙編,一個地址 8 位元組, 所以後綴為 q (quad word) quadruple
// word 由於歷史遺留表示 2 個 Byte,字尾 w
leaq S, D (src, dest) D <- &S

單目運算

incq D D <- D + 1 // 比如指標加加
decq D D <- D - 1
negq D D <- -D
notq D D <- ~D

雙目運算

addq S, D D = D + S
subq S, D D = D - S
imulq S, D D = D * S
xorq S, D D = D ^ S
orq S, D D = D | S
andq S, D D = D & S

移位指令

salq k, D D = D << k (left shift)
shlq k, D D = D << k (== salq)
sarq k, D D = D >> k (right shift)
shrq k, D D = D >> k (logical right shift)

控制指令

// 下面是判斷指令,配合置標誌位和條件跳轉實現流程控制
cmpq S2, S1 S1 - S2
testq S2, S1 S1 & S2 // 常用於測試運算元中某位是否為1,而且不會影響目的運算元

置標誌位

CF:進位標誌暫存器,它記錄無符號操作的溢位,當溢位時會被設為1。
ZF:零標誌暫存器,當計算結果為0時將會被設為1。
SF:符號標誌暫存器,當計算結果為負數時會被設為1。
OF:溢位標誌暫存器,當計算結果導致了補碼溢位時,會被設為1。

條件賦值

// 雙目指令 D S,配合上面滿足條件的 D 賦值給 S , 對應條件運算子
cmove equal
cmovne
cmovs Negative
cmovns
cmovg greater (signed)
cmovge
cmovl less
cmovle
// g greater 這麼判斷 ~(SF^OF)&~ZF(有符號的大於)
// 還是判斷 a - b 值,^ xor 異或 => 同0異1
// l less 有符號小於,判斷 SF^OF,less 判斷 負溢位為正
// 舉例 less 負溢位舉例

(lldb) p/d (int)-2147483648
(int) $6 = -2147483648
(lldb) p/d (int)-2147483648 - 2
(int) $7 = 2147483646

// 舉例 below, CF是無符號溢位標誌, a - b 結果溢位了,則代表 a 是小於 b
cmova (above) (a : unsigned)
cmovae
cmovb (below)
cmovbe

條件跳轉

jmp Label
jmp *Operand
je == 0
jne
js Negative
jns
jg greter (signed)
jge
jl less
jle
ja above (unsigned)
jae
jb below
jbe

浮點操作

Floating instruction
具體看asm64-handout.pdf的介紹。

暫存器

register

c資料型別

c_data

參考文獻

相關推薦

x64 ASM 用匯指令

語法習慣 這裡主要說AT&T風格的組合語言風格。因為gdb看反彙編預設的風格就是AT&T風格的,Intel風格的這裡就不做介紹。 - 立即數,$ 開頭 - 暫存器,% 開頭 - 取地址裡面的值,偏移量(%暫存器)// 除了 lea 取地

ARM 用匯指令

編寫 中括號 OS 編程 body 需要 實現 十進制數 spa ARM 匯編程序的框架結構 .section .data <初始化的數據> .section.bss <未初始化的數據> .section .text .glo

用匯指令

1=1 乘法 utm 一個 它的 sdn tails copy 轉移指令 CMP A,B 比較A與B其中A與B可以是寄存器或內存地址,也可同時是兩個寄存器,但不能同都是內存地址。這個指令太長見了,許多明碼比較的軟件,就用這個指令。 MOV A,B 把B的值送給A其中,A與B

用匯指令及其影響的標誌位

說明 比較 cxz 個數 test car size through with 加法指令 ADD (addition) 指令對標誌位的影響: CF=1 最高有效位向高位有進位 CF=

ARM用匯指令

(1)GBLL 偽指令用於定義一個全域性的邏輯變數,並初始化為{False}。 GBLL    BOOTLOADER BOOTLOADER   SETL    {TRUE} (2)GET(或 INCL

(三)ARM 用匯指令(2)之ARM堆疊保護/恢復現場分析

3.4 ARM堆疊保護/恢復現場分析 3.4.1 堆疊的分類 根據堆疊的生成方式,又可以分為遞增堆疊(Ascending Stack)和遞減堆疊(DecendingStack),當堆疊由低地址向高地址生成時,稱為遞增堆疊,當堆疊由高地址向低地址生成時,稱為遞減堆疊。這樣就

Android 圖解逆向工程中ARM用匯指令(一)

我們走得太快,靈魂都跟不上了。 微小的幸福就在身邊,容易滿足就是天堂。 在逆向和爆破中我們經常會在IDA中接觸到彙編,一般做安卓的不會太瞭解VB回編等,不太瞭解的同學可以先檢視上篇文章《Android ARM常用的彙編指令合集》 再來繼續我們

一些用匯指令的注意事項

資料傳送指令 MOV:暫存器之間傳送注意,源和目的不能同時是段暫存器;程式碼段暫存器CS不能作為目的;指令指標IP不能作為源和目的。立即數不能直接傳送段暫存器。 源和目的運算元型別要一致;除了串操作指令外,源和目的不能同時是儲存器運算元。 XCHG交換指令:運算元可以是通用暫

關於start.S中一些用匯語言的理解

終於明白這個LR暫存器了 看下面這個ARM彙編吧 BL  NEXT                                 ;跳轉到子程式 .........                                          ;NEXT處執行

用匯暫存器

8086暫存器組  1. 通用暫存器 通用暫存器包括了8個16位的暫存器:AX、BX、CX、DX、SP、BP、DI及SI。 其中AX、BX、CX、DX在一般情況下作為通用的資料暫存器,用來暫時存放計算過程中所用到的運算元、結果或其他資訊。 它們還可分為兩個獨立的8位暫存器使

用匯語言實現氣泡排序——基於MIPS指令系統

這是計組第一個小實驗,實現從鍵盤輸入十個數字,並把它們按從大到小排序輸出。 氣泡排序流程圖 C語言實現氣泡排序 void swap(int a[], int k) {

asm基礎—— vs下使用匯

1. 建立專案: 2. 右鍵點選專案名進行自定義配置 3.選擇masm編譯器:   4. 新增檔案,需要修改檔案字尾名。這裡需要注意不能在前幾步建立檔案,不然後續“配置屬性”設定中會缺少Microsoft Macro Assembler。 5. helloworld程

#x64第二講,復習x86匯指令格式,學習x64指令格式

字段 空間 9.png tle 機器 class ptr scale 進行 目錄 x64匯編第二講,復習x86匯編指令格式,學習x64指令格式 一丶x86指令復習. 1.1什麽是x86指令

CLD匯指令

下一個 單元 匯編指令 pan 指令 intel 其它 類型檢查 例如   cld相對應的指令是std,二者均是用來操作方向標誌位DF(Direction Flag)。cld使DF 復位,即是讓DF=0,std使DF置位,即DF=1.這兩個指令用於串操作指令中。通過執行c

查看Java代碼對應的匯指令又一利器,JITWatch 轉

又一 size watch tope -s down rtt diag ini http://www.tuicool.com/articles/IRrIRb3 時間 2015-05-13 08:00:00 Liuxinglanyue‘s Blog 原文 http://

試驗二:用機器指令和匯指令

nbsp 編程 命令 匯編 改變 ima push images 數據段 預備知識:   d命令+段寄存器 註意棧段,定義的時候定下了棧頂,push操作後sp減小; 試驗任務: 註意: CS:IP指向代碼段; (ax,bx正確入

指令及其特點

間接尋址 地址 block 指針 常用 編譯過程 標誌位 準備工作 環境 基礎知識 指令與偽指令 匯編指令:CPU機器指令的助記符,編譯後得到1和0組成的機器碼,由CPU讀取執行 偽指令:本質上不是指令,由編譯環境提供,謎底在於知道編譯過程,最終不會生成機器碼 不同的ARM

指令-STR存儲指令

spa 存儲器 pan 16px 實例 style tor -c 存儲 STR -(Store Register)存儲指令 格式:STR{條件} 源寄存器,<存儲器地址>將源寄存器中數據存到存儲器地址中。 實例: STR r1,[r2]

16位匯第六講匯指令詳解第第三講

不變 無符號 目的 分享 class 邏輯移位 aam 但是 二進制      16位匯編第六講匯編指令詳解第第三講 1.十進制調整指令 1. 十進制數調整指令對二進制運算的結果進行十進制調

[原創]MinHook測試與分析(x64下 E9,EB,CALL指令測試,且逆推測試微軟熱補丁)

caption set enable wchar put .com 探索 cti wid 依稀記得第一次接觸Hook的概念是在周偉民先生的書中-><<多任務下的數據結構與算法>>,當時覺得Hook很奇妙,有機會要學習到,正好近段日子找來了Min