汇编语言:div指令和mul指令

news2024/9/21 12:24:36

1. div指令

        div 是除法指令,在8086CPU中,使用div做除法时,遵循以下规则:

(1)除数:有8位(1字节)和16位(2字节)两种,放在一个寄存器(8位存放在8位寄存器中,16位存放在16位寄存器中)或内存单元中(8位存放在内存字节单元中,16位存放在内存字单元中)
(2)被除数:默认放在ax寄存器或dx和ax寄存器中
        a) 如果除数为8位时,那么被除数为16位,默认存放在ax寄存器中
        b) 如果除数为16位时,那么被除数为32位,在dx和ax寄存器中存放,其中,dx存放被除数的高16位,ax存放被除数的低16位
(3)结果:默认存放在ax寄存器或dx和ax寄存器中
        a) 如果除数为8位,那么结果存放在ax寄存器中,其中,al存放除法操作的商,ah存放除法操作的余数
        b) 如果除数为16位,那么结果存放在dx和ax寄存器中,其中,ax存放除法操作的商,dx存放除法操作的余数

格式:

div bl                           ;除数为8位,存放在bl寄存器中
div byte ptr ds:[0]        ;除数为8位,存放在ds:[0]内存字节单元中
div bx                          ;除数为16位,存放在bx寄存器中
div word ptr ds:[0]       ;除数为16位,存放在ds:[0]内存字单元中

示例1:编写代码求:1001除以100

(1)分析
        a) 因为被除数 1001 小于65535,除数 100 小于255,所以用除数为8位,被除数为16位的div操作规则
        b) 在除数为8位的div除法操作中,被除数存放在ax寄存器中,所以 ax = 1001。除数可以存放在寄存器或内存中,所以我们可以将除数存放在寄存器中,那么可以有 bl = 100.
        c) 在除数为8位的div除法操作中,结果存放在ax寄存器中,al存放div除法操作的商,ah存放div除法操作的余数。
(2)代码

assume cs:code
code segment
    ; 编写代码求 1001/100
    ; 因为被除数 1001 小于 65535,被除数为16位,除数为100,小于255,所以,用除数为8位的除法规则
    ; 除数8位除法中,被除数要放在ax寄存器中
    ; 除数可以放在寄存器或内存中,被除数 = (ax)
start:
    mov ax, 1001    ;被除数
    mov bl, 100     ;除数
    div bl          ;执行该指令后,ax寄存器中的低8位al存放 1001/100 的商,高8位ah存放 1001/100 的余数
                    ;ax = 010Ah, 即 商= (al) = 0Ah,余数 = (ah) = 01h

    mov ax, 4c00h
    int 21h
code ends
end start

示例2:编写代码求:100001除以100

(1)分析:
        a)因为被除数 100001大于65535,所以被除数只能是32位,那么除数为16位。将100001转为十六进制表示为186A1h。
        b)在除数为16位的div除法操作中,被除数存放在dx和ax寄存器中,dx存放被除数的高16位,ax存放被除数的低16位,所以,dx = 1h,ax = 86A1h。除数可以存放在寄存器或内存中,所以我们可以将除数存放在寄存器中,那么可以有 bx = 100。
        c)在除数为16位的div除法操作中,结果存放在dx和ax寄存器中,dx存放div除法操作的余数,ax存放div除法操作的商。
(2)代码

assume cs:code
code segment
    ; 编写代码求 100001/100
    ; 因为被除数 100001 大于 65535,被除数为32位,除数要用16位表示
    ; 除数16位除法中,被除数的低16位要放在ax寄存器中,高16位要放在dx寄存器中组成一个32为的数
    ; 除数可以放在寄存器或内存中,被除数 = (dx)*10000h + (ax) ,将 100001 转为16进制数为:0x186a1
start:
    mov dx, 1       ;被除数的高16位
    mov ax, 86a1h   ;被除数的低16位
    mov bx, 100     ;除数
    div bx          ;执行该指令后,ax寄存器存放 100001/100 的商,dx寄存器存放 100001/100 的余数
                    ;ax = 03E8h(即十进制数1000),dx = 0001h

    mov ax, 4c00h
    int 21h
code ends
end start

2.mul指令

        mul 是乘法指令,在8086CPU中,使用mul做乘法时,遵循以下规则:

(1)两个相乘的数,要么都是8位,要么都是16位
        a) 两个相乘的数都为8位,一个数默认放在 al 8位寄存器中,另一个数放在 8位的寄存器中或内存字节单元中。
        b) 两个相乘的数都为16位,一个数默认放在 ax 寄存器中,另一个数放在16位的寄存器中或内存字单元中
(2)结果:默认存放在ax寄存器或dx和ax寄存器中
        a) 如果是8位乘法,结果默认存放在ax寄存器中
        b) 如果是16位乘法,结果存放在dx和ax寄存器中,ax存放结果的低16位,dx存放结果的高16位

格式

mul bl                       ;8位乘法,一个数默认放在al 8位寄存器中,另一个数存放在bl 8位寄存器中
mul byte ptr ds:[0]    ;8位乘法,一个数默认放在al 8位寄存器中,另一个数存放在ds:[0]内存字节单元中
mul bx                      ;16位乘法,一个数默认放在ax寄存器中,另一个数存放在bx寄存器中
mul word ptr ds:[0]   ;16位乘法,一个数默认放在ax寄存器中,另一个数存放在ds:[0]内存字单元中

示例1:编写代码求:100乘以200

(1)分析

        a) 100和200都小于255,所以可以用mul的8位乘法来计算。
        b) mul的8位乘法中,一个数默认放在al 8位寄存器中,另一个数可以放在8位寄存器中或内存字节单元中,所以,al = 100,可以有 bl = 200。
        c) mul的8位乘法中,结果默认存放在ax寄存器中,所以执行 mul bl 指令后,ax = 20000 = 4E20h。

(2)代码

assume cs:code
code segment
start:
    mov al, 100     ;al = 100
    mov bl, 200     ;bl = 200
    mul bl          ;8位乘法,al乘以bl,结果存放在ax中

    mov ax, 4c00h
    int 21h
code ends
end start

示例2:编写代码求:100除以1000

(1)分析

        a) 100小于255,可1000大于255,所以只能用mul的16位乘法来计算。
        b) mul的16位乘法中,一个数默认放在ax寄存器中,另一个数可以存放寄存器中或内存字单元中,所以,ax = 100,可以有 bx = 1000。
        c) mul的16位乘法中,结果存放在dx和ax寄存器中,ax存放结果的低16位,dx存放结果的高16位,所以执行 mul bx 指令后,ax = 86A0h,dx = 0001h。0001h * 10000h + 86A0h = 100000

(2)代码

assume cs:code
code segment
start:
    mov ax, 100     ;ax = 100
    mov bx, 1000    ;bx = 1000
    mul bx          ;16位乘法,ax * bx,结果的低16位存放在ax,结果的高16位存放在dx

    mov ax, 4c00h
    int 21h
code ends
end start

参考

《汇编语言(第4版)》王爽

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——5.string(模拟实现)

1.存储结构 namespace zone {class string{public:private: //设置私有,不允许随便访问底层数据char* _str; //字符串存储空间首地址指针size_t _size; //当前字符数量size_t _capaicty; //可用容量static const size_t npos;}const size_t string::nops -1;//在类…

MATLAB中ichol函数用法

目录 语法 说明 示例 不完全 Cholesky 分解 使用 ichol 作为预条件子 使用 diagcomp 选项 ichol函数的功能是对矩阵进行不完全 Cholesky 分解。 语法 L ichol(A) L ichol(A,options) 说明 L ichol(A) 通过零填充执行 A 的不完全 Cholesky 分解。A 必须为稀疏方阵。…

西瓜书学习笔记三 归纳偏好

1.4 归纳偏好 通过学习得到的模型对应了假设空间中的一个假设。于是,图1. 2的西瓜版本空间给我们带来一个麻烦:现在有三个与训练集一致的假设,但与它们对应的模型在面临新样本的时候,却会产生不同的输出。现在有一个新瓜,一个模型…

希腊字母大写、小写、音标

▪Αα ▪Ββ ▪Γγ ▪Δδ ▪Εε或ϵ ▪Ϝϝ ▪Ζζ ▪Ηη ▪Θθ ▪Ιι ▪Κκ ▪Λλ ▪Μμ ▪Νν ▪Ξξ ▪Οο ▪Ππ ▪Ρρ ▪Σσ或ς ▪Ττ ▪Υυ ▪Φφ或ϕ ▪Χχ ▪Ψψ ▪Ωω

C语言学习——指针(定义、变量的指针和指向变量的指针变量)

目录 十、指针 10.1地址和指针的概念 10.2变量的指针和指向变量的指针变量 定义一个指针变量 指针变量的引用 指针变量作为函数参数 十、指针 10.1地址和指针的概念 我们要想了解什么是指针,就必须弄清楚数据在内存中是如何存储的,又是如何读取的…

利用EditPlus进行Json数据格式化

利用EditPlus进行Json数据格式化 git下载地址:https://github.com/michael-deve/CommonData-EditPlusTools.git (安装过editplus的直接将里面的json.js文件复制走就行) 命令:Cscript.exe /nologo “D:\Program Files (x86)\EditPlus 3\json.js” D:\P…

代码随想录算法训练营第三十天| 01背包问题 二维, 01背包问题 一维 , 416. 分割等和子集

今天是动态规划学习的第三天,主要的学习内容包括:01背包问题二维数组解法和一维数组解法,以及01背包问题的应用。 01背包问题 二维 题目链接:46. 携带研究材料(第六期模拟笔试) (kamacoder.com) 首先我们…

胡姓名人伟人有哪些?胡姓最厉害三个名人是谁

胡姓名人伟人有哪些?胡姓最厉害三个名人是谁? 在中国悠久的历史长河中,胡姓不仅承载着丰富的文化遗产,更是孕育出无数杰出的历史人物。这些人物以其独特的贡献和影响力,成为中华文明的重要组成部分。以下是根据历史影响力和文化贡献精心挑选的十大胡姓名人,他们的故事和成就展…

GNU/Linux - systemd介绍

systemd官网: System and Service Manager systemd systemd Github地址: https://github.com/systemd/systemd 首次发布 2010年3月30日 System and Service Manager systemd 是一套 Linux 系统的基本构件。它提供了一个系统和服务管理器,作为…

USB 2.0 协议专栏之 USB 配置描述符(四)

前言:本篇博客为手把手教学的 USB 2.0 协议栈类精品博客,该专栏博客侧重针对 USB 2.0 协议进行讲解。第 4 篇重点为 USB 2.0 协议中的配置描述符 Configuration Descriptors 进行讲解,并结合 CH32V307 与 STM32 代码进行 Configuration Descr…

【工业机器人】工业异常检测大模型AnomalyGPT

AnomalyGPT 工业异常检测视觉大模型AnomalyGPT AnomalyGPT: Detecting Industrial Anomalies using Large Vision-Language Models AnomalyGPT是一种基于大视觉语言模型(LVLM)的新型工业异常检测(IAD)方法。它利用LVLM的能力来理…

Oracle VM VirtualBox虚拟机内存不够用的解决方案

一、 前言 在使用Oracle VM VirtualBox虚拟机的过程中,随着时间的推移,我们会感觉我们的内存越来越不够用,今天就来给大家分享一下我们如何解决虚拟机内存不够用的问题。 二、解决方法 1.虚拟机碎片化整理 我们第一步要做的是碎片整理&…

【protobuf】ProtoBuf——proto3语法详解、enum类型、enum类型的使用和注意事项、Any类型、通讯录录入号码类型和地址的功能实现

文章目录 ProtoBuf5. proto3语法详解5.3 enum类型5.4 Any类型 ProtoBuf 5. proto3语法详解 5.3 enum类型 定义规则: proto3支持我们定义枚举类型并使用: 枚举类型的名称采用驼峰命名法且首字母大写,如 MyEnum ,这样的命名方式符合…

重启人生计划-且随风行

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 如果你觉得这个【重启人生…

Element UI详解

目录 Element UIElement UI 简介开发使用开发指南概述总结 设计原则组件使用特性使用场景优势不足 Element UI Element UI 简介 Element UI 是由饿了么前端团队开发的一套基于 Vue.js 的桌面端组件库。它提供了一系列丰富的 UI 组件,用于快速搭建企业级的 Web 应用…

RCE编码绕过--php://filter妙用

目录 代码 如何绕过 payload构造 代码 <?php $content <?php exit; ?>; $content . $_POST[txt]; file_put_contents($_POST[filename],$content); 当你想要输入代码的时候前面会有<?php exit;?>;&#xff0c;代码没有办法执行下去&#xff0c;所以…

day32+学习记录

一.算法练习 509.斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xf…

(待会删)分享9款一键生成原创论文在线使用软件

在当前的学术研究和写作环境中&#xff0c;AI技术的应用已经变得越来越普遍。其中&#xff0c;一键生成原创论文的在线软件更是为学者们提供了极大的便利。本文将重点介绍一款备受推荐的AI原创论文写作平台——千笔-AIPassPaPer&#xff0c;并分享其他几款优秀的同类软件。 千…

政务大数据解决方案(五)

政务大数据解决方案旨在通过建立统一的数据平台&#xff0c;将各政府部门的数据资源进行有效整合与智能分析&#xff0c;利用先进的数据处理和人工智能技术实现对社会动态的实时监测和精准预测&#xff0c;从而优化政府决策、提升公共服务效率和透明度。该方案涵盖数据的采集、…

每日OJ_牛客HJ75 公共子串计算

目录 牛客HJ75 公共子串计算 解析代码 牛客HJ75 公共子串计算 公共子串计算_牛客题霸_牛客网 解析代码 求最大公共子串&#xff0c;使用递推实现 假设 x(i)&#xff1a;字符串第i个字符 y(j)&#xff1a;字符串第j个字符 dp[i][j]&#xff1a;以x(i)&#xff0c;y(j)结尾的最…