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

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

計算機內部寄存器陣列

l  數據寄存器小程序

l  指針及變址寄存器spa

l  段寄存器翻譯

l  控制寄存器設計

數據寄存器

包括4個16位的寄存器(AX, BX, CX, DX)或者8個8位寄存器(    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的個數爲偶數是, PF爲1, 某則爲0

3.     AF 輔助進位標誌位

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

4.     ZF 零標誌位

運算結果爲0時, ZF爲1, 不然爲0

5.     SF 符號標誌位

當運算結果的最高位爲1時, SF爲1, 不然爲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, reg或reg, Sreg或Sreg, reg時, 二者的長度必須保持一致

3.      CS和IP寄存器不能作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      OPR或XLAT        ;用於將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        ;進位標誌CF置0

  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     ;封鎖

相關文章
相關標籤/搜索