關於彙編語言寄存器和指令操作的整理

最近彙編學到後面的內容, 越來越覺得前面的基礎沒有掌握好, 弄得最後編寫彙編程序的時候, 寄存器瞎用, 沒有一點的規矩, 中斷操作也不知道是對哪個寄存器裏的數進行操作, 每次做一個小程序, 都得翻書後面的INT中斷查詢表, 感覺很不爽, 今天花了大半天把幾本關於彙編的書前面的內容又翻了一遍, 結合自己做的筆記, 做了一個簡單的整理, 關於寄存器和指令的, 以作複習彙編之用. 關於存哪個數據用哪個寄存器, 我覺得首先要弄清楚各個寄存器的用途, 以及指令是如何操作數據, 操作的哪個寄存器裏的數據, 又是將操作完後的結果數據存放到那個寄存器中去的.

 

計算機內部寄存器陣列

l  數據寄存器

l  指針及變址寄存器

l  段寄存器

l  控制寄存器

數據寄存器

包括416位的寄存器(AX, BX, CX, DX)或者88位寄存器(    AH, AL, BH, BL, CH, CL, DH, DL)

這些寄存器都可以用來暫時存放操作數, 運算結果以及其他信息, 但同時又具有某些專用用途

l  AX 數據累加器

算術運算中的主要寄存器, 在乘除運算中用來指定被除數和被除數, 也是乘, ,運算後積和商的默認存儲單元. 另外I/O指令均使用該寄存器與I/O設備傳送信息

l  BX 基址寄存器

指令尋址時常用做基址寄存器. 存入偏移量或偏移量的構成成分

l  CX 計算寄存器

在循環指令操作或串處理指令中隱含計數

l  DX 數據寄存器

在雙字節長運算是, AX構成32位操作數, DX爲高16. 在某些I/O指令中, DX被用來存放端口地址

指針及變址寄存器

這些寄存器都是16位的寄存器, 用來存放16位的操作數或中間結果, 但更經常的用途是存放偏移量, 或位移量

l  SP 堆棧指針寄存器

始終只是棧頂的位置, SS寄存器一起組成棧頂數據的物理地址

l  BP 基址指針寄存器

系統默認其指向堆棧中某一單元, 即提供棧中該單元的偏移量. 加段前綴後, BP可作非堆棧段的地址指針

l  SI 源變址寄存器

DS聯用, 指示數據段中某操作的偏移量. 在做串處理時, SI指示源操作數地址, 並有自動增量或自動減量的功能. 變址尋址時, SI與某一位移量共同構成操作數的偏移量

l  DI 目的變址寄存器

DS聯用, 指示數據段中某操作數的偏移量, 或與某一位移量共同構成操作數的偏移量. 串處理操作時, DI指示附加段中目的地址, 並有自動增量或減量的功能

段寄存器

l  CS 代碼段

存放當前程序的指令代碼

l  DS 數據段

存放程序所涉及的源數據或結果

l  SS 堆棧段

先入後出爲原則的數據區

l  ES 附加段

輔助數據區, 存放串或其他數據

控制寄存器

l  IP 指令指針寄存器

它始終指向當前將要執行指令在代碼段中存放的偏移量

l  FR 控制標誌位

1.     CF 進位標識位

進行加減運算時, 如果最高二進制位產生進位或錯位, CF則爲1, 否則爲0. 程序設計中, 常用條件轉移指令JC, JNC指令據此標誌位實現轉移

2.     PF 奇偶標誌位

操作結果中二進制位1的個數爲偶數是, PF1, 某則爲0

3.     AF 輔助進位標誌位

運算時半字節產生進位或借位時, AF1, 某則爲0. 主要用於BCD碼的調整

4.     ZF 零標誌位

運算結果爲0, ZF1, 否則爲0

5.     SF 符號標誌位

當運算結果的最高位爲1, SF1, 否則爲0. 最高位表示符號數的正和負

6.     TF 跟蹤標誌位

用於調試程序時進入單步方式工作. TF=1, 每條指令執行完後產生一個內部中斷, 讓用戶檢查指令運行後寄存器, 存儲器和各標誌位的內容. TF=0, CPU工作正常, 不產生內部中斷

7.     IF 中斷允許標誌位

IF=1同時中斷屏蔽寄存器的相應位爲0, 允許系統響應可屏蔽中斷, 反之, 不接收外部發出的中斷請求

8.     DF 方向位標誌位

用於控制串操作時地址指針位移方向. DF=1, 指針向高地址方向移動

9.     OF 溢出標誌位

算術運算時結果超出系統所能表示的數的範圍. 溢出時, OF=1

關於彙編代碼中的指令

  彙編指令語句的格式: [標號:] 指令助記符 [[目的操作數][, 源操作數]] [; 註釋]

l  指令助記符

MOV, SUB這些詞分別表示傳送, 減法. 彙編源程序時, 系統使用內部對照表將每條指令的助記符翻譯成對應的機器碼

l  目的操作數

目的操作數一共有兩個作用

1.     參與指令操作

2.     暫時儲存操作結果

l  源操作數

源操作數主要提供原始數據或操作對象, 面向所有尋址方式. 例如, 在指令SUB AX, BX 中 的值作爲減數提供給指令SUB

l  註釋

這是對源程序的說明, 在彙編中用 ; , 後面的內容將被註釋

  介紹指令前, 先熟悉下這些在指令中的符號(必須要記得)

l  imme: 立即數

l  DST: 目的操作數

l  SRC: 源操作數

l  mem: 存儲器操作數

l  OPR: 操作數

l  reg: 通用寄存器

l  EA: 偏移地址(偏移量)

l  Sreg: 段寄存器

l  Port: 端口地址

l  Label: 標號

  彙編指令一共可以分爲6:

1.      數據傳送指令

2.      算術運算指令

3.      邏輯運算與移位指令

4.      串操作指令

5.      程序控制指令

6.      處理器控制指令

數據傳送指令

通用數據傳送指令:

  l  MOV     DST, SRC      ;傳送指令: 把源操作數的內容送入目的操作數

注意:

1.      立即數做源操作數時, 立即數的長度必須小於等於目的操作數的長度

2.      操作數DST, SRC分別爲reg, regreg, SregSreg, reg, 兩者的長度必須保持一致

3.      CSIP寄存器不能做DST操作數, 不允許用立即數直接爲段寄存器賦值

4.      立即數不能作爲目的操作數

5.      不能將一個段寄存器的內容直接送到另一個段寄存器中, 可藉助通用寄存器或PUSH, POP指令實現這一要求

  l  PUSH     SRC        ;壓棧指令: 將一個字數據壓入當前棧頂, 位移量disp=-2的地址單元. 數據進棧時, 棧指針SP首先向低地址方向移動兩個字節位置, 接着    數據進棧, 形成新的棧頂

  l  POP       DST              ;出棧指令: 彈出棧頂元素, 後將棧頂指針向棧底方向移動一個字

  l  XCHG    OPR1, OPR2        ;交換指令: 將這兩個操作數交換

地址傳送指令:

  l  LEA        DST, SRC      ;裝載有效地址指令: 該指令將源操作數的偏移量OA裝載到目的操作數中

  l  LDS        DST, SRC      ;裝載數據段指針指令: 將當前數據段中的一個雙字數據裝入到一個通用寄存器SI(雙字數據的低字)和數據段寄存器DS(雙字數據的高字)

  l  LES        DST, SRC      ;裝載附加段指針指令: 將附加數據段中的一個32位地址數據指針(附加段指針)送到DI(低字)ES(高字)寄存器中

標誌傳送指令: (專用於標誌寄存器保護和更新的指令, 共四條)

  l  LAHF     ;標誌寄存器送AH指令, 將標誌寄存器的低字節送入AH

  l  SAHF     ;AH送標誌寄存器指令, AH寄存器內容送標誌寄存器FR的低字節

  l  PUSHF   ;標誌進棧指令, 標誌寄存器進棧

  l  POPF     ;標誌出棧指令, 標誌寄存器出棧

累加器專用傳送指令:

  l  IN   AL, Port        ;從端口讀入數據, 存放在AL

  l  OUT       Port, AL        ;傳送AL中的數據到端口

  l  XLAT      OPRXLAT        ;用於將AL中當前的內容轉換爲一種代碼

算術運算指令

加法指令:

  l  ADD      DST, SRC      ;DST+SRC的和存放到DST中去

  l  ADC       DST, SRC      ;帶進位加法指令, DST+SRC+CF

  l  INC        DST              ;1指令

減法指令:

  l  SUB              DST, RSC      ;DST-SRC, 存放到DST

  l  SBB        DST, SRC      ;帶借位減法指令, DST-SRC-CF

  l  DEC              DST              ;1指令

  l  NEG       DST              ;求補指令, 求補碼

  l  CMP      OPR1, OPR2        ;比較指令

乘法指令:

  l  MUL      SRC        ;無符號數乘指令, AL*SRC, 結果放入AX

  l  IMUL     SRC        ;有符號數乘指令, AL*SRC, 結果放入AX

除法指令:

  l  DIV        SRC        ;無符號數除指令, AX/SRC, 商放入AL, 餘數放在AH

  l  IDIV       SRC        ;符號數除指令, AX/SRC, 上放入AL, 餘數放在AH

  l  CBW, CWD          ;都是符號擴展指令. AL的符號擴到AX; AX的符號擴到DX

邏輯運算與移位指令

邏輯運算指令:

  l  NOT       OPR       ;邏輯非指令

  l  AND      OPR       ;邏輯與指令

  l  OR         OPR       ;邏輯或指令

  l  XOR       OPR       ;邏輯異或指令

移位指令:

  l  SHL        DST, CNT      ;邏輯左移

  l  SHR       DST, CNT      ;邏輯右移

  l  SAL        DST, CNT      ;算術左移

  l  SAR              DST, CNT      ;算術右移

循環移位指令:

  l  ROL              DST, CNT      ;循環左移

  l  ROR       DST, CNT      ;循環右移

  l  RCL        DST, CNT      ;帶進位循環左移

  l  RCR              DST, CNT      ;帶進位循環右移

串操作指令

  l  MOVS   ;串傳送指令

  l  CMPS    ;串比較指令

  l  SCAS     ;串掃描指令

  l  LODS     ;裝入串指令

  l  STOS      ;存儲串指令

控制轉移指令

轉移指令:

  l  JMP              ;無條件轉移指令

  l  JX          ;條件轉移指令(JC/JNC, JZ/JNZ, JE/JNE, JS/JNS, JO/JNO, JP/JNP…)

循環指令:

  l  LOOP     標號       ;該指令執行時, 技術寄存器CXX首先減1, 然後判斷CX, 若爲0, 跳出循環

條件循環指令:

  l  LOOPZ/LOOPE, LOOPNZ/LOOPNE       ;前者用於找到第一個不爲0的事件, 後者用於找到第一個爲0的事件

子程序調用指令:

  l  CALL      子程序名       ;段內直接調用

  l  RET

中斷指令:

  l  INT        N(中斷類型號)     ;軟中斷指令

  l  IRET       ;中斷返回指令

處理器控制指令

標誌處理指令:

  l  CLC        ;進位標誌CF0

  l  CMC      ;進位標誌CF求反

  l  STC        ;進位標誌值1

  l  CLD              ;方向標誌置0

  l  STD              ;方向標誌置1

  l  CLI         ;中斷允許標誌置0

  l  STI         ;中斷允許標誌置1

其他處理器控制指令:

  l  NOP      ;空操作

  l  HLT        ;停機

  l  WAIT     ;等待

  l  ESC        ;換碼

  l  LOCK     ;封鎖

 

  當然, 彙編還有很多指令, 我這邊沒有列出來, 用到的時候查查資料就Okay羅.

  祝大家週末愉快.

 

FROM:http://www.cnblogs.com/technology/archive/2010/05/16/1736782.html

發佈了24 篇原創文章 · 獲贊 23 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章