首页 > 学院 > 开发设计 > 正文

《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中


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表