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

时间: 2024-07-31 14:32:09

16位汇编第六讲汇编指令详解第第三讲的相关文章

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

16位汇编第六讲汇编指令详解第二讲 1.比较指令 CMP指令 1.CMP指令是将目的操作数减去源操作数,按照定义相应的设置状态标志 2.CMP指令执行的功能与SUB指令(相减指令)一样,但是不同的是CMP指令之根据结果设置标志位 而不修改值 可以操作的指令格式 CMP reg,imm/reg/mem CMP mem,imm/reg 上面是CMP指令的语法,具体的也可以查询帮助文档,inter手册 inter手册查的办法 第一个框代表了CMP指令的所有语法 比如 reg,reg 表示可以比较寄存器

16位汇编第五讲各种指令详解第一讲

汇编指令详解 8080指令详解 1.8086系统下,Inter指令系统共有117条指令(看似很多,分一下类) 1.数据传送类指令(专门传送数据的) 2.算术运算类指令(加减乘除的运算的) 3.位操作类指令(或  异货 与 -.) 4.串操作类指令 (内存拷贝,内存连续地址拷贝的操作) 5.控制转移类指令(跳转,比如C语言的Goto) 6.处理机控制类指令(计算机的待机 ,重启 等等,让CPU待机睡眠的指令) 学习指令的注意事项 1.指令的功能,也就是这个指令可以实现什么操作.通常的话,指令就是指

几种基本汇编指令详解

几种基本汇编指令详解 常见寄存器 寄存器 16位 32位 64位 累加寄存器 AX EAX RAX 基址寄存器 BX EBX RBX 计数寄存器 CX ECX RCX 数据寄存器 DX EDX RDX 堆栈基指针 BP EBP RBP 变址寄存器 SI ESI RSI 堆栈顶指针 SP ESP RSP 指令寄存器 IP EIP RIP 汇编指令 mov movb(8位).movw(16位).movl(32位).movq(64位) 寄存器寻址: movl %eax, %edx eax -> edx

深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer15.html 引言 上一章我们已经介绍了汇编语言的基础部分,包括数据格式.寄存器以及操作数的标识方式,接下来我们就应该去认识一下汇编语言当中的各个指令了.这些指令大多数都非常简单,但是组合在一起却能模拟出我们程序当中想要的任何效果,确实是十分神奇的一件事. 数据传送指令 数据传送指令的目的是为了将一个数据从一个位置复制到另外一个位置.既然如此,那么数据传送指令就会包含一个源操作数和一个目的操

数据传送指令详解

数据传送指令详解 前言 上一章我们说了汇编语言的基础,包括数据格式,寄存器以及操作数的标识方式,接下来我们就应该去认识一下hiU币按语言当红真难过的格各个指令了.这些指令大部署很简单,但是组合在一起却能模拟出我们程序当中香烟的任何效果,确实很神奇. 数据传送指令 数据传送指令的目的是我了将一个数据从一个位置复制到另一个位置.既然如此,那么数据传送至零就会包含一个源操作数和一个目的操作数,指令会将源操作数的值复制到目的操作数并覆盖. 数据传送指令一共可以分为5种,分别是mov,movs,movz,

特殊的算术操作指令详解

特殊的算术操作指令详解 前言 上一讲,我们说了常见的算术与逻辑运算指令,其中比较有特点的是leal指令,本次我们在介绍几个较特殊的操作指令,这些指令可以让只有32位的寄存器存储64位的数据是不是很吊? 正文 我们来看一下这些指令的大致介绍,如果又仔细看过上一讲的内容,可能会发现这里的指令有些眼熟,但是他们的作用却截然不同.以下是书中的一张概图: 第一个指令很眼熟吧,他就是我们上一章说的imull乘法指令的双字形式.不过可以看出,这里的imull指令已经完全变了了个人,他将结果存入两个寄存器.接下

[转]JVM指令详解(上)

作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码    助记符                            说明 0x00         nop                                什么都不做 0x01        aconst_null                   将null推送至栈顶 二.const系列 该系列命令主要

迈向angularjs2系列(2):angular2组件和指令详解

<%= INIT %> 内容 一:angular2 helloworld! 为了简单快速的运行一个ng2的app,那么通过script引入预先编译好的angular2版本和页面的基本框架. index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> &l

Git大法好——2.Git本地操作指令详解

Git大法好--2.Git本地操作指令详解 引言 上节给大家讲解了有关于Git的一些概念,Git的引入,Git的四个组成部分,Git文件的状态,以及 Git的下载安装:前面也讲过Git和SVN有个明显的差别就是,Git可以不需要网络就可以进行版本 控制,这是因为Git中每个电脑都拥有一个本地的版本库,而远程的仓库仅仅是作为我们交换修改 的一个工具!即使失去这个工具,我们也可以干活,只是交换修改不方便罢了,假如是SVN,远程 服务器挂了-所以,我们使用Git的时候大部分时间都是在进行Git的一些本