《IBM-PC汇编语言程序设计》(清华大学出版社)笔记(四)

时间:2022-10-26 01:29:03
2.2.1.7 逻辑指令

1)      逻辑运算

a)      AND

b)      OR

c)       NOT

a)      不允许使用立即数

d)      XOR              异或

e)      TEST             做与运算,但是不保存结果,只根据结果设置条件码

f)        除了NOT不允许使用立即数,其他的四种,只有源操作数可以是立即数,至少有一个操作数必须在寄存器中,另一个操作数可以使用任意寻址方式

2.2.1.8

2)      位测试并修改指令

a)      BT                 位测试

                    i.           BT DST, SRC         将目的操作数中,由源操作数指定位的值,送CF

b)      BTS               位测试并置1

                    i.           将目的操作数中,由源操作数指定位的值,送CF,并且将目的操作数该位置的值+1

c)       BTR               位测试并置0

                    i.           将目的操作数中,由源操作数指定位的值,送CF,并且将目的操作数该位置的值置为0

d)      BTC               位测试并变反

                    i.           将目的操作数中,由源操作数指定位的值,送CF,并且将目的操作数该位置的值变反

e)      SRC,可以使用,立即数或者寄存器方式,直接指明是第几位,也可以用任意一字寄存器或双字寄存器的内容给出同一个值

f)        目的操作数可以是用除了立即数之外的任意一种寻址方式

g)      因为目的操作数的字长最大为32位,所以位位置的范围是0~31

3)      位扫描指令

a)      BSF               正向位扫描

                    i.           从0位置开始,左←右

                   ii.           目的是检索第一个为1 的位置,并且记录,如果遇到第一个为1 的位,则将ZF置0,并把位置装入目的存储器中;如果源操作数为0àZF= 1,此时目的存储器无定义

                 iii.           源操作数可以使用除立即数意外的任意一种寻址方式,目的操作数必须用字或双字寄存器

b)      BSR               反向位扫描

                    i.           自左à右扫描

                   ii.           其他与BSF一致

4)      移位指令

a)      SHL               逻辑左移

                    i.           SHL OPR,CNT

                   ii.           CNT大于1时,移位次数存放在CL中,直接用CL代替CNT,当=1 时,直接写1

b)      SHR

c)       SAL               算术左移

                    i.           与SHL一致

d)      SAR

                    i.           SAR  OPR,CNT

                   ii.           CNT大于1时,移位次数存放在CL中,直接用CL代替CNT,当=1 时,直接写1

                 iii.           最高位右移,补其本身,本身是0,补0,是1,补1

e)      ROL               循环左移

f)        ROR

g)      RCL               带进位左移

h)      RCR

i)        SHLD             双精度左移

j)        SHRD


2.2.1.8 串处理指令

1)      MOVS

2)      CMPS

3)      SCAS             串扫描

4)      LODS            从串取

5)      STOS             存入串

6)      INS                串输入

7)      OUTS            串输出

8)      串处理的指令处理存放在存储器中的数据串

9)      配合以上指令使用的前缀有:

a)      REP

b)      REPE/REPN

c)       REPNE/REPXZ

10)   与REP相配合工作的MOVS,STOS,LODS,INS,OUTS

a)      REP  str

                    i.           重复str操作,知道CX计数器中的值为0

b)      MOVS   

                    i.           MOVSB

                   ii.           MOVSW

                 iii.           MOVSD

                 iv.           目的操作数必须存储在ES源操作数必须存储在DS,源串允许使用段超越前缀

                   v.           源串首地址存放在SI,目的串首地址存放在DI,串长度存放在CX计数器中

                 vi.           CLDàDF=0,地址自动增量;STDàDF=1,地址自动减量

                vii.           执行MOVS的准备工作             P77

1.      源串首地址存放在SI,目的串首地址存放在DI

2.      串长度存放在CX计数器中

3.      建立方向标志

c)       STOS      存入串指令

                    i.           STOS

                   ii.           STOSB

                 iii.           STOSW

                 iv.           STOSD

                   v.           将存放在AL\AX\EAX的内容存入由目的寄存器(DI)指向的附加段的某个单元

                 vi.           根据DF的值以及数据类型,修改目的寄存器的内容(存储的是地址)

                vii.           与REP联用时,将内容的长度存放在计数器中

               viii.           初始化某一缓冲区时很有作用

                  ix.           其他的特点和MOVS一致

d)      LODS     从串取指令

                    i.           从源变址寄存器(SI)所指向的数据段某单元取出内容,存放在AX\AL\EAX中

                   ii.           根据DF的值以及数据类型,修改目的寄存器的内容(存储的是地址)

                 iii.           其他特点和STOS一致

e)      INS         串输入指令

                    i.           INS

                   ii.           INSB

                 iii.           INSW

                 iv.           INSD

                   v.           将端口号在DX中的I/O空间的内容传送到附加段中的目的变址寄存器(DI)所指向的存储单元中

                 vi.           根据DF的值以及数据类型,修改目的寄存器的内容(存储的是地址)

                vii.           其他特点和STOS一致

               viii.           I/O端口处理的速度必须与REP INS一致

f)        OUTS     串输出指令

                    i.           OUTS

                   ii.           OUTSB

                 iii.           OUTSW

                 iv.           OUTSD

                   v.           把由源变址寄存器(SI)所指向的存储器中的内容传送到端口号在DX中的I/O端口中去

                 vi.           根据DF的值以及数据类型,修改目的寄存器的内容(存储的是地址)

                vii.           其他特点和STOS一致

               viii.           I/O端口处理的速度必须与REP OUTS一致

11)   与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS

a)      CMPS    

                    i.           SI所指向的数据段(DS)中的内容与DI所指向的附加段(ES)中的一个字节、字或者双字相减,不保存结果,根据结果设置条件码

                   ii.           其他的特性与MOVS一致

b)      SCAS

                    i.           SACS

                   ii.           SACSB

                 iii.           SACSW

                 iv.           SACSD

                   v.           将AX\AL\EAX中的内容与DI所指向的附加段中的一个字节、字或者双字比较,不保存结果,根据结果设置条件码

                 vi.           其他的特性与MOVS一致

 

不允许使用“立即数寻址”的有:

1)      段内间接寻址

2)      段间间接寻址

3)      PUSH,POP操作

4)      XCHG

5)      LEA

6)      乘法运算,源操作数的寻址

7)      除法运算,源操作数的寻址

8)      位测试并修改指令

9)      NOT不允许使用立即数

10)   BSF/BSR

11)   SHL/SHR


条件标志位

1)      最主要的是CF,ZF,SF,OF四位

2)      CF,是根据最高有效位是否有向高位的进位设置的,有进位CF=1,否则CF=0

a)      可以用来表示无符号数的溢出,CF = 1 ,溢出,否则不溢出

3)      OF,根据操作书的符号以及其变化情况来设置。

a)      加法,当两个符号相同相加时,< 0 则溢出,符号不同相加,不会出现溢出

b)      减法,当两个符号不相同相减时,> 0 则溢出,符号相同相减,不会溢出


       各个指令对标志位的影响

指令集

指令名

CF

ZF

AF

OF

SF

PF

备注

 

 

通用数据传送指令

MOV

-

-

-

-

-

-

无影响

MOVSX

-

-

-

-

-

-

无影响

MOVZX

-

-

-

-

-

-

无影响

PUSH/POP

-

-

-

-

-

-

无影响

PUSHA/POPA

-

-

-

-

-

-

无影响

累加器专用传送指令

IN/OUT

-

-

-

-

-

-

无影响

XLAT

-

-

-

-

-

-

无影响

地址传送指令

LEA等

-

-

-

-

-

-

无影响

标志寄存器指令

LAHF/PUSHF/PUSHFD

-

-

-

-

-

-

无影响

SAHF/POPF/POPFD

由装入的值确定标志位的值

影响

类型转换指令

CBD/CWD/CDQ/BSW

-

-

-

-

-

-

无影响

加法指令

ADD/ADC/XADD

1

1

-

1

1

-

影响

INC

-

 

 

 

 

 

 

 

减法指令

SUB/SBB/NEG/CMP

CMPXCHG/CMPXHCG8B

1

1

-

1

1

-

影响

DEC

-

 

 

 

 

 

 

 

逻辑运算指令

NOT

-

-

-

-

-

-

无影响

AND/OR/XOR/TEST

1

根据结果

-

根据结果

 

位测试指令

BT/BTS/BTR/BTC

1

-

-

-

-

-

影响

位扫描指令

BSF/BSR

-

1

-

-

-

-

影响

 

 

 

移位指令

SHL/SHR/SAL/SAR

 

根据各指令规定设置

根据移位后的结果设置

 

最高位移位后有变化,OF=1

根据移位后的结果设置

根据移位后的结果设置

 

ROL/ROR/RCL/RCR/SHLD/

SHRD

1

-

-

1

-

-

影响

串处理指令

MOVS/STOS/LODS/INS/OUTS/

SCAS

-

-

-

-

-

-

无影响

 

 

 

 

 

 

 

 

 

      

 

 

 

注意点:

1)      双操作数指令不允许两个操作数都使用存储器,所以必须有一个操作数是寄存器

2)      不允许用MOV 指令在两个存储单元之间直接传送数据,也不允许两个段寄存器之间直接传送信息

3)      几种传送信息的方式:

 
  

 

 

 

 

 

 

 

 



《IBM-PC汇编语言程序设计》(清华大学出版社)笔记(四)