1. 程式人生 > >32位彙編指令筆記

32位彙編指令筆記

32CPU所含有的暫存器有: PQJI~u9te} 4個數據暫存器(EAXEBXECXEDX) <,\Op=$l3I 2個變址和指標暫存器(ESIEDI) 2個指標暫存器(ESPEBP) ']'[email protected]]4 6個段暫存器(ESCSSSDSFSGS) ZaKT~f%%z 1個指令指標暫存器(EIP) 1個標誌暫存器(EFlags) f*HEw 1、資料暫存器 s ~ Xa=_+D 資料暫存器主要用來儲存運算元和運算結果等資訊,從而節省讀取運算元所需佔用匯流排和訪問儲存器的時間。 3Gyw^_{J 32CPU432位的通用暫存器EAX

EBXECXEDX {!]7=K)W9 對低16位資料的存取,不會影響高16位的資料。 `[email protected] 這些低16位暫存器分別命名為:AXBXCXDX,它和先前的CPU中的暫存器相一致。 90rY:!e 416位暫存器又可分割成8個獨立的8位暫存器(AXAH-ALBXBH-BLCXCH-CLDXDH-DL),每個暫存器都有自己的名稱,可獨立存取。 ~bsL W:.' 程式設計師可利用資料暫存器的這種可分可合的特性,靈活地處理字/位元組的資訊。 %'`L+y 暫存器EAX通常稱為累加器(Accumulator),用累加器進行的操作可能需要更少時間。可用於乘、 除、輸入
/輸出等操作,使用頻率很高;
E|`JmfLQu 暫存器EBX稱為基地址暫存器(Base Register)。它可作為儲存器指標來使用;V#-\ 4`c 暫存器ECX稱為計數暫存器(Count Register)  >M-ZjT> 在迴圈和字串操作時,要用它來控制迴圈次數;在位操作中,當移多位時,要用CL來指明移位的位數; N |nZf5{ 暫存器EDX稱為資料暫存器(Data Register)。在進行乘、除運算時,它可作為預設的運算元參與運算,也可用於存放I/O的埠地址。 4w<4\zT_U} 16CPU中,AXBXCXDX不能作為基址和變址暫存器來存放儲存單元的地址,
 2z+-vT% 32CPU中,其32位暫存器EAXEBXECXEDX不僅可傳送資料、暫存資料儲存算術邏輯運算結果, wB0K e 而且也可作為指標暫存器,所以,這些32位暫存器更具有通用性。 p*l]I *x'< 2、變址暫存器 KvtX>3#qM 32CPU232位通用暫存器ESIEDI ^\Gukkmh} 其低16位對應先前CPU中的SIDI,對低16位資料的存取,不影響高16位的資料。 xTV3U9 v 暫存器ESIEDISIDI稱為變址暫存器(Index Register),它們主要用於存放儲存單元在段內的偏移量, $ 1< ~J 用它們可實現多種儲存器運算元的定址方式,為以不同的地址形式訪問儲存單元提供方便。 ?jy6%Y#,i 變址暫存器不可分割成8位暫存器。作為通用暫存器,也可儲存算術邏輯運算的運算元和運算結果。 eABLBsx 它們可作一般的儲存器指標使用。在字串操作指令的執行過程中,對它們有特定的要求,而且還具有特殊的功能。 U|!L{+F 3、指標暫存器 [L4s.l_# 其低16位對應先前CPU中的BPSP,對低16位資料的存取,不影響高16位的資料。 8<X,6 32CPU232位通用暫存器EBPESP N{o3w.g 它們主要用於訪問堆疊內的儲存單元,並且規定: S{.G=O EBP為基指標(Base Pointer)暫存器,用它可直接存取堆疊中的資料; G;k#06 ESP為堆疊指標(Stack Pointer)暫存器,用它只可訪問棧頂。 +D&aE$< 暫存器EBPESPBPSP稱為指標暫存器(Pointer Register),主要用於存放堆疊記憶體儲單元的偏移量, [email protected]^qSbG. 用它們可實現多種儲存器運算元的定址方式,為以不同的地址形式訪問儲存單元提供方便。 mO|YX/>

指標暫存器不可分割成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) 16CPU系統中,它只有4個段暫存器,所以,程式在任何時刻至多有4個正在使用的段可直接訪問;在32 XoZPz 微機系統中,它有6個段暫存器,所以,在此環境下開發的程式最多可同時訪問6個段。 oMNgyAp^ 32CPU有兩個不同的工作方式:實方式和保護方式。在每種方式下,段暫存器的作用是不同的。有關規定簡 =}h8Cl{H/ 單描述如下: AXmW7/Sj" 實方式: 4個段暫存器CSDSESSS與先前CPU中的所對應的段暫存器的含義完全一致,記憶體單元的邏輯 qT}AY.O%^ 地址仍為段值:偏移量的形式。為訪問某記憶體段內的資料,必須使用該段暫存器和儲存單元的偏移量。 iT;~0XU7F 保護方式: 在此方式下,情況要複雜得多,裝入段暫存器的不再是段值,而是稱為選擇子”(Selector)的某個值。。 GI ~<clhf 5、指令指標暫存器 WhU-^`[* 32CPU把指令指標擴充套件到32位,並記作EIPEIP的低16位與先前CPU中的IP作用相同。 Aqp$JM > 指令指標EIPIP(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個運算結果標誌位,在一般程式設計情況下,標誌位CFZFSFOF的使用頻率較高,而標誌位PFAF的使用頻率較低。 /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' 1I/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,用堆疊中儲存的值恢復EFLAGSCSEIP,執行常規的中斷返回操作; 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     以上兩條,結果回送AHAL(位元組運算),DXAX(字運算),  !+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彙編指令筆記

32位CPU所含有的暫存器有: PQJI~u9te} 4個數據暫存器(EAX、EBX、ECX和EDX) <,\Op=$l3I 2個變址和指標暫存器(ESI和EDI) 2個指標暫存器(ESP和E

32組合語言學習筆記(32)--loop指令

 loop指令用ecx來控制迴圈次數,loop label,相當於如下兩條指令: dec ecx jne label 如下是使用loop指令的一個示例程式: section .data EditBuff: db 'abcdefghijklm',10 BUFFERL

32組合語言學習筆記(12)--分析switch語句的彙編程式碼

switch語句可以根據整數索引值進行多重分支選擇,程式碼的可讀性好,switch語句的彙編實現是通過跳轉表來完成的,這樣執行效率也很高。int switch_eg(int x){int result = x;switch (x) {case 100:result*= 1

x86的32彙編快速入門

本文描述基本的32位X86組合語言的一個子集,其中涉及組合語言的最核心部分,包括暫存器結構,資料表示,基本的操作指令(包括資料傳送指令、邏輯計算指令、算數運算指令),以及函式的呼叫規則。個人認為:在理解了本文後,基本可以無障礙地閱讀絕大部分標準X86彙編程式。當然,更復雜的指令請參閱Intel相關

32彙編第四講,乾貨分享,彙編注入的實現,以及快速定位呼叫API的數量(OD檢視)

32位彙編第四講,乾貨分享,彙編注入的實現,以及快速定位呼叫API的數量(OD檢視)   昨天,大家可能都看了程式碼了,不知道昨天有沒有在彙編程式碼的基礎上,實現注入計算器. 如果沒有,今天則會講解,不過建議把昨天程式碼熟悉一遍(課程是緊跟著來的,請不要拉下任何一天,因為今天的知識

64彙編指令集的變化等

指令集變化 1.地址寬度和運算元寬度字首      64位模式中,預設的地址寬度是64位,預設的運算元寬度是32位。地址寬度和運算元寬度字首允許32位和64位資料和地址在指令序列中混用。下表(1-7)顯示了在IA-32e模式下需要指令字首地址寬度。注意,在64位模式下不支援16位地址。在敬愛內容和傳統模式下

32彙編暫存器

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、

使用 Visual Studio 2017 寫純 32 彙編(intel 風格)

1. 新建個 Visual C++ 的空專案關閉 [安全開發生命週期(SDL)檢查],並選擇空專案2.生成依賴性選擇 masm 依賴項並生成 (注意:若先建立了 asm 檔案再生成依賴項,asm 檔案是不會被彙編軟體編譯的!解決方案在最後!)3.新建 asm 彙編檔案提醒:需

32組合語言學習筆記(21)--用NASM實現Hello World小程式

前面20篇彙編學習筆記主要是學習《深入理解計算機系統》過程中所記錄的筆記,接下來打算學一下另外一本書《Assembly Language step by step programming with linux》。首先需要安裝NASM彙編器,例如:rpm –ivh nasm-2

什麼是32彙編的flat平坦記憶體模式

16位下 記憶體必須通過 段和偏移地址 去找到對應的記憶體 位置 每個段只能處理64K個地址 32位置下  能夠處理的地址總數達到 2的 32次方 也就是 4294967296個地址=4GB的記憶體空間 就不再需要 將資料劃分成段 了 可以用任意的段暫存器定址任意的地址空間

32組合語言學習筆記(41)--fgets等函式的使用

 在《32位組合語言學習筆記(13)--函式的呼叫》曾分析過c函式的呼叫過程,對於c函式的預設呼叫約定cdecl,要求函式引數的壓棧順序是從右向左,由呼叫方來清理棧。下面示例程式會使用libc庫的幾個函式: char *fgets( char *string, int

arm32固定指令中怎麽容納32變量

固定 這就是 mar span 通過 idt mic 負責 tle 在ARM指令集匯編碼中。32位有效馬上數是通過______偶數位而間接得到的 A、循環左移 B、循環右移、 C、邏輯左移、 D、邏輯右移 答案為循環左移。為什麽?還有最好解釋一下邏輯移動和循環移動

彙編(實現32 加法,並呼叫int 10h 輸出結果)

定義雙子型別:  A DD 21111112H  B DD 11111111H 上面的A和B都是32位,而ax,dx都是16位,所以需要把高16位和低16位分開進行加法。其中先處理低16位,用add。高16位可能會有進位,所以用adc。 A 32位數

3264的區別--來自第三章引言的筆記--P110

僅從定址上看,32位和64位機器能定址的記憶體空間大小不同。 需要知道的是,計算機系統對儲存器作了抽象,程式“認為”記憶體是一個很大的位元組陣列,然而實際上它是由多個硬體儲存器和作業系統組合起來實現的。 程式看到的記憶體地址是虛擬地址,是作業系統為了讓程式使用方便作的對映,實際當程式執行時,要從某個地址取

第012課 彙編-af,zf,sf,of及標誌操作指令

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 彙編輸出 helloworld-windows 32與64測試通過

使用nasm彙編,然後用visual studio的link連線成exe 選安裝nasm與visual studio // hello.asm STD_OUTPUT_HANDLE equ -11 NULL equ 0 global GobleyGo

ARM彙編指令集_學習筆記(1)

一、什麼是ARM彙編? 執行在ARM處理器上的組合語言就叫ARM彙編。 C程式執行在X86平臺,底層就是X86彙編;執行在ARM平臺,底層就是ARM彙編。ARM彙編與X86彙編有顯著區別。 X86屬於CISC(複雜指令集);ARM屬於RISC(精簡指令集)。 二、CISC存在的問題:

ARM aarch64彙編學習筆記(九):使用Neon指令(一)

NEON是一種基於SIMD思想的ARM技術。 SIMD, Single Instruction Multiple Data,是一種單條指令處理多個數據的並行處理技術,相比於一條指令處理一個數據,運算速度將會大大提高。 ARMv8 有31 個64位暫存器,1個不同

暫存器講解--彙編32處理器)

32位處理器  暫存器分為四類:  *通用暫存器*  *段暫存器*  *狀態和控制暫存器*  *指令暫存器* 一、通用暫存器 有八個 EAX    累加和結果暫存器 EBX 

x86彙編——32補碼

最高位符號位,後面還有31位 正數時原碼和補碼相同,故此時的 0 表示為 00000000 00000000 00000000 00000000; 1 表示為 00000000 00000000 00000000 00000001; 依次類推... 01111111 111111