AHU 汇编 实验四

news/2024/11/29 19:40:41/

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

  • 实验内容:

用子程序形式编写:

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

  • 实验过程:

源代码:

data segmentmul1 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 endscode segmentassume cs:code,ds:datamain proc far                   ; main programmov ax,datamov ds,axpush dsxor ax,ax                    ;push ds and es and ax=0call tips1                   ;提示用户输入第一个数call input1                  ;在缓冲区接收call tips2                   ;提示用户输入第一个数call input2                  ;在缓冲区接收lea si,mul1+2                ;开始将第一个数10进制转换成2进制call dtob      push bx                      ;压栈保存第一个数的2进制lea si,mul2+2call dtob                    ;开始将第一个数10进制转换成2进制mov dx,bx                    ;dx中装的是第二个数的二进制pop bx                       ;bx中装的是第一个数的二进制call multiple                ;调用乘法子程序call tips3                   ;提示结果输出call btod                    ;将结果的二进制转换成十进制输出mov ah,4chint 21hretmain endp;-----------------------------------------------------------tips1 proc nearmov dx,offset buff1mov ah,9int 21hrettips1 endp;------------------------------------------------------------input1 proc nearlea dx,mul1mov ah,0ahint 21hmov dl,13mov ah,2int 21hmov dl,10mov ah,2int 21hretinput1 endp;--------------------------------------------------------------tips2 proc nearmov dx,offset buff2mov ah,9int 21hrettips2 endp;-----------------------------------------------------------input2 proc nearlea dx,mul2mov ah,0ahint 21hmov dl,13mov ah,2int 21hmov dl,10mov ah,2int 21hretinput2 endp;--------------------------------------------------------------dtob proc nearmov bx,0getnum:mov al,byte ptr [si]     ;用al保存第一个字符sub al,30hjl  exit1cmp al,9jg  exit1cbwxchg ax,bxmov dx,10mul dxxchg ax,bxadd bx,axinc si                  ;循环,如果遇到的不是0~9的数就自动跳出程序jmp getnumexit1: retdtob endpmultiple proc nearmov bp,0                ;用bp寄存器保存结果start:shr dx,1                ;右移第二个乘数,判断CF的值,如果是1就进行加法操作,如果是0就继续右移jc additionshl bx,1                ;第一个乘数左移cmp dx,0                ;当第二个数为0是结束jz exit2jmp startaddition:add bp,bx               ;将相加结果保存在BP寄存器中shl bx,1jmp startexit2 :retmultiple endpbtod proc nearmov ax, bp             ;把bp寄存器的值给axmov cx, 1              ;计数器mov bl, 10             ;10作除数div1:idiv bl              push ax                ;保存ax/10后的结果,ah存放余数,al存放商cmp al, 0              ;商为0则开始输出jz outputmov ah, 0              ;置余数为0,继续除inc cxjmp div1output:pop dx               mov dl, dh            ;出栈输出余数add dl, 30hmov ah, 2int 21hloop outputretbtod  endptips3 proc nearmov dx,offset buff3mov ah,9int 21hrettips3 endpcode endsend main

运行结果:

  • 实验小结:

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


http://www.ppmy.cn/news/1379633.html

相关文章

vscode中解决驱动编写的时候static int __init chrdev_init()报错的问题

目录 错误出错原因解决方法 错误 在入口函数上,出现 expected a ; 这样的提示 出错原因 缺少了 __KERNEL __ 宏定义 解决方法 补上__KERNEL__宏定义 具体做法:在vscode中按下ctrlshiftp ,输入:C/C:Edit Configurations&#xff0…

qt带后缀单位的QLineEdit

QLineEditUnit.h #pragma once #include <QLineEdit> #include <QPushButton>class QLineEditUnit : public QLineEdit {Q_OBJECT public:QLineEditUnit(QWidget* parent Q_NULLPTR);~QLineEditUnit();//获取编辑框单位QString UnitText()const;//设置编辑框单位…

docker离线搭建仓库

要在Docker中搭建本地仓库&#xff0c;可以按照以下步骤进行操作&#xff1a; 首先安装 Docker。根据不同的操作系统选择合适的版本并完成安装过程。打开命令行工具&#xff08;如Terminal或PowerShell&#xff09;&#xff0c;运行以下命令来创建一个新的容器并将其设置为本地…

先缓存第二集抖音接入 ,最近加班猛,就分享简单的知识,如何使用:关于使用replace的用法正则表达式

1、需求&#xff1a;比如在cocos creator策划让你制作一个预制体&#xff0c;标题要读取配置&#xff0c;然后中间显示的内容要滚动的&#xff0c;要做成一个通用的&#xff0c;然后给到的配置表是这样子的: 配置表&#xff1a;假设字段是这样子的 content "内容标题&…

redis最新版本在Windows系统上的安装

一、说明 这次安装操作主要是根据redis官网说明&#xff0c;一步步安装下来的&#xff0c;英语比较好的同学&#xff0c;可以直接看文章底部的超链接1&#xff0c;跳到官网按步操作即可。 目前redis的最新稳定版本为redis7.2。 二、Windows环境改造 Redis在Windows上不被官方…

03:HAL---中断

目录 一:中断 1:简历 2:AFIO 3:EXTI 4:NVIC基本结构 5:使用步骤 6:设计中断函数 二:中断的应用 A:对外式红外传感计数器 1:硬件介绍 2:计数代码 B:旋转编码计数器 1:硬件介绍 2:旋转编码器代码 C:按键控制LED D:代码总结 一:中断 1:简历 中断&#xff1a;在主程序…

cpu masks的初始化

在内核中&#xff0c;有几个位图变量是用作标识cpu数量和状态的&#xff0c;它们分别是&#xff1a; 变量名称用途循环所使用的宏cpu_possible_mask系统中有多少个可以运行的cpu核for_each_possible_cpucpu_present_mask系统中有多少个可处于运行状态的cpu核for_each_present_…

【漏洞复现】Linksys E2000 position.js 身份验证绕过漏洞(CVE-2024-27497)

0x01 产品简介 Linksys E2000是一款由思科&#xff08;Cisco&#xff09;品牌推出的无线路由器&#xff0c;它是一款支持2.4GHz和5GHz双频段的无线路由器&#xff0c;用户可以避开拥挤的2.4GHz频段&#xff0c;独自享受5GHz频段的高速无线生活。 0x02 漏洞概述 Linksys E200…