电工学习网

 找回密码
 立即注册

8086指令系统

2015-3-22 09:24| 编辑:电工学习网| 查看: 32502| 评论: 0



    三、逻辑运算和移位指令(包括逻辑运算、移位和循环移位指令)

    1.逻辑运算指令

    (1) 一般格式  NOT  OPRD

    功   能  对操作数求反,然后送回原处,操作数可以是寄存器或存储器内容。此指令对标志无影响。例如:NOT  AL

    (2) 一般格式:AND  OPRD1,OPRD2

    功  能   对两个操作数进行按位的逻辑“与”运算,结果送回目的操作数。

    其中目的操作数OPRD1可以是累加器、任一通用寄存器,或内存操作数(所有寻址方式)。源操作数OPRD2可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。

    8086/8088的AND指令可以进行字节操作,也可以进行字操作。

    【例如】   AND AL,0FH   ;可完成拆字的动作

    AND   SI,SI     ;    将SI清0

    (3) 一般格式 TEST  OPRD1,OPRD2 

    功  能  完成与AND指令相同的操作,结果反映在标志位上,但并不送回。通常使用它进行测试, 

    【例如】 若要检测 AL中的最低位是否为1,为1则转移。可用以下指令:

    TEST  AL,01H

    JNZ    THERE

    ……

    THERE:

    若要检测CX中的内容是否为0,为0则转移。该如何做呢?

    (4) 一般格式 OR  OPRD1,OPRD2

    功   能 对指定的两个操作数进行逻辑“或”运算。结果送回目的操作数。

    其中,目的操作数OPRD1,可以是累加器,可以是任—通用寄存器,也可以是一个内存操作数(所有寻址方式)。源操作数OPRD2,可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。

    AND  AL,0FH

    AND AH,0FOH

    OR  AL,AH   ; 完成拼字的动作

    OR  AX,0FFFH ;将AX低12位置1

    OR  BX,BX ;  清相应标志

    (5) 一般格式  XOR  OPRD1,OPRD2

    功   能  对两个指定的操作数进行“异或”运算,结果送回目的操作数。

    其中,目的操作数OPRD1可以是累加器,可以是任一个通用寄存器,也可以是一个内存操作数(全部寻址方式)。源操作数可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。【例如】

    XOR  AL,AL   ;使AL清0

    XOR  SI,SI     ;使SI清0

    XOR  CL,0FH    ;使低4位取反,高4位不变

    逻辑运算类指令中,单操作数指令NOT的操作数不能为立即数,双操作数逻辑指令中,必须有一个操作数为寄存器寻址方式,且目的操作数不能为立即数。它们对标志位的影响情况如下:NOT不影响标志位,其它四种指令将使CF=OF=0,AF无定义,而SF、ZF和PF则根据运算结果而定。

    

    2.移位指令

    (1) 算术/逻辑移位指令

    ①算术左移或逻辑左移指令

    SAL/SHL   OPRD,M  ;

    ②算术右移指令      SAR  OPRD,M  

    ③逻辑右移指令      SHR  OPRD,M  

    M是移位次数,可以是1或寄存器CL

    这些指令可以对寄存器操作数或内存操作数进行指定的移位,可以进行字节或字操作;可以一次只移1位,也可以移位由寄存器CL中的内容规定的次数

    (2) 循环移位指令

    ROL  OPRD,M    ;左循环移位 

    ROR  OPRD,M    ;右循环移位 

    RCL  OPRD,M  ;带进位左循环移位

    RCR  OPRD,M ;带进位右循环移位

    前两条循环指令,未把标志位CF包含在循环的环中,后两条把标志位CF包含在循环的环中,作为整个循环的一部分。

    循环指令可以对字节或字进行操作。操作数可以是寄存器操作数,也可以是内存操作数。可以是循环移位一次,也可以循环移位由CL的内容所决定的次数。

    左移一位,只要左移以后的数未超出一个字节或一个字的表达范围,则原数的每一位的权增加了一倍,相当于原数乘2。右移—位相当于除以2。

    

    在数的输入输出过程中乘10的操作是经常要进行的。而X10=X*2+X*8,也可以采用移位和相加的办法来实现*10。为保证结果完整,先将AL中的字节扩展为字。

    MOV   AH,0                        

    SAL    AX,1   ;X*2               

    MOV   BX,AX  ;移至BX中暂存    

    SAL    AX,1   ;X*4               

    SAL    AX,1   ;X*8               

    ADD   AX,BX  ;X*10             

    【例1】BCD码转换为ASCII码

    若在内存某一缓冲区中存放着若干个单元的用BCD码表示的十进制数。每—个单元中放两位BCD码,要求把它们分别转换为ASCII码。高位的BCD码转换完后放在地址较高的单元。

    分析:转换公式:ASCII=BCD+30H

    算法:源串和目的串的表首分别设两个指针。取BCD转ASCII后存入(先低位,后高位)

    MOV SI,OFFSET  BCDBUFF;设置源地址指针

    MOV CX,COUNT           ;设计数初值

    MOV DI,OFFSET  ASCBUF  ;设置目的地址指针

    AGAIN:MOV AL,[SI]

    MOV BL,AL

    AND AL,0FH               ;取低位BCD码

    OR  AL,30H            ;转换成ASCII码

    MOV [DI],AL                ;存入

    INC  DI                  ;修改指针

    MOV AL,BL

    PUSH CX

    MOV CL,4

    SHR  AL,CL

    OR  AL,30H   ;高位转换成ASCII码

    MOV [DI],AL       ;存入

    POP  CX

    INC  DI         

    INC  SI          ;修改指针

    LOOP AGAIN         ;重复工作


看过《8086指令系统》的人还看了以下文章:

发表评论

最新评论

电工学习网 ( )

GMT+8, 2023-7-30 04:27

Powered by © 2011-2022 www.shop-samurai.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

返回顶部