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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码匠的流水账

聊聊hibernate的hbm2ddl的实现

hibernate-core-5.0.12.Final-sources.jar!/org/hibernate/tool/schema/spi/SchemaMan...

943
来自专栏代码世界

Django ORM那些相关操作

一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/         官网文档 常...

4296
来自专栏spring源码深度学习

java基础io流——File的告白(重温经典)

创建成功返回true,如果存在就不创建返回false,创建一个文件时需要确保当前文件夹存在,所有要异常处理。

1683
来自专栏LhWorld哥陪你聊算法

Hadoop源码篇---解读Mapprer源码outPut输出

上次讲完MapReduce的输入后,这次开始讲MapReduce的输出。注意MapReduce的原语很重要:

1333
来自专栏扎心了老铁

hiveQL求差集

hive sql求差集的方法 1、什么是差集 set1 - set2,即去掉set1中存在于set2中的数据。 2、hive中计算差集的方法,基本是使用左外链接...

4814
来自专栏Danny的专栏

未经处理的异常在 System.Data.dll 中发生。其他信息:在应使用条件的上下文(在 '***' 附近)中指定了非布尔类型的表达式。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

2202
来自专栏chenssy

【死磕Sharding-jdbc】---group by结果合并(2)

在sharding-jdbc源码之group by结果合并(1)中主要分析了sharding-jdbc如何在GroupByStreamResultSetMerg...

1032
来自专栏微信公众号:Java团长

深入浅出java静态代理和动态代理

代理模式,是常用的设计模式。特征是,代理类与委托类有相同的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类。以及事后处理消息。

1201
来自专栏Android机器圈

Java-单例模式详解(图文并茂,简单易懂)

PS:首先我们要先知道什么是单例,为什么要用单例,用的好处是什么等问题来看。 1:java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两...

35011
来自专栏文渊之博

XML 在SQLServer中的使用

SQL Server对于XML支持的核心在于XML数据的格式,这种数据类型可以将XML的数据存储于数据库的对象中,比如variables, columns, a...

2077

扫码关注云+社区

领取腾讯云代金券