本文最初发表于2015-8-14,是由别的地方迁移过来的

(本文所讲为无符号运算)

DIV指令是8086汇编中的除法运算指令,它的结果不是浮点数,而是两个整数:商和余数。

我们来看王爽老师是怎么讲的:

现在大家思考一下,为什么在汇编语言中,除数的长度比被除数少呢?

分析:

因为被除数长度若等于除数的长度(假设是8位),那么定义一个乘法的式子:X*Y=Z如果X=FF,Y=2时会发生什么?结果是Z=FE(原结果是1FE,但是溢出后只保留8位结果),这个结果显然不能让人接受。如果把这个式子化成除法,正确的就是1FE/FF=2。所以,将Z的长度扩长,问题就可以解决了。

把上述内容压缩就是:

被除数的位数=除数的位数*2

除数是8位:(AX)/NUM=(AL)…(AH)

除数是16位:(DX(H)AX(L))/NUM=(AX)…(DX)

用法:DIV 除数

通过书上所讲,我们又得出以下结论:

  一个大于2^8 - 1(2的8次方减1)的数作被除数,被除数必须为16位,而除数为8位,商和余数也是8位的。一个大于2^16 - 1的数作被除数,被除数必须为32位,除数为16位,商和余数为16位。由于有些时候,CPU的寄存器可能无法满足使用,这样就需要用内存空间来做除法了。

  首先,先要认识X ptr操作符,这个操作符是指明要处理的数据长度,它的用法很简单:

  byte ptr 处理数据长度为字节型

  word ptr 处理数据长度为字型

mov byte ptr ds:[],1H ;把立即数1H赋值给DS:[0]所指向的内存单元
mov word ptr ds:[],1H ;把立即数 1H赋值给DS:[0]所指向的内存字单元

如果两个例子执行前对应的内存单元都为0。

则第一个例子执行后内存单元是这样的: DS:0000 01

第二个例子执行后内存单元是这样的:   DS:0000 01 00

现在我们来看一段代码:

assume cs:code,ds:data

data segment;数据段
db100D;设定一个除数内存单元,里面的数据是100,地址是ds:[0]
data ends code segment;代码段 start: mov ax,data
mov ds,ax;设置数据段寄存器指向数据段
mov ax,200D;设置被除数
div byte ptr ds:[];进行除法
mov byte ptr ds:[],al;将结果覆盖除数所在的内存单元
mov ax,4c00H;程序返回
int 21H
code ends
end start

代码执行:

运行所有除法指令前的指令后内存单元和寄存器情况:
 

运行除法指令后并执行到程序返回之前内存单元和寄存器的情况:
 

此时结果已经保存到数据段中,程序完成。

汇编语言的除法指令很容易忘记其用法和结果保存的位置,需要多练习,多实践。

DIV指令一般用法的更多相关文章

  1. div 指令

    div 指令 div 是除法指令,后面跟的是除数,被除数默认在 ax, 或者 dx.ax 组成的存储单元中. 除数可以有 8 位和 16 位两种,存储于一个 reg 或内存单元中,也就是说不可以 di ...

  2. Vue.js自定义指令的用法与实例

    市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,以致于即便明白了怎么写,也不知道怎么用.本文不讲语法,就讲自定义指令的用法. 自定义指令是用来操作DOM的.尽管Vu ...

  3. [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符

    说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...

  4. [汇编语言]-第八章 div指令,伪指令dd,dup

    1- div除法指令 (1) 除数: 有8位和16位两种,在一个寄存器或内存单元中. (2) 被除数: 默认放在AX和DX或AX中 除数为8位, 被除数为16位, 默认在AX中存放. 除数为16位, ...

  5. div指令和mul指令

    div是除法指令,使用div做除法时需要注意: 1)除数:有8位和16位两种,在一个寄存器或者内存单元中 2)被除数:默认存放在AX或DX和AX中.如果除数为8位,被除数则为16位,默认在AX中存放: ...

  6. vue 指令的用法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Delphi 预编译指令 的用法

    A.3 使用条件编译指令条件编译指令是非常重要的编译指令,他控制着在不同条件下(例如,不同的操作系统)产生不同的代码.条件编译指令是包含在注释括号之内的,如下表所示.                 ...

  8. ABAP div / mod的用法

    1.divdiv是用于取两数相除的商的,c = a div b,得到的c的值就是a除b的商.2.// 是用于取两数相除的结果的.c = a / b,如果c是i数据类型的,这个语法会进行四舍五入的.3. ...

  9. bnd -buildpath指令的用法

    -buildpath的作用是为项目添加运行时依赖.这个依赖可以是workspace中的另一个项目或者是仓库中的另一个bundle. -buildpath指令只会在编译和构建时起作用,它从来不会被用来运 ...

随机推荐

  1. Android打造带透明圆弧的ImageView

    这几天因为项目需求,需要在ImageView上面叠加一层透明圆弧,并且在沿着圆弧的方向显示相应的文字,效果如下图所示: 拿到这个需求,首先想到的是自定义一个ImageView来实现此功能,即在onDr ...

  2. Java程序员面试宝典1 ---Java基础部分(该博文为原创,转载请注明出处)

    (该博文为原创,转载请注明出处   http://www.cnblogs.com/luyijoy/  by白手伊凡) 1.    基本概念 1)         Java为解释性语言,运行过程:程序源 ...

  3. dumpsys命令的使用及telephony.registry解读

    adb shell dumpsys,默认打印出当前系统所有的service信息,通常情况下我们并不想看那么多信息,可以在后面加上具体的服务名,比如想获取关于设备电池的信息,就可以使用以下命令: > ...

  4. 【练习】手工生成awr报告

    ①首先进入$ORACLE_HOME/rdbms/admin目录 [oracle@host02 ~]$ cd $ORACLE_HOME/rdbms/admin 该目录下 [oracle@host02 a ...

  5. onenote网页版如何打开链接弄到客户端

    1.网页登录https://onedrive.live.com 2.登录MS帐号 3.输入复制的分享链接,回车 4.点击编辑,在客户端编辑,弹出是否启动应用,点启动,等一段时间完成.

  6. unknown software exception

    打开cmd 输入下面代码,回车,等跑完即解决for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1

  7. x86_64 Ubuntu 14.04 LST安装gcc4.1.2 转载

    由于编译源码软件需要用到gcc4.1.2版本,但是本机已经安装有gcc4.8.4,下载gcc4.1.2源码编译总会出现运行找不到库文件错误,或者i386和x86_64不兼容问题,在http://ask ...

  8. 洛谷P1204 [USACO1.2]挤牛奶Milking Cows

    P1204 [USACO1.2]挤牛奶Milking Cows 474通过 1.4K提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 请各位帮忙看下程序 错误 ...

  9. 浅谈 cookie 和 session

    1.关闭浏览器后,session是否还存在? session在服务器和客户端各保留一个副本,关闭浏览器与否和session是否存在没有任何关系. session采取的是服务器端保持状态的方案,它存储在 ...

  10. 【缓存】EF4ProviderWrappers

    在Kooboo中使用了Entity Framework作为持久化框架,但由于EF1.0并没有提供完整缓存解决方案,一直以来都在为数据缓存而烦脑,在没有找到合适解决方案的情况下,采取了临时的解决办法:直 ...