1. 程式人生 > >菜鷄日記——《彙編與介面技術》第3-3章 80X86指令系統 之 資料傳送指令

菜鷄日記——《彙編與介面技術》第3-3章 80X86指令系統 之 資料傳送指令

第3-3章 80X86指令系統

                                       (能被CPU直接執行的指令組成的有機整體)

包括:

  • 資料傳送指令
  • 算術指令
  • 邏輯指令
  • 串處理指令
  • 控制轉移指令
  • 處理機控制與雜項操作指令

重點關注:

彙編格式、基本功能、支援的定址方式、對標誌位的影響、特殊要求

 彙編格式

操作碼 [(目標)運算元] [(源)運算元] …… [(源)運算元]

如:1)MOV AH, [2000H]

       2)PUSH [2000H]

       3)RET

資料傳送指令

  • 通用資料傳輸指令(通用暫存器都可以用,如AX,AL,SP等):MOV、PUSH、POP、XCHG

傳送指令:MOV DST,SRC    執行操作:(DST)←(SRC)

                  1)DST、SRC不能同時為段暫存器(DS、ES等)

                  2)立即數不能直接送段暫存器    MOV DS,1234H ×

                  3)不允許使用AX、CX、DX存放EA(有效地址),BX允許

                  4)DST不能是立即數和CS暫存器

                  5)DST、SRC不能同時為儲存器定址(儲存器單元不能直接傳送資料,因為位寬不一定能匹配)

                  不影響標誌位

進棧指令、出棧指令PUSH SRC    執行操作:先SP←SP-2,後(SP+1),(SP)←(SRC)

                                    POP DST    執行操作:先(DST)←(SP+1),(SP),後SP←SP+2

                  1)堆疊是作業系統分配的先進後出的儲存區,段地址存放在SS暫存器中

                  2)低地址靠近棧頂,高地址靠近棧底

                  3)SP暫存器在任何時候都指向棧頂,進出棧後自動修改SP

                  4)堆疊操作必須以字為單位(即SP每次移動2位元組,要修改單位元組時運用AH、AL)

                  5)DST不能是CS暫存器,SRC和DST都不能是立即數    PUSH 1234H ×    POP 1234H ×

                  不影響標誌位

交換指令:XCHG OPR1,OPR2    執行操作:(OPR1)↔(OPR2)

                  1)不允許使用段暫存器

                  2)兩個運算元至少有一個在暫存器中,不能都是記憶體(記憶體間不能直接傳送資料)

                  不影響標誌位

  • 累加器專用傳送指令(只限定使用AX暫存器):IN、OUT、XLAT

輸入指令:AX是目標運算元,源運算元是PORT(I/O裝置埠號的8位立即數)或DX,執行操作為:CPU←I/O

                  長格式:IN AL,PORT    執行操作:AL←(PORT)    位元組

                                IN AX,PORT    執行操作:AX←(PORT+1),(PORT)    字

                  短格式:IN AL,DX    執行操作:AL←(DX)    位元組

                                IN AX,DX    執行操作:AX←(DX+1),(DX)    字

                  (測試埠27H的第2位是否為1:

                     IN AL,27H

                     TEST AL,00000100B   (與運算後更新標誌暫存器,00000001B時測試第0位)

                     JNZ ERROR)

輸出指令:目標運算元是PORT或DX,AX是源運算元,執行操作為:I/O←CPU

                  長格式:OUT PORT,AL    執行操作:(PORT)←AL    位元組

                                OUT PORT,AX    執行操作:(PORT+1),(PORT)←AX    字

                  短格式:OUT DX,AL    執行操作:(DX)←AL    位元組

                                OUT DX,AX    執行操作:(DX+1),(DX)←AX    字

                  (輸入指令與輸出指令都要注意

                  1)通過指定的埠號從I/O裝置輸入或輸出資料

                  2)前256個埠號00H~0FFH可直接用長格式指定(PORT限定8位)

                  3)埠號大於0FFH則要儲存到DX中,再用短格式指定

                  不影響標誌位

換碼指令:XLAT 或 XLAT OPR    執行操作:AL←(BX+AL)

                  BX暫存器中存放表格的首地址,將該首地址偏移AL後的記憶體內容賦給AL

                  (例:MOV BX,OFFSET TABLE    ;將變數TABLE的偏移地址送到BX,等價於LEA BX,TABLE

                             MOV AL,3

                             XLAT

                             AL的內容從3對映到了表格的3號位的內容)

                  1)位元組表格(長度<=256)

                  2)首地址→BX,偏移量→AL

                  3)有運算元時,自動將OPR賦給BX

                  不影響標誌位

  • 地址傳送指令:LEA、LDS、LES

有效地址送暫存器指令:LEA REG,SRC    執行操作:REG←SRC

指標送暫存器和DS指令:LDS REG,SRC    執行操作:REG←(SRC),同時DS←(SRC+2)

指標送暫存器和ES指令:LES REG,SRC    執行操作:REG←(SRC),同時ES←(SRC+2)

都要注意:

1)地址MEM長為16位,用兩個位元組儲存

2)指標佔4位元組,高位的2位元組16位的儲存段地址,低2位16位的儲存偏移地址

3)REG不能是段暫存器,SRC必須是暫存器定址方式

不影響標誌位

  • 標誌暫存器傳送指令:LAHF、SAHF、PUSHF、POPF

標誌傳送AH指令:LAHF    執行操作:AH←(FLAGS的低位元組)

                              根據第2章標誌暫存器的結構可知,該指令將SF、ZF、AF、PF、CF五個標誌位傳至AH的第7、                                            6、4、2、0位,第5、3、1位未定義

AH送標誌暫存器指令:SAHF    執行操作:(FLAGS的低位元組)←AH

標誌進棧指令:PUSHF    執行操作:先SP←SP-2,後(SP+1),(SP)←(FLAGS)

標誌出戰指令:POPF    執行操作:先(FLAGS)←(SP+1),(SP),後SP←SP+2

影響標誌位

  • 其他