1. 程式人生 > >【彙編程式】兩個長整數相乘

【彙編程式】兩個長整數相乘

STACKS  SEGMENT  STACK
        DW    100 DUP(?)
		TOP   LABEL WORD
		STACKS ENDS
		
DATAS   SEGMENT
		NUM1 DW 9,9,8,7,4,5,6,7,8,9
		NUM2 DW 6,4,5,6,7,8,9          ;定義兩個數字,首位存放num的長度,這兩個數字將用於做乘法運算
		S    DW  300H DUP(0)           ;s用於存放結果
		DATAS ENDS
		
CODES   SEGMENT
        ASSUME  CS:CODES,DS:DATAS,SS:STACKS
		MAIN  PROC FAR
		          MOV  AX,STACKS
			  MOV  SS,AX
			  LEA  SP,TOP
			  MOV  AX,DATAS
			  MOV  DS,AX
			  
		          LEA   SI,NUM1
			  LEA   DI,NUM2
			  LEA   BX,S
			  ADD   SI,2			  
			  ADD   DI,2         ;加2的原因是因為第一位是數字的個數,從第二個數字開始才是真正的數,因為是DW的所以需要+2
			  
			  MOV   CX,NUM1
		JIN1:     PUSH  [SI]
			  ADD   SI,2
   			  LOOP  JIN1
			  
			  LEA   SI,NUM1
			  ADD   SI,2
			  MOV   CX,NUM1
		CHU1:     POP   [SI]
		          ADD   SI,2
			  LOOP  CHU1          ;進棧出棧的目的是為了倒置該字串用於乘法運算
			  
		          MOV   CX,NUM2
		JIN2:     PUSH  [DI]
			  ADD   DI,2
   			  LOOP  JIN2
			  
			  LEA   DI,NUM2
			  ADD   DI,2
			  MOV   CX,NUM2
		CHU2:     POP   [DI]
		          ADD   DI,2
			  LOOP  CHU2          ;同上
			  
			   
		          LEA   SI,NUM1
			  LEA   DI,NUM2
			  LEA   BX,S
			  ADD   SI,2			  
			  ADD   DI,2
			  
		      MOV   CX,NUM1	     ;二重迴圈,把每個數都相乘,並存在s的對應位置,如果該位置裡有值,則加上該值
        L1:	      PUSH  CX	
		      MOV   CX,NUM2
        	      PUSH  BX
			  PUSH  DI
		L2:	  MOV   DX,[SI]
			  MOV   AX,[DI]
			  MUL   DX
			  ADD   DI,2
			  ADD   AX,[BX]
			  MOV   [BX],AX
			  ADD   BX,2
			
			  LOOP L2
			  POP  DI
			  POP  BX
			  ADD  BX,2
			  POP  CX
			  ADD  SI,2
			  LOOP L1
			
		     XOR   DX,DX         
		     LEA    BX,S
		     MOV    CX,NUM1
		     ADD    CX,NUM2          ;將s中每一個數除以10,餘數放回原位,商作為進位
                L4:      MOV    AX,[BX]
		         ADD    AX,DX
			 MOV    DL,10
			 DIV    DL
			 MOV    DL,AH
			 MOV    [BX],DX
			 MOV    DL,AL
			 
			 ADD    BX,2
			 LOOP L4 
		
		     
			 MOV    CX,NUM1
			 ADD    CX,NUM2
			 
			
		L5:  SUB    BX,2                ;逆序,輸出結果
		     MOV    DX,[BX]
			 ADD    DX,30H
			 MOV    AH,2
			 INT    21H
			 
			 LOOP L5
			  
		L10:  MOV   AH,4CH
			  INT   21H
			  MAIN  ENDP
			  CODES ENDS
			        END MAIN

相關推薦

彙編程式整數相乘

STACKS SEGMENT STACK DW 100 DUP(?) TOP LABEL WORD STACKS ENDS DATAS SEGMENT NUM1 DW 9,9,8,7,4,5,6,7,8,9 NUM2 D

關於整數相乘的實現

題目:實現兩個長整數相乘的演算法。 此程式碼可實現任意長度的兩個數相乘,實現方法採用單向連結串列。 以下是我的程式碼. 備註:此程式碼有參考網上的程式碼。 #include "stdafx.h" #

單鏈表實現整數相乘

#include<iostream.h> #include<stdlib.h> #include<string.h> #define MAX 100 #define toInt(a) (*(a)-'0') typedef struc

typescript物品圍繞旋轉效果

記錄一下旋轉的原理,使用計時器來移動座標,或者改為按幀移動也可。 程式碼裡的物件或其他介面,能看得懂就行,就不貼上來了。 效果:   private _circleCenter = {x: 279, y: 229};//中心,訂半徑 private _aPos

JS陣列的交集 II #排序 #雜湊 #雙指標 #二分查詢

給定兩個陣列,編寫一個函式來計算它們的交集。 示例 1: 輸入: nums1 = [1,2,2,1], nums2 = [2,2] 輸出: [2,2] 示例 2: 輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出: [4,9] 說明: 輸出結

JS 陣列的交集 #排序 #雜湊 #雙指標 #二分查詢

給定兩個陣列,編寫一個函式來計算它們的交集。 示例 1: 輸入: nums1 = [1,2,2,1], nums2 = [2,2] 輸出: [2] 示例 2: 輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出: [9,4] 說明: 輸出結果中

java程式計算整數相乘

方法1 :用兩個字串儲存輸入的大整數,然後用第二個字串的每一位去乘第一個字串的數字值,最後將每次的結果錯位相加即可。時間複雜度高O(n^2) 方法2:將兩個大整數X,Y每次分割成兩半,第一個分割成AB,第二個分割成CD。所以最後結果XY=(A*10^n/2 +B)(C*10^m/2+D);進

ES6例子明白箭頭函式this指向問題

前言:es6箭頭函式沒出現之前,this的指向不是函式被建立時繫結,而是被怎麼樣的方式呼叫時繫結的。而箭頭函式剛好相反,箭頭函式的this指向是函式被建立時繫結的,它的指向就是當前詞法作用域中的this

SQL帶order by查詢進行union all報ORA-00933錯誤的解決方法

在oracle SQL中,要求order by是select語句的最後一個語句,而且一個select語句中只允許出現一個order by語句,而且order by必須位於整個select語句的最後。 當時是要將一個十分複雜的檢索明細查詢和一個十分複雜的檢索彙總查詢的結果

Leetcode有序陣列的中位數

解法一: 當合並後的總元素個數是奇數時,中位數的下標是n/2。當總元素個數是偶數時,中位數是下標n/2-1和下標n/2兩個元素的平均值。不論總個數奇偶,可以將n/2作為右中位數,n/2-1作為左中位數,只不過總個數是奇數時,沒用到左中位數。也就是說必須要找到第

MATLAB 序列的卷積和運算的MATLAB實現(1)

設矩形脈衝  是脈衝響應  的LTI系統的輸入,求輸出 y(n). 下面的指令碼中用到了一個自定義的函式,也就是兩個訊號相加的函式: function [y,n] = sigadd(x1,n1,

JS實現大數(整數)相乘 例項程式碼

在javascript中,大數,即超出語言所能表示的數字最大範圍的數字,那麼如何實現兩個大數相乘呢? 程式碼:console.log(bigMut("567", "1234")); // 699678 function bigMut(big, common) { big

堆疊棧模擬佇列

之前想的太複雜了,過分地考慮空間的利用率,使得邏輯非常複雜,簡直要爆炸,看了標準答案後,媽的如此簡單!! 答案思路:準備兩個棧A,B。A專門用於入隊,B專門用於出隊。 當要入隊時,如果A沒有滿,那麼很正常地把元素壓入A。如果A已經滿了,如果B是空的,我們就把A的元素全部壓

程式6  題目:輸入整數m和n,求其最大公約數和最小公倍數。

在迴圈中,只要除數不等於0,用較大數除以較小的數,將小的一個數作為下一輪迴圈的大數,取得的餘數作為下一輪迴圈的較小的數,如此迴圈直到較小的數的值為0,返回較大的數,此數即為最大公約數,最小公倍數為兩數之積除以最大公約數。 import java.util.Scanner;

程式6 題目:輸入整數m和n,求其最大公約數和最小公倍數。

/* 2017年3月2日15:10:11 java基礎50道經典練習題 例6 Author:ZJY(&&) Purpose:最大公約數和最小公倍數的應用 最大公約數:把每個數分別分解質因數,再把各數中的全部公有質 因數提取出來連乘,所得的積就

程式16 題目:輸入整數m和n,求其最大公約數和最小公倍數。

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> /* 【程式16】 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 【分析】 最大公約數:輾除法 最小公倍數:兩數之積除以最大公約數 */ int main(int argc,

C語言int(32位)整數m和n的二進位制表達中,有多少個位(bit)不同

根據異或我們可以知道,兩個數字的二進位制位按位異或,相同為0,相異為1。 因此我們可以通過將兩個數字按位異或,並計算該異或結果中二進位制位中1的個數,即可知道有多少個位元位不同。 int count(int a, int b) { int m = a ^ b; // 兩個數按位異或,對應不

二叉樹上的路徑數過樹上節點最路徑

#include<bits/stdc++.h> using namespace std; const int maxn=1e3+20; vector<int>G[maxn]; int x,y,ans,n; int dfs(int v){ int

JAVA習題六輸入整數m和n,求其最大公約數

import java.util.Scanner; public class Oujilide歐幾里得 { public static void main(String[] args) { // TODO Auto-generated method stub Scan

數據結構單循環鏈表的連接操作

單鏈表 ont rac 步驟 lis ext content mil 改變 假設在單鏈表或頭指針表示的鏈表上操作這個比較消耗性能,由於都須要遍歷第一個鏈表。找到an,然後將b1鏈接到an的後面。時間復雜度是:O(n)。若在尾指針表示的單循環鏈表上實現,則僅僅需改變指針,