国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

《IBM-PC匯編語言程序設計》(清華大學出版社)筆記(三)

2019-11-06 06:12:34
字體:
來源:轉載
供稿:網友

2.2 80x86的指令系統

2.2.1 數據傳送指令

2.2.1.1 通用數據傳送指令

1)      MOV

a)      MOV A, B                        不允許指定段寄存器

b)      MOV 寄存器,data           不允許指定段寄存器

c)       MOC 段寄存器,mem      不允許使用CS寄存器,此條指令執行后不響應中斷,要等下一跳指令執行完后才能相應中斷

d)      MOV mem/reg,data           目的操作數只用存儲器尋址方式,不用寄存器

2)      MOVSX                       帶符號擴展傳送

a)      傳遞時將源操作數符號擴展送人目的寄存器,先做符號位擴展,再傳送

b)      MOVSX reg,mem               該指令的源操作數可以是8位或者16位的寄存器或者存儲單元的內容,而且目的操作數則必須是16位或32位寄存器

c)       MOVSX reg1,reg2

3)      MOVZX                      帶零擴展傳送

a)      一般的雙操作數指令的源操作數和目的操作數的長度是一致的,但是MOVSX,MOVZX的源操作數長度一定要小于目的操作數

b)      MOVZX reg1,reg2

MOVZX reg,mem

4)      PUSH                         

5)      POP

a)      堆棧的存取在16位指令中必須以為單位(不允許字節堆棧),在32位指令中必須以雙字為單元,所以PUSH,POP指令只能作字或雙字操作

b)      當操作數長度為16位時,SP或ESP均為±2,進出棧是字,操作數長度是32位時,SP或ESP均為±4,進出棧是4

c)       特殊情況:8086中的PUSH SP指令入棧的是該指令已修改了的SP新值,而PUSH ESP指令入棧的卻是ESP在執行該指令之前的舊值。

PUSH POP指令使用與存儲器有關的尋址方式且用ESP作為基址寄存器時,PUSH指令使用該指令執行前的ESP內容,POP指令則使用該指令執行后的ESP內容來計算基址

6)      PUSHA/PUSHAD         所有寄存器進棧

a)      PUSHA進棧的次序:AX,CX,DX,BX, 指令執行前的SP,BP,SI,DI

b)      PUSHA指令執行后(SP) – 16 à (SP) 仍指向棧頂

7)      POPA/POPAD             所有寄存器出棧

a)      POPA出棧順序:DI,SI,SP,BX,DX.CX.AX 執行后,(SP)+16 à (SP) 仍指向棧頂

b)      說明:SP的出棧只是修改了指針,使其后的BX能順利出棧,而堆棧中原先由PUSHA指令存入的SP的原始內容被丟棄,并未真正的送到SP寄存器中

8)      XCHG                         交換

a)      兩個操作數中必須有一個在寄存器中,因此可以在寄存器之間,寄存器與存儲器之間交換信息,但不允許使用段寄存器

b)      允許字節或字操作

c)       不能使用立即數尋址,其他的尋址方式都可以

2.2.1.2 累加器專用傳送指令

       這組指令只限于使用累加器EAX,AX或AL 傳遞信息

1)      IN                 輸入

a)      長格式(8位): 

                                i.           IN AL,PORT  字節

                               ii.           IN AX,PORT   字          (PORT + 1 ,PORT)

                              iii.           IN EAX PORT 雙字       (PORT + 3 ,PORT + 2, PORT + 1 , PORT)

b)      短格式(16位):

                                i.           IN AL,DX 字節

                               ii.           IN AX,DX 字

                              iii.           IN EAX,DX 雙字

2)      OUT              輸出

a)      長格式(8位):

                                i.           OUT PORT,AL 字節

                               ii.           OUT PORT,AX 字

                              iii.           OUT PORT,EAX 雙字

b)      短格式(16位):

                                i.           OUT DX,AL

                               ii.           OUT DX,AX

                              iii.           OUT,DX,EAX

3)      XLAT             換碼

a)      把代碼轉換成另外一種代碼

b)      XLAT OPR

OPR是表格首地址

XLAT

c)       執行之前,建立一個字節表格

                                i.           表格首地址,提前存入BXEBX寄存器

                               ii.           需要轉換代碼相對于表格首地址的位移量提前放在AL寄存器中

d)      轉換后的代碼在AL中

4)      CPU只能用累加器(AX,EAX或AL)接收或發送信息

5)      IN/OUT提供了雙字、字和字節三種方式,外設端口的寬度決定使用哪一種

6)      端口號:外部設備最多可以有65536個  0000~FFFFH

a)      前256個端口(00~FFH)可以直接在指令中指定

b)      長格式:可以在指令中直接指定端口號,但只限于前256個端口

c)       短格式:端口號>=256時,只能使用短格式,此時必須先把端口號放到DX寄存器中,然后再用IN/OUT傳遞信息

d)      注意:這里的端口號或者DX的內容均是地址,而傳送的是端口中的信息,在使用短格式時,DX內容就是端口號本身,不需要任何段寄存器來修改他的值

2.2.1.3  地址傳送指令

1)      LEA        有效地址送寄存器

a)      目的操作數可以使用16位或者32位寄存器,但不能使用段寄存器

b)      源操作數可以使用除了立即數寄存器之外的任何一種存儲器尋址方式

c)       LEA BX, LIST

MOV BX, OFFSET LIST  這兩句的意義一樣

2)      LDS        指針送寄存器和DS

3)      LES         指針送寄存器和ES

4)      LFS         指針送寄存器和FS

5)      LGS        指針送寄存器和GS

6)      LSS         指針送寄存器和SS

7)      本組指令的目的寄存器不允許使用段寄存器

 

2.2.1.4 標志寄存器傳送指令

1)      LAHF             標志送AH

2)      SAHF             AH送標志寄存器

3)      PUSHF          標志進棧

4)      POPF            標志出棧

2.2.1.5 類型轉換指令

1)      CBW             字節轉字

a)      AL的內容符號擴展到AH,形成AX中的字

2)      CWD/CWDE         字轉雙字

a)      CWD  AX的內容符號擴展到DX,形成DX:AX中的雙字

b)      CWDE  AX的內容符號擴展到EAX中,形成EAX中的雙字

3)      CDQ              雙字轉換為4字

a)      EAX的內容符號擴展到EDX,形成EDX:EAX中的4字

4)      BSW              字節交換

a)      只能用于486及其后繼機型

b)      使指令指定的32位寄存器的字節次序變反

 

 

 

2.2.1.6 算術指令

1)      加法指令

a)      ADD

b)      ADC              帶進位加,把CF中的值也加上

c)       INC               自加1

d)      XADD            交換并相加

                    i.           只能用于486及其后繼機型

                   ii.           把目的操作數裝入源,并把源和目的操作數之和送目的地址

源操作數只能使用寄存器尋址方式,目的操作數可用寄存器或任意一種存儲器尋址方式

e)      實現雙精度加法時,需要注意:

                    i.           低位字和高位字的加法必須用兩條指令完成,且在高位字相加時,為了將低位字假發所產生的進位值加入到高位字之內,應該使用ADC指令。

                   ii.           雙精度數的溢出,是根據ADC指令的OF判斷,低位字加法用的ADD指令的溢出是無意義的

2)      減法指令

a)      SUB

b)      SBB               帶借位減法

                    i.           減去CF值

c)       DEC               自減1

d)      NEG              求補(和求補碼完全不同)

                    i.           求補,將操作數取反加一

                   ii.           求補碼,正數的補碼與原碼一致;負數的補碼,先將符號去掉后的數值取反,然后+1

                 iii.           只有當操作數為0,求補運算的結果使CF = 0,其他情況為1

                 iv.           當字節運算時對-128求補,以及字運算時對-32768求補,和雙字運算時對- 求補時OF = 1,其他均為0

e)      CMP

                    i.           將兩個操作數相減,但是不保存結果,只是根據計算結果設置條件標志位

                   ii.           后面通常跟著條件轉移指令,根據比較結果而產生不同的程序分支

f)        CMPXCHG

g)      CMPXCHG8B 比較并交換8字節

h)       

3)      乘法指令              例題 P65

a)      MUL                     無符號乘法

b)      IMUL             有符號乘法

                    i.           如果乘積的高一半是低一半的符號位擴展,那么CF和OF都是0,否則為1

c)       8位目的操作數放在AL中,16位乘積放在AX中

d)      16位目的操作數放在AX中,32位乘積的高位字放在DX,低位字放在AX中

e)      目的操作數必須放在累加器中(AX/AL/AH)

f)        源操作數可以使用除了立即數尋址方式之外的任意一種尋址方式

 

4)      除法指令

a)      DIV                無符號處罰

b)      IDIV               有符號除法

c)       字節運算:

16位被除數放在AX中,8位除數為源操作數。8位商放在AL中,8位余數放在AH中

d)      字運算:

32位被除數的高位字放在DX中,低位字放在AX中,16位除數為源操作數。16位上放在AX中,16位余數放在DX中

e)      目的操作數必須放在AX或DX,AX或EDX,EAX中


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巧家县| 罗源县| 墨竹工卡县| 离岛区| 三明市| 杭锦旗| 福海县| 沈阳市| 镇平县| 营口市| 玉屏| 屏边| 东乌珠穆沁旗| 湛江市| 灵台县| 司法| 新巴尔虎右旗| 邯郸县| 沙雅县| 莫力| 米脂县| 新乐市| 宁河县| 云梦县| 东台市| 盐山县| 德州市| 平江县| 麦盖提县| 云安县| 石阡县| 通渭县| 商城县| 泽库县| 宁蒗| 华坪县| 乡城县| 酒泉市| 乾安县| 鞍山市| 南皮县|