zoukankan      html  css  js  c++  java
  • 16位汇编第七讲汇编指令详解第第三讲

                                                   16位汇编第六讲汇编指令详解第第三讲

    1.十进制调整指令

    1. 十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果

    2.分成压缩BCD码和非压缩BCD码调整

    简而言之:

             以前的时候你有个手表,里面的数字是九,如果加一个1就是0了,就会产生进位,

    不过这个是10进制进位的,所以应该是 a了,但是a的话就出错了.所以我们就出来了这个调整指令直接变为零,然后进位,也就是16进制码当做10进制使用

    压缩BCD

             压缩BCD就是4位表示一个数字

    非压缩BCD

             非压缩就是一个字节表示一个数字(高4位通常为零)

    例子

    真值               8        64

    二进制编码       08H        40H

    压缩BCD码      08H        64H

    非压缩BCD码  08H        0604H

    可以看出,8如果是个位数,是不变的

    如果64那么压缩的是4位表示一个数字非压缩的就是1个字节表示,高位为零.

    压缩BCD吗的加减调整指令

    DAA(加法的调整指令) DAS (减法的调整指令)

    DAA 后缀A是Add的意思,后缀s是Sub的意思

    例子

    mov al,68h
    
    ;压缩的BCD码是68
    
    mov bl,28h   压缩的BCD码28
    
    add al,bl  二进制加法,al + bl 赋值为al
    
    daa  (十进制调整)
    
    al = 68h + 28h = 90h

    但是因为daa了,所以是十进制进位 是96

    简单理解就是,本来16进制 9+1 = A的,但是十进制调整,就不能是A了,需要变为0,结果是10了

    DAA的内部原理就是遇到a(….) +6

    同理DAS也是-6

    只不过是通过标志位完成的(辅助标志位)

    减法例子:

         

    mov al,68h
    
    mov bl,28h
    
    sub al,bl
    
    das   ;十进制调整:al=40h

    ;实现压缩BCD码加法:68-28=40

    非压缩BCD的加,和减法的调整指令

    AAA,AAS

    例子

             mov ax,0109  (其实是想显示19)

             mov al,1

             aaa 调整al

    减法的例子:

            

    mov ax,0100h
    
    sub al,1
    
    aas

    非压缩BCD的乘法,和除法调整指令

    AAM,AAD

    加法的:

    mov ax, 0205h   真值是0205
    
    mov bx, 2             赋值乘数为2
    
    mul bx                  相乘
    
    aam                             调整

    除法的

             

    mov ax, 0102h
    
    mov bl, 2
    
    aad
    
    div bl

    除法的需要先调整,在相

    二丶位操作类指令

             分为三类

    1.逻辑运算指令

             AND OR XOR NOT TEST

    2、移位指令

    SHL  SHR  SAR

    3、循环移位指令

    ROL  ROR  RCL  RCR

    1.逻辑AND

    寻址公式,指令

    AND reg,imm/reg/mem ;reg←reg∧imm/reg/mem

    AND mem,imm/reg ;mem←mem∧imm/reg

    作用:

    1.对两个操作数执行逻辑与运算,结果送到目的操作数

    2.AND指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义

    AND 就是C语言的与运算,1 & 1 = 1  1&0 = 0

    2.逻辑指令 OR(或运算)

    作用:

    1.对两个操作数执行逻辑或运算,结果送到目的操作数

    2.OR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义

    操作指令:

    OR reg,imm/reg/mem ;reg←reg∨imm/reg/mem

    OR mem,imm/reg ;mem←mem∨imm/reg     

    C语言中的或运算

    置位用的

    3.逻辑异或指令XOR

    作用:

    对两个操作数执行逻辑异或运算,结果送到目的操作数

    XOR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义

    操作指令:

             XOR reg,imm/reg/mem ;reg←reg⊕imm/reg/mem

    XOR mem,imm/reg ;mem←mem⊕imm/reg

    C语言中的疑或指令,相同为假,不同为真.

    4.逻辑非指令NOT(C语言中的位取反~)

    作用:

    对一个操作数执行逻辑非运算

    NOT指令是一个单操作数指令

    NOT指令不影响标志位

    操作指令:

             NOT reg/mem ;reg/mem←~reg/mem

    5.测试指令TEST

    作用:

    1.对两个操作数执行逻辑与运算,结果不回送到目的操作数

    TEST指令和CMP指令类似,CMP指令内部是相减然后设置标志位

    而TEST指令是内部相与,然后设置标志位

    2.AND指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义

    指令:

             TEST reg,imm/reg/mem                   ;reg∧imm/reg/mem

             TEST mem,imm/reg         ;mem∧imm/reg

    测试指令,一般用于零判断

    优先使用Test指令,因为TEST指令比CMP指令快一点

    6.移位指令(shift)

    左移指令:

    SHL SAL (逻辑左移,和算术左移)

    逻辑左移: 移动的时候,补零

             SHL:逻辑左移,最高位进入CF,最低位补0

             SAL:   算术左移,最高位进入CF,最低位补0

    其中逻辑左移和算术左移是一样的,一般都会汇编成逻辑左移

    算术左移: 移动的时候补符号位(和C语言一样)

    作用:

    将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作

    操作指令:

             SHL reg/mem,1/CL   (其中CL是次数,在8086的中,移动一次可以直接写,但是移动多次比如放到计数器中)

    例如

             SHL al,1  (移动一个可以)

             SHL al,2  (这样不可以,必须放到CL中)

    改为

             mov cl,2

             SHL  al,2

    右移指令:

    SHR reg/mem,1/CL

    逻辑右移,最低位进入CF,最高位补0

    SAR reg/mem,1/CL

    算术右移,最低位进入CF,最高位不变

    右移的话不会是一样的,不和左移一样.他会有符号位的区分的.

    应用:

             一般来说,逻辑左移,算术左移,逻辑右移,算术右移都有特定的应用

       

    最高位置CF

     

    逻辑右移SHR 值CF位补零

    SAR则补符号位

     

    移位指令对标志的影响

    按照移入的位设置进位标志CF

    根据移位后的结果影响SF、ZF、PF

    对AF没有定义

    如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF = 1;否则OF = 0。当移位次数大于1时,OF不确定

    移位乘法和除法

             逻辑左移一位,相当于无符号的数*2

             逻辑右移一位相当于无符号数/2

     

    7.循环移位指令

            

            

    作用:

             将操作数从一端移出的位返回到另一端形成循环,分成不带进位和带进位,分别具有左移或右移操作

    指令:

             ROL reg/mem,1/CL ;不带进位循环左移

             ROR reg/mem,1/CL         ;不带进位循环右移

             RCL reg/mem,1/CL ;带进位循环左移

             RCR reg/mem,1/CL ;带进位循环右移

    不带进位循环左移

     

    可以看出,高位有效位(MSB)的高位,给低位了,(相当于高位和低位互换了)然后高位置CF位

    不带进位循环右移

     

    这个则是相反,低位和高位互换,然后还是高位置CF位

    带进位的左循环移位RCL

     

    这个则是最高位给CF位保存,然后CF位给低位,(相当于中间有一个CF位做中转)

    带进位的右循环移位RCR

     

    这个则是相反,最低位先给CF位保存,CF位再给最高位

    一般循环带进位的移位指令,适用于32位数的计算(8086下)

    循环移位指令对标志的影响

    按照指令功能设置进位标志CF

    不影响SF、ZF、PF、AF

    如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF = 1;否则OF = 0。当移位次数大于1时,OF不确定

    32位数的计算

     

    首先左移一位,最高位置CF位,然后带进位左移一位,CF位则给DX位进位,则产生了进位

    资料:

    链接:http://pan.baidu.com/s/1jHWF2fG 密码:ykum

  • 相关阅读:
    Android之帧动画2
    CSS之图片关闭
    JAVA之While语句、Do和For语句
    oracle 无效字符
    java 时间制
    mybatis jdbcType date没有时分秒
    log4j说明
    spy 日志说明
    linux更新系统时间
    linux常用命令2
  • 原文地址:https://www.cnblogs.com/iBinary/p/7477874.html
Copyright © 2011-2022 走看看