AHU 汇编 实验四

  • 实验名称:实验四 两个数的相乘

  • 实验内容:

用子程序形式编写:

A*B:从键盘输入a和b,计算A*B,其中乘法采用移位和累加完成

  • 实验过程:

源代码:

data segment

   mul1 db 16,?,16 dup(?)

   mul2 db 16,?,16 dup(?)

   buff1 db 'Please input mul1: $'

   buff2 db 'Please input mul2: $'

   buff3 db 'The consequense is : $'

data ends

code segment

   assume cs:code,ds:data

main proc far                   ; main program

   mov ax,data

   mov ds,ax

   push ds

   xor ax,ax                    ;push ds and es and ax=0

   call tips1                   ;提示用户输入第一个数

   call input1                  ;在缓冲区接收

   call tips2                   ;提示用户输入第一个数

   call input2                  ;在缓冲区接收

   lea si,mul1+2                ;开始将第一个数10进制转换成2进制

   call dtob      

   push bx                      ;压栈保存第一个数的2进制

   lea si,mul2+2

   call dtob                    ;开始将第一个数10进制转换成2进制

   mov dx,bx                    ;dx中装的是第二个数的二进制

   pop bx                       ;bx中装的是第一个数的二进制

   call multiple                ;调用乘法子程序

   call tips3                   ;提示结果输出

   call btod                    ;将结果的二进制转换成十进制输出

   mov ah,4ch

   int 21h

   ret

   main endp

;-----------------------------------------------------------



tips1 proc near

   mov dx,offset buff1

   mov ah,9

   int 21h

ret

tips1 endp

;------------------------------------------------------------



input1 proc near

    lea dx,mul1

    mov ah,0ah

    int 21h

    mov dl,13

    mov ah,2

    int 21h

    mov dl,10

    mov ah,2

    int 21h

ret

input1 endp

;--------------------------------------------------------------



tips2 proc near

mov dx,offset buff2

   mov ah,9

   int 21h

ret

tips2 endp

;-----------------------------------------------------------



input2 proc near

    lea dx,mul2

    mov ah,0ah

    int 21h

    mov dl,13

    mov ah,2

    int 21h

    mov dl,10

    mov ah,2

    int 21h

ret

input2 endp

;--------------------------------------------------------------





dtob proc near

  mov bx,0

getnum:

  mov al,byte ptr [si]     ;用al保存第一个字符

  sub al,30h

  jl  exit1

  cmp al,9

  jg  exit1

  cbw

  xchg ax,bx

  mov dx,10

  mul dx

  xchg ax,bx

  add bx,ax

  inc si                  ;循环,如果遇到的不是0~9的数就自动跳出程序

  jmp getnum

exit1: ret

dtob endp





multiple proc near

   mov bp,0                ;用bp寄存器保存结果

start:

   shr dx,1                ;右移第二个乘数,判断CF的值,如果是1就进行加法操作,如果是0就继续右移

   jc addition

   shl bx,1                ;第一个乘数左移

   cmp dx,0                ;当第二个数为0是结束

   jz exit2

   jmp start

addition:

   add bp,bx               ;将相加结果保存在BP寄存器中

   shl bx,1

   jmp start

exit2 :ret

multiple endp



btod proc near

    mov ax, bp             ;把bp寄存器的值给ax

    mov cx, 1              ;计数器

    mov bl, 10             ;10作除数

div1:

    idiv bl              

    push ax                ;保存ax/10后的结果,ah存放余数,al存放商

    cmp al, 0              ;商为0则开始输出

    jz output

    mov ah, 0              ;置余数为0,继续除

    inc cx

    jmp div1

output:

     pop dx               

     mov dl, dh            ;出栈输出余数

     add dl, 30h

     mov ah, 2

     int 21h

     loop output



    ret

btod  endp



tips3 proc near

   mov dx,offset buff3

   mov ah,9

   int 21h

ret

tips3 endp



code ends

end main

运行结果:

  • 实验小结:

这次的实验有一个很困惑我的地方就是我一开始弄错了,以为我们用户能用的寄存器只有AX,BX,CX,DX这四个,所以我一直拿缓冲区的内存当作一个寄存器来回使用,这对我进行数的操作造成了很大的不便,此外我的移位操作乘法,设计的很麻烦,一开始总是想用一个寄存器保存第二个乘数的1的位权,这就遇到了我上面说的寄存器不够的情况,后来在老师的帮助下,我改进了算法,只要判断右移的第二个乘数CF位是0,还是1,如果是1就把AX左移的结果加进来,AX的值无需保存,只要最后把结果放进BP寄存器就可以了。通过这次实验,我收获了很多。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins cron定时构建触发器

from: https://www.jenkins.io/doc/book/pipeline/syntax/#cron-syntax 以下内容为根据Jenkins官方文档cron表达式部分翻译过来,使用机翻加个人理解补充内容,包括举例。 目录 介绍举例:设置方法方法一:方法二&#xf…

web | http 的一些问题 | get/post的区别 | http版本 | http与https的区别 | session、cookie、token

怎么来说呢?这应该算一个大类了,基本上设计网络的应用层 当然重要的是从网络层----->应用层 (杠精勿杠,知道中间还有其他层) 先来讲一下http的结构 都知道http 有三部分,头部、请求头和body 头部&#x…

SQLiteC/C++接口简介

上一篇:SQLite——世界上部署最广泛的开源数据库(简介) 下一篇:SQLiteC/C接口详细介绍(一) 引言: 作为一种轻量级、嵌入式关系型数据库,SQLite已经成为许多应用和系统的首选解决方…

Discord OAuth2授权以及机器人监听群事件

下面文章讲解获取OAuth2授权整个流程,创建机器人,使用机器人监听工会(工会就是创建的服务器)成员变化等等,对接国外的都是需要VPN的哦,对接的时候记得提前准备。 创建应用 点击 此页面添加应用,&#xff…

使用kettle批量加载数据到kadb

测试环境 达梦数据库版本:DM Database Server 64 V8 03134284132-20240115-215128-20081(官网测试版)KADB版本:KADB V003R002C001B0181Kettle版本:pdi-ce-9.4.0.0-343(官网下载)Python版本&…

解释“RNN encode-decode”

“RNN encode-decode” 涉及使用循环神经网络(Recurrent Neural Network,RNN)来执行编码和解码操作。这种结构常用于处理序列数据,例如自然语言处理、语音识别和时间序列预测等任务。 以下是 “RNN encode-decode” 的一般概念&a…

Flink实操:Flink SQL实现SFTP文件读写操作

一、背景 公司需要将Doris数据库中的部分表数据同步至SFTP服务器,以供其他合作企业安全读取和使用。目前,平台数据同步功能统一使用Flink引擎进行实时同步、离线同步的工作。因此,希望能够充分利用现有的Flink引擎,并将其复用于这…

四 超级数据查看器 讲解稿 列表功能1

四 超级数据查看器 讲解稿 列表功能1 点击此处 以新页面 打开B站 播放教学视频 APP下载地址 百度手机助手 下载地址4 讲解稿全文: 大家好,今天我们讲解一下,超级数据查看器列表界面,分为1-2两集。 首先&#xff0c…

ChatGPT+MATLAB应用

MatGPT是一个由chatGPT类支持的MATLAB应用程序,由官方Toshiaki Takeuchi开发,允许您轻松访问OpenAI提供的chatGPT API。作为官方发布的内容,可靠性较高,而且也是完全免费开源的,全程自己配置,无需注册码或用…

MySQL的加锁规则

学习了MySQL的锁后,知道其有这么多锁,那应该会有些疑惑,这么多锁,究竟我在写sql语句时候用到哪个锁的,什么情况是用什么锁的?在哪里查看该sql语句是用了哪些锁的呢?加锁的规则是什么呢&#xff…

【C++初阶】第六站 : 模板初阶

前言: 本章知识点:泛型编程、函数模板、类模板 专栏: C初阶 目录 泛型编程 函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的原理 4.函数模板的实例化 5.模板参数的匹配原则 类模板 类模板的定义格式 类模板的实例化 泛型编程 如何实现一…

Redis 的基本全局命令

前言 Redis 常用的有 5 种数据结构,字符串,列表,哈希表,集合,有序集合,每一种数据结构都有自己独特的命令,但也有些通用的全局命令,本文所提到的是最基本的命令,Redis 的…

linux查看文件内容cat,less,vi,vim

学习记录 目录 catlessvi vim cat 输出 FILE 文件的全部内容 $ cat [OPTION] FILE示例 输出 file.txt 的全部内容 $ cat file.txt查看 file1.txt 与 file2.txt 连接后的内容 $ cat file1.txt file2.txt为什么名字叫 cat? 当然和猫咪没有关系。 cat 这里是 co…

使用 IDEA 将本地jar上传到本地maven仓库

IDEA中的操作步骤 创建一个 Maven 运行配置 在开发工具的导航栏中,点击选择配置: 在配置界面点击左上角的加号,随后选择增加一个maven运行配置: 编辑 Maven 配置 上图中的含义: Name 对应的是本配置的名字、用处或功…

PyTorch搭建AlexNet训练集

本次项目是使用AlexNet实现5种花类的识别。 训练集搭建与LeNet大致代码差不多,但是也有许多新的内容和知识点。 1.导包,不必多说。 import torch import torch.nn as nn from torchvision import transforms, datasets, utils import matplotlib as p…

NFTScan | 03.04~03.10 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2024.03.04~ 2024.03.10 NFT Hot News 01/ 数据:比特币链上 NFT 过去 24 小时销售额超 3100 万美元 3 月 4 日,据数据显示,比特币链上 NFT 过去 24 小…

设计模式十:原型模式

文章目录 1、原型模式1.1 类创建过程1.2 浅拷贝1.3 深拷贝 2、示例2.1 简单形式2.2 复杂形式 3、spring中的原型模式3.1 ArrayList的原型模式3.2 spring中的原型模式 1、原型模式 原型模式就是从一个对象再创建另外一个可定制的对象, 而且不需要知道任何创建的细节。…

Vscode+QT+Python

参考链接:VSCodePyQt之Python界面编写_vscode编写图形化界面-CSDN博客 1.安装库 pip install PyQt5 pip install PyQt5-tools pip install qt5_applications 2.在VSCode里下载并安装PYQT Integration 3.配置pyqt integration 4.打开qt designer 在工程文件的空白…

python自动化之pytest框架以及数据驱动(第五天)

1.pytest框架需要遵循的规则 (1).py 测试文件必须以test 开头(或者以 test结尾) (2)测试类必须以Test开头,并且不能有 init 方法 (3)测试方法必须以test 开头 (4)断言…