32位彙編指令筆記
32位CPU所含有的暫存器有: PQJI~u9te}
4個數據暫存器(EAX、EBX、ECX和EDX) <,\Op=$l3I
2個變址和指標暫存器(ESI和EDI) 2個指標暫存器(ESP和EBP)
']'[email protected]]4 6個段暫存器(ES、CS、SS、DS、FS和GS) ZaKT~f%%z
1個指令指標暫存器(EIP) 1個標誌暫存器(EFlags)
f*HEw 1、資料暫存器 s ~ Xa=_+D
資料暫存器主要用來儲存運算元和運算結果等資訊,從而節省讀取運算元所需佔用匯流排和訪問儲存器的時間。 3Gyw^_{J
32位CPU有4個32位的通用暫存器EAX
指標暫存器不可分割成8位暫存器。作為通用暫存器,也可儲存算術邏輯運算的運算元和運算結果。 Ed$;#4 4、段暫存器 B!X;T9^d 段暫存器是根據記憶體分段的管理模式而設定的。記憶體單元的實體地址由段暫存器的值和一個偏移量組合而成 $V?h68[c 的,這樣可用兩個較少位數的值組合成一個可訪問較大物理空間的記憶體地址。 ;{%R[M' CPU內部的段暫存器: $T%[email protected] ECS——程式碼段暫存器(Code Segment Register),其值為程式碼段的段值; l*(Ml= O{ EDS——資料段暫存器(Data Segment Register),其值為資料段的段值; 8kA2.pIk EES——附加段暫存器(Extra Segment Register),其值為附加資料段的段值; @ UgZZ ESS——堆疊段暫存器(Stack Segment Register),其值為堆疊段的段值; ` <3xi9 EFS——附加段暫存器(Extra Segment Register),其值為附加資料段的段值; QgZ`~ EGS——附加段暫存器(Extra Segment Register),其值為附加資料段的段值。 ~0 5p+F) 在16位CPU系統中,它只有4個段暫存器,所以,程式在任何時刻至多有4個正在使用的段可直接訪問;在32位 XoZPz 微機系統中,它有6個段暫存器,所以,在此環境下開發的程式最多可同時訪問6個段。 oMNgyAp^ 32位CPU有兩個不同的工作方式:實方式和保護方式。在每種方式下,段暫存器的作用是不同的。有關規定簡 =}h8Cl{H/ 單描述如下: AXmW7/Sj" 實方式: 前4個段暫存器CS、DS、ES和SS與先前CPU中的所對應的段暫存器的含義完全一致,記憶體單元的邏輯 qT}AY.O%^ 地址仍為“段值:偏移量”的形式。為訪問某記憶體段內的資料,必須使用該段暫存器和儲存單元的偏移量。 iT;~0XU7F 保護方式: 在此方式下,情況要複雜得多,裝入段暫存器的不再是段值,而是稱為“選擇子”(Selector)的某個值。。 GI ~<clhf 5、指令指標暫存器 WhU-^`[* 32位CPU把指令指標擴充套件到32位,並記作EIP,EIP的低16位與先前CPU中的IP作用相同。 Aqp$JM > 指令指標EIP、IP(Instruction Pointer)是存放下次將要執行的指令在程式碼段的偏移量。 0w24lVR. 在具有預取指令功能的系統中,下次要執行的指令通常已被預取到指令佇列中,除非發生轉移情況。 LEJ8 .z6$ 所以,在理解它們的功能時,不考慮存在指令佇列的情況。 2w KW17wj, 6、標誌暫存器 =%UX"K` 一、運算結果標誌位 `tZ-8f 1、進位標誌CF(Carry Flag) `VB]4i}u 進位標誌CF主要用來反映運算是否產生進位或借位。如果運算結果的最高位產生了一個進位或借位,那麼,其值為1,否則其值為0。 }>|!Mf]W?R 使用該標誌位的情況有:多字(位元組)數的加減運算,無符號數的大小比較運算,移位操作,字(位元組)之間移位,專門改變CF值的指令等。 vXA+4 ?ZG 2、奇偶標誌PF(Parity Flag) JC[G5$E 奇偶標誌PF用於反映運算結果中“1”的個數的奇偶性。如果“1”的個數為偶數,則PF的值為1,否則其值為0。 +d=cI 利用PF可進行奇偶校驗檢查,或產生奇偶校驗位。在資料傳送過程中,為了提供傳送的可靠性,如果採用奇偶校驗的方法,就可使用該標誌位。 7j <:hF~
3、輔助進位標誌AF(Auxiliary Carry Flag) :vqfWK6mv 在發生下列情況時,輔助進位標誌AF的值被置為1,否則其值為0: `QIYnokL (1)、在字操作時,發生低位元組向高位元組進位或借位時; /1Q i9uit (2)、在位元組操作時,發生低4位向高4位進位或借位時。 u\,("2ZW9+ 對以上6個運算結果標誌位,在一般程式設計情況下,標誌位CF、ZF、SF和OF的使用頻率較高,而標誌位PF和AF的使用頻率較低。 /J-:?./ 4、零標誌ZF(Zero Flag) $G_,$U ! 零標誌ZF用來反映運算結果是否為0。如果運算結果為0,則其值為1,否則其值為0。在判斷運算結果是否為0時,可使用此標誌位。 e{8j(` (;# 5、符號標誌SF(Sign Flag) /61P`1y(J 符號標誌SF用來反映運算結果的符號位,它與運算結果的最高位相同。在微機系統中,有符號數採用碼錶示法,所以,SF也就反映運算結果的正負號。運算結果為正數時,SF的值為0,否則其值為1。 :[email protected]<@82W 6、溢位標誌OF(Overflow Flag) (zm5 4 Vm 溢位標誌OF用於反映有符號數加減運算所得結果是否溢位。如果運算結果超過當前運算位數所能表示的範圍,則稱為溢位,OF的值被置為1,否則,OF的值被清為0。 ]B;\?Tim “溢位”和“進位”是兩個不同含義的概念,不要混淆。如果不太清楚的話,請查閱《計算機組成原理》課程中的有關章節。 ) Apg 二、狀態控制標誌位 7xmyj y%c 狀態控制標誌位是用來控制CPU操作的,它們要通過專門的指令才能使之發生改變。 vWM3JH~a6 1、追蹤標誌TF(Trap Flag) S @EkrC\4n 當追蹤標誌TF被置為1時,CPU進入單步執行方式,即每執行一條指令,產生一個單步中斷請求。這種方式主要用於程式的除錯。 q $Hg\ {c 指令系統中沒有專門的指令來改變標誌位TF的值,但程式設計師可用其它辦法來改變其值。 7,\Uk| 2、中斷允許標誌IF(Interrupt-enable Flag) [email protected]"B9~ 中斷允許標誌IF是用來決定CPU是否響應CPU外部的可遮蔽中斷髮出的中斷請求。 k#4%d1O} 但不管該標誌為何值,CPU都必須響應CPU外部的不可遮蔽中斷所發出的中斷請求,以及CPU內部產生的中斷請求。 6Q&*V7EO 具體規定如下: rb/m;8v> (1)、當IF=1時,CPU可以響應CPU外部的可遮蔽中斷髮出的中斷請求; o4)^U t+ (2)、當IF=0時,CPU不響應CPU外部的可遮蔽中斷髮出的中斷請求。 )-_NtMr~`! CPU的指令系統中也有專門的指令來改變標誌位IF的值。 a:PS}_. 3、方向標誌DF(Direction Flag) blwdcdh 方向標誌DF用來決定在串操作指令執行時有關指標暫存器發生調整的方向。具體規定在第5.2.11節——字串操作指令——中給出。 hrwQh2sm 在微機的指令系統中,還提供了專門的指令來改變標誌位DF的值。 d(>
7BV 三、32位標誌暫存器增加的標誌位 VQm)32' 1、I/O特權標誌IOPL(I/O Privilege Level) x*H4o{o0 I/O特權標誌用兩位二進位制位來表示,也稱為I/O特權級欄位。該欄位指定了要求執行I/O指令的特權級。 dbkkx1{>Y 如果當前的特權級別在數值上小於等於IOPL的值,那麼,該I/O指令可執行,否則將發生一個保護異常。 f6 zT 2、巢狀任務標誌NT(Nested Task) f`5e0;zm 巢狀任務標誌NT用來控制中斷返回指令IRET的執行。具體規定如下: Wgl7)Xk.) (1)、當NT=0,用堆疊中儲存的值恢復EFLAGS、CS和EIP,執行常規的中斷返回操作; xw*T? !r=V (2)、當NT=1,通過任務轉換實現中斷返回。 |kvom 4T 3、重啟動標誌RF(Restart Flag) /znW$yh o 重啟動標誌RF用來控制是否接受除錯故障。規定:RF=0時,表示“接受”除錯故障,否則拒絕之。 ~jab/cR 在成功執行完一條指令後,處理機把RF置為0,當接受到一個非除錯故障時,處理機就把它置為1。 %nJ^0X_] 4、虛擬8086方式標誌VM(Virtual 8086 Mode) fF208A7U I 如果該標誌的值為1,則表示處理機處於虛擬的8086方式下的工作狀態,否則,處理機處於一般保護方式下的工作狀態。 .Od.lxz"mp 彙編指令集合 <|~8Ezd 一、常用指令 :CO>g=
` 1. 通用資料傳送指令. 4K82%P9a MOV 傳送字或位元組. \|Pp%U [ MOVSX 先符號擴充套件,再傳送. ?[Od. MOVZX 先零擴充套件,再傳送. @ U6Iw"@ PUSH 把字壓入堆疊. "nX L7N0 POP 把字彈出堆疊. A-\OB Nh PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次壓入堆疊. >3V{I'^^- POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次彈出堆疊. 5v4 ,YHD PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次壓入堆疊. C-/
<5D j POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次彈出堆疊. tz-, |n0 BSWAP 交換32位暫存器裡位元組的順序(]0JI1 d XCHG 交換字或位元組.( 至少有一個運算元為暫存器,段暫存器不可作為運算元) _p/ _t76s CMPXCHG 比較並交換運算元.( 第二個運算元必須為累加器AL/AX/EAX ) _,:gSDW| XADD 先交換再累加.( 結果在第一個運算元裡 ) s^F6sXhyPi XLAT 位元組查錶轉換. m.ev~Vv~ BX 指向一張 256 位元組的表的起點, AL 為表的索引值 (0-255,即 0-FFH); 返回 AL 為查表結果. ( [BX+AL]->AL ) Dbt"}#uit; 2. 輸入輸出埠傳送指令. LY [email protected]<w IN I/O埠輸入. ( 語法: IN 累加器, {埠號│DX} ) [email protected] OUT I/O埠輸出. ( 語法: OUT {埠號│DX},累加器 ) #?8dInu> 輸入輸出埠由立即方式指定時, 其範圍是 0-255; 由暫存器 DX 指定時,其範圍是 0-65535. T:& 3. 目的地址傳送指令. 2mj?&p? LEA 裝入有效地址. $'FPso
H 例: LEA DX,string ;把偏移地址存到DX. K TJm[44 LDS 傳送目標指標,把指標內容裝入DS. *# p}>\Y{ 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. *@`Sx'5! LES 傳送目標指標,把指標內容裝入ES. -\C;2&( 例: LES DI,string ;把段地址:偏移地址存到ESDI. /
i[F LFS 傳送目標指標,把指標內容裝入FS. tnL$v2e6q 例: LFS DI,string ;把段地址:偏移地址存到FSD. ?:DeOBAb LGS 傳送目標指標,把指標內容裝入GS. )5n*4A 例: LGS DI,string ;把段地址:偏移地址存到GSDI. A=8%2U wI LSS 傳送目標指標,把指標內容裝入SS. FI|jsO 3 例: LSS DI,string ;把段地址:偏移地址存到SSDI. H,8HGL[l 4. 標誌傳送指令. B?A]0S LAHF 標誌暫存器傳送,把標誌裝入AH. WBc,/lgZ SAHF 標誌暫存器傳送,把AH內容裝入標誌暫存器. R^u 1(SF PUSHF 標誌入棧. vH14%&OcN POPF 標誌出棧. #R^^XG`1 PUSHD 32位標誌入棧. D1G9^7:^E POPD 32位標誌出棧. 4v[Z
hf4JM 二、算術運算指令 Rda~Drz ADD 加法. Tj(DdR#w ADC 帶進位加法. c+a"sx\ INC 加 1. RX])#=Cs AAA 加法的ASCII碼調整. WR :I2-1 DAA 加法的十進位制調整. *3R3C+ L SUB 減法. hiT&QJB` _ SBB 帶借位減法. Pl/}`H:R& DEC 減 1. W]B75 NEC 求反(以 0 減之). H{1'OC CMP 比較.(兩運算元作減法,僅修改標誌位,不回送結果). 7gn
rLc$]O AAS 減法的ASCII碼調整. cqd}.D DAS 減法的十進位制調整. i8nzPKF2$3 MUL 無符號乘法. Rlwewxmr IMUL 整數乘法.
SoJ=[5W 以上兩條,結果回送AH和AL(位元組運算),或DX和AX(字運算), !+o`,KTYp AAM 乘法的ASCII碼調整. is6M{K3 DIV 無符號除法. ;N?raz2mEi IDIV 整數除法. lHI[email protected] 以上兩條,結果回送: 3uy^o 商回送AL,餘數回送AH, (位元組運算); vxZ :l 或 商回送AX,餘數回送DX, (字運算). CFW#+U#U AAD 除法的ASCII碼調整.
(Kg( 6E, CBW 位元組轉換為字. (把AL中位元組的符號擴充套件到AH中去)
w|[{xn^R CWD 字轉換為雙字. (把AX中的字的符號擴充套件到DX中去)
4S\St <
CWDE 字轉換為雙字. (把AX中的字元號擴充套件到EAX中去)
[email protected]*P})w5. CDQ 雙字擴充套件. (把EAX中的字的符號擴充套件到EDX中去)
*z }<eq 三、邏輯運算指令
8;<3Tyjzu AND 與運算.
zL=PxFw0 OR 或運算.
#McX XOR 異或運算.
COFCa&m9c NOT 取反.
Z"N}f , TEST 測試.(
32位CPU所含有的暫存器有: PQJI~u9te}
4個數據暫存器(EAX、EBX、ECX和EDX) <,\Op=$l3I
2個變址和指標暫存器(ESI和EDI) 2個指標暫存器(ESP和E
loop指令用ecx來控制迴圈次數,loop label,相當於如下兩條指令:
dec ecx
jne label
如下是使用loop指令的一個示例程式:
section .data
EditBuff: db 'abcdefghijklm',10
BUFFERL
switch語句可以根據整數索引值進行多重分支選擇,程式碼的可讀性好,switch語句的彙編實現是通過跳轉表來完成的,這樣執行效率也很高。int switch_eg(int x){int result = x;switch (x) {case 100:result*= 1
本文描述基本的32位X86組合語言的一個子集,其中涉及組合語言的最核心部分,包括暫存器結構,資料表示,基本的操作指令(包括資料傳送指令、邏輯計算指令、算數運算指令),以及函式的呼叫規則。個人認為:在理解了本文後,基本可以無障礙地閱讀絕大部分標準X86彙編程式。當然,更復雜的指令請參閱Intel相關
32位彙編第四講,乾貨分享,彙編注入的實現,以及快速定位呼叫API的數量(OD檢視)
昨天,大家可能都看了程式碼了,不知道昨天有沒有在彙編程式碼的基礎上,實現注入計算器.
如果沒有,今天則會講解,不過建議把昨天程式碼熟悉一遍(課程是緊跟著來的,請不要拉下任何一天,因為今天的知識
指令集變化
1.地址寬度和運算元寬度字首
64位模式中,預設的地址寬度是64位,預設的運算元寬度是32位。地址寬度和運算元寬度字首允許32位和64位資料和地址在指令序列中混用。下表(1-7)顯示了在IA-32e模式下需要指令字首地址寬度。注意,在64位模式下不支援16位地址。在敬愛內容和傳統模式下
32位CPU所含有的暫存器有:
4個數據暫存器(EAX、EBX、ECX和EDX)
2個變址和指標暫存器(ESI和EDI) 2個指標暫存器(ESP和EBP)
6個段暫存器(ES、CS、SS、DS、FS和GS)
1個指令指標暫存器(EIP) 1個標誌暫存器(EFlags)
1、
1. 新建個 Visual C++ 的空專案關閉 [安全開發生命週期(SDL)檢查],並選擇空專案2.生成依賴性選擇 masm 依賴項並生成 (注意:若先建立了 asm 檔案再生成依賴項,asm 檔案是不會被彙編軟體編譯的!解決方案在最後!)3.新建 asm 彙編檔案提醒:需
前面20篇彙編學習筆記主要是學習《深入理解計算機系統》過程中所記錄的筆記,接下來打算學一下另外一本書《Assembly Language step by step programming with linux》。首先需要安裝NASM彙編器,例如:rpm –ivh nasm-2
16位下 記憶體必須通過 段和偏移地址 去找到對應的記憶體 位置 每個段只能處理64K個地址
32位置下
能夠處理的地址總數達到 2的 32次方 也就是 4294967296個地址=4GB的記憶體空間
就不再需要 將資料劃分成段 了
可以用任意的段暫存器定址任意的地址空間
在《32位組合語言學習筆記(13)--函式的呼叫》曾分析過c函式的呼叫過程,對於c函式的預設呼叫約定cdecl,要求函式引數的壓棧順序是從右向左,由呼叫方來清理棧。下面示例程式會使用libc庫的幾個函式:
char *fgets( char *string, int 固定 這就是 mar span 通過 idt mic 負責 tle
在ARM指令集匯編碼中。32位有效馬上數是通過______偶數位而間接得到的
A、循環左移
B、循環右移、
C、邏輯左移、
D、邏輯右移
答案為循環左移。為什麽?還有最好解釋一下邏輯移動和循環移動
定義雙子型別:
A DD 21111112H
B DD 11111111H
上面的A和B都是32位,而ax,dx都是16位,所以需要把高16位和低16位分開進行加法。其中先處理低16位,用add。高16位可能會有進位,所以用adc。
A 32位數 僅從定址上看,32位和64位機器能定址的記憶體空間大小不同。
需要知道的是,計算機系統對儲存器作了抽象,程式“認為”記憶體是一個很大的位元組陣列,然而實際上它是由多個硬體儲存器和作業系統組合起來實現的。
程式看到的記憶體地址是虛擬地址,是作業系統為了讓程式使用方便作的對映,實際當程式執行時,要從某個地址取
AF,ZF,SF,OF
標誌傳送指令
內容綱要
1.AF,ZF,OF
2.LAHF,SAHF
3.PUSHF,POPF
4.PUSHFD,POPFD
5.STC,CLC,STD,CLD,CMC 6.32位,16位和8位暫存器
詳細內容
1.AF
使用nasm彙編,然後用visual studio的link連線成exe 選安裝nasm與visual studio
// hello.asm
STD_OUTPUT_HANDLE equ -11
NULL equ 0
global GobleyGo 一、什麼是ARM彙編?
執行在ARM處理器上的組合語言就叫ARM彙編。
C程式執行在X86平臺,底層就是X86彙編;執行在ARM平臺,底層就是ARM彙編。ARM彙編與X86彙編有顯著區別。
X86屬於CISC(複雜指令集);ARM屬於RISC(精簡指令集)。
二、CISC存在的問題:
NEON是一種基於SIMD思想的ARM技術。 SIMD, Single Instruction Multiple Data,是一種單條指令處理多個數據的並行處理技術,相比於一條指令處理一個數據,運算速度將會大大提高。
ARMv8 有31 個64位暫存器,1個不同
32位處理器 暫存器分為四類:
*通用暫存器* *段暫存器* *狀態和控制暫存器* *指令暫存器*
一、通用暫存器 有八個
EAX 累加和結果暫存器
EBX
最高位符號位,後面還有31位 正數時原碼和補碼相同,故此時的
0 表示為 00000000 00000000 00000000 00000000;
1 表示為 00000000 00000000 00000000 00000001;
依次類推...
01111111 111111 相關推薦
32位彙編指令筆記
32位組合語言學習筆記(32)--loop指令
32位組合語言學習筆記(12)--分析switch語句的彙編程式碼
x86的32位彙編快速入門
32位彙編第四講,乾貨分享,彙編注入的實現,以及快速定位呼叫API的數量(OD檢視)
64位彙編指令集的變化等
32位彙編暫存器
使用 Visual Studio 2017 寫純 32 位彙編(intel 風格)
32位組合語言學習筆記(21)--用NASM實現Hello World小程式
什麼是32位彙編的flat平坦記憶體模式
32位組合語言學習筆記(41)--fgets等函式的使用
arm32位固定指令中怎麽容納32位變量
彙編(實現32位 加法,並呼叫int 10h 輸出結果)
32位64位的區別--來自第三章引言的筆記--P110
第012課 彙編-af,zf,sf,of及標誌位操作指令
nasm 彙編輸出 helloworld-windows 32位與64位測試通過
ARM彙編指令集_學習筆記(1)
ARM aarch64彙編學習筆記(九):使用Neon指令(一)
暫存器講解--彙編(32位處理器)
x86彙編——32位補碼