两个数相乘的实验

一、实习目的与要求

掌握乘法指令和循环指令的用法。

二、实习内容

实现十进制数的乘法,被乘数和乘数均以ASCⅡ码形式放在内存中,乘积在屏幕上显示出来

三、代码

data segment

  left      db     '45','$';定义十进制相乘左操作数
  right     db     '23','$';定义十进制相乘右操作数

  Bleft     dw      0;
  Bright    dw      0;

  result    db      0;

  c10       dw     10;十进制进位数

  msgOne    db     'The left num is:','$'
  msgTwo    db     0ah,0dh,'The right num is:','$'
  msgThree  db     0ah,0dh,'The result is:','$'

data ends

mystack segment stack

            db     100 dup(?)

mystack ends

code segment
  assume DS:data,CS:code
start:
  mov ax,data;
  mov DS,ax;

  lea dx,msgOne;输出做操作数信息
  mov ah,09h;
  int 21h;
  lea dx,left;
  mov ah,09h;
  int 21h;

  lea dx,msgTwo;输出右操作数信息
  mov ah,09h;
  int 21h;
  lea dx,right;
  mov ah,09h;
  int 21h;

  lea si,left;
  call changeToBinary;
  mov Bleft,ax;

  lea si,right;
  call changeToBinary;
  mov Bright,ax;

  mul Bleft;

  mov cx,0;

changeToDec:
  mov dx,0;
  cmp ax,0;                     判断ax是否为0,为0则跳出循环
  jz outChangeToDex;
  div c10;
  push dx;
  inc cx;
  jmp changeToDec;
outChangeToDex:
  lea dx,msgThree;
  mov ah,09h;
  int 21h;
printResult:
   pop dx;
   add dl,30h;
   mov ah,02h;
   int 21h;
   loop printResult;

  mov ah,4ch;               程序退出
  int 21h;

  changeToBinary proc;      将字符串ASCII数字字符转换为数字
                            ;si寄存器传递参数,ax寄存器返回结果
  push bx;                  保护现场

  mov ax,0;
  mov bh,0;                 bx寄存器高位置零
One:
  mov bl,[si];
  cmp bl,'$';
  jz oneOut;

  mul c10;
  and bl,0fh;

  add al,bl;

  inc (si);
  jmp one

oneOut:
  pop bx;
  ret

code ends
end start

四、截图



时间: 2024-10-09 20:16:45

两个数相乘的实验的相关文章

20150328晚,不使用乘号运算符实现两个数相乘

//20150328晚,不使用乘号运算符实现两个数相乘 #include <stdio.h> #include <stdlib.h> #pragma warning(disable:4996) //using namespace std; int main() { int m, n, t; long long ll, absn, absm; while (scanf("%d %d", &m, &n) != EOF) { absn = n; abs

求两个数相乘

# include<stdio.h> int product(int,int); int main(void) { int x,y,s; scanf("%d %d","&x,&y); s=product(x,y); printf("The multiple is:%d",s); return 0; } int product(inta,intb) { int mul; mul=a*b; return mul; } 原文地址:ht

C语言求两个数中最大公约数

在C语言中如何求两个数的最大公约数呢?下面用三种方法进行求解. 方法一:穷举法. 先比较两个数的大小,然后找出较小数t,最后判断t为何值时两个数都能整除,此方法效率较低. 代码如下: #include<stdio.h> int main() {      int num1,num2,temp,i;      scanf("%d%d",&num1,&num2);      if(num1>num2)      {            temp=num1

求两个数的最小公倍数

1.非递归实现(两个数相乘再除以最大公约数) int max_common_doulbe(int a, int b) { int nMax=a>b?a:b; int nMin=a<b?a:b; while(nMin) { int nTmp=nMax%nMin; nMax=nMin; nMin=nTmp; } int nMaxGY=nMax; //最大公约数 return a*b/nMaxGY; } 2. 递归实现 int max_common_doulbe(int a, int b, int

【Python】【demo实验3】【显示素数,显示两个数范围内的所有素数】

打印两个整数之间的所有素数: (使用平方根来判断  是否应停止验证该数值是否为素数) for i in range(956253526252,9956253526252): k = 1 if i == 2: print(i,"is a prime.") continue else : m = int(i ** 0.5) #square root for j in range(2,m): if i%j == 0: k = 0; #print(i,"is not a prime.

Java 递归解决 &amp;quot;仅仅能两数相乘的计算器计算x^y&amp;quot; 问题

/** * 求一个数的乘方 * 求x^y,y是一个正整数. 设计算器仅仅能计算两数相乘,不能一次计算n个数相乘. * 知:2^5=(2^2)^2*2; 2^6=(2^2)^3=((4)^2)*4; 2^8=(2^2)^4= (4^2)^2= 16^2 * 得到规律:x^y= (x^2)^(y/2),定义a=x^2,b=y/2, 则得到形如: x^y= a^b; * y假设是奇数,则分解的最后还要再乘以a(如上面2^6分解成4^3时):x^y=a^b*x. * * 用递归来解:那么每次x都传入一个

【LeetCode】数组-2(628)-数组中三个数相乘最大

题目不难: 思路一(排序取两端) 先排序,最后三个数相乘即可.(很快就想到了,但是没想全面 [??] ) 缺陷:没有考虑到有负数的情况,当至少有两个负数时,需要判断 最大数乘两个最小的负数 和 三个最大数相乘的大小,返回大的. 代码如下: public class Solution { public int maximumProduct(int[] nums) { Arrays.sort(nums); return Math.max(nums[nums.length - 1] * nums[nu

[猜数字]把两个数和告诉A,积告诉B,求这两个数是什么

1-20的两个数把和告诉A,积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少? 分析: 设和为S,积为M. 首先,A:我不知道. 说明:S可以分解成多个组合,而2=1+1,3=1+2,40=20+20,39=19+20,只有一种分解方式,因此S应属于[4,38]集合. 其次,B:我也不知道. 说明:M也可以分解成多个组合,因此M不是质数. 再者,A:我现在知道了. 说明:S分解方式中只有一个相乘之后是合数,其他分解方式相乘之后都是质数.这样,A才能

Java 递归解决 &quot;只能两数相乘的计算器计算x^y&quot; 问题

/** * 求一个数的乘方 * 求x^y,y是一个正整数.设计算器只能计算两数相乘,不能一次计算n个数相乘. * 知:2^5=(2^2)^2*2; 2^6=(2^2)^3=((4)^2)*4; 2^8=(2^2)^4= (4^2)^2= 16^2 * 得到规律:x^y= (x^2)^(y/2),定义a=x^2,b=y/2, 则得到形如: x^y= a^b; * y如果是奇数,则分解的最后还要再乘以a(如上面2^6分解成4^3时):x^y=a^b*a. * * 用递归来解:那么每次x都传入一个新的