高精度乘法程序設計彙編語言版-課程設計

一段塵封已久的代碼,當年的課程設計!高精度乘法程序設計彙編語言版
1.1 課程設計題目算法

    高精度乘法程序設計編程

1.2 課程設計目的框架

1. 鞏固和加深課堂所學知識函數

2. 將課本上的理論知識和實際應用有機的結合起來,培養同窗們分析和解決實際問題的能力工具

3. 經過對彙編語言程序代碼的閱讀、修改、設計,理解和掌握複雜的彙編語言應用程序的編程,提升實踐編程能力學習

1.3 程序運行環境及開發工具開發工具

    本程序主要在裝有Windows XP的PC機上利用MASM1的軟件來實現。ui

1.4 程序功能使用說明設計

運行該程序後,根據提示信息輸入形如:–256 * 65536 = 的格式,當鍵入  ‘ = ’後自行在‘ = ’後輸出運算結果,當輸入:調試

1.      輸入操做數過程當中輸入多個符號;

2.      輸入‘ = ’前未輸入兩操做數;

3.      輸入‘ * ’前無操做數輸入;

4.      輸入非法操做數、非法操做符  等

程序會進行出錯處理,提示輸入錯誤,要求從新輸入。

 

1.5 關鍵算法:

1.十進制轉化爲二進制

ASCII碼→二進制數(用於輸入)

 因鍵入爲整數,故要進行以下轉換:

 ASCII→BCD→二進制數

  1. ASCII→BCD碼

將十進制數轉換成BCD碼要通過如下三步:
    1. 取ASCII碼的低四位(即十進制數的BCD碼錶示)。可用指令有(設ASCII碼放在AL中):
     SUB AL,30H   
 或 AND AL,0FH
    2. 將高字節ASCII碼左移四位(其高四位即爲BCD碼)。可用指令有(設ASCII碼放在AH中):
    MOV CL,4
    SHL AH,CL 
 或 SAL AH,CL
  3.將兩字節的BCD碼相加

   2.BCD→二進制數在本例中採用用如下方法:

將十進制數的BCD碼轉換爲ASCII 碼,分爲兩種狀況:
   1.對於未組合的BCD碼,只要加上 30H便可。可用以下指令(設BCD碼放在AL中):              

ADD AL,30H        

或 OR AL,30H
   2.對於組合的BCD碼,取其低四位 加上30H,存放在低字節,將原數右移 四位,加上30H存放在高字節。

 總體形如: ((((0+千位數)*10+百位數)*10)+十位數)*10+個位數

 

2.分離64位積

64位積÷1000000000,所得結果爲32位商、32位餘數

3.二進制轉換爲十進制

  本程序使用了32位指令,涉及32位二進制數的操做,在轉換時其步驟:

1.      待轉換數除以10

2.      將餘數入棧

3.      重複1,2步,直到商等於0

4.      出棧,加上30H並顯示

1.5 設計思路:

     本程序採用單模塊設計,調試方便,程序的易讀性好。因爲時間及我的水平的問題,在塗老師的指導下,主程序利用了塗老師的程序框架,根據本身的須要作了修改,添加了更爲詳盡的代碼,增長了錯誤處理,本程序主要包括鍵盤輸入十進制數、十進制轉換爲二進制、兩操做數相乘、積的二進制轉換爲十進制並輸出等,根據本身的理解畫了下面的簡單的流程圖。

 實現1.彙編語言實現高精度乘法程序流程圖

彙編語言實現高精度乘法程序源代碼:

.MODEL SMALL
.386
.STACK  
.DATA
       FLAG_SIGN     DB 0
       FLAG_NUM1    DB 0
       FLAG_NUM2    DB 0
       TEMP            DD 0
       ARRAY         DD 16 DUP(0)
       ERR            DB 0DH,0AH,'Input error!',0DH,0AH,'$'
       STRING           DB 0DH,0AH,0DH,0AH,'Please Input(eg. A*B= )  \
("Q" or "q" quit):', 0DH,0AH,'$'
 
.CODE
 .STARTUP
AGAIN:
       LEA DX,STRING                 ;輸入提示符
       MOV AH,9
       INT 21H
       MOV EBX,OFFSET ARRAY
       MOV FLAG_SIGN,0             ;Init  符號標誌  默認0爲正
       MOV FLAG_NUM1,0             ;操做數輸入標誌  若無則爲0
       MOV FLAG_NUM2,0             ;操做數輸入標誌  若無則爲0
L_Input0:
       XOR EDX,EDX
       XOR ECX,ECX
       XOR EAX,EAX
       MOV AH,1                   ;Input  begin
       INT 21H
       CMP AL,'+'
       JZ  L_Input1
       CMP AL,'-'
       JNZ L_Number               ;if not  '-',   maybe  unsign
       NOT FLAG_SIGN              ;符號標誌處理
L_Input1:
       MOV AH,1
       INT 21H 
L_Number:
       CMP AL,'0'
       JB  L_Operator
       CMP AL,'9'
       JA  L_Operator
       SUB AL,30H               ;ascii to bin
       ADD EDX,EDX
       MOV ECX,EDX
       ADD ECX,ECX
       ADD ECX,ECX
       ADD EDX,ECX
       MOV AH,0
       ADD EDX,EAX
       MOV FLAG_NUM1,1               ;有操做數輸入
       JMP L_Input1                  ;continue   input
L_Operator
       CMP AL,'*'
       JNZ L_Equal
       CMP FLAG_NUM1,0               ;' * ' 輸入前有無操做數輸入
       JZ  ER
       MOV [BX],EDX                 ;第一操做數送[  BX ]
       ADD BX,4

       MOV FLAG_NUM1,0              ;爲輸入第二操做數作準備
       MOV FLAG_NUM2,1              ;判斷操做數輸入標誌
       JMP L_Input0                 ;input  other number
L_Equal:
       MOV [BX],EDX                ;第二操做數存[  BX ]  ,  BX=BX+4
       CMP AL,'='
       JNZ L_Quit1
       MOV BL,FLAG_NUM1            ;判斷兩操做數的輸入
       MOV CL,FLAG_NUM2
       CMP BL,CL
       JNZ ER
       CMP FLAG_SIGN,0            ;乘積的符號處理
       JZ  L_Cal         
       MOV DL,'-'                  ;display  '-'
       MOV AH,2
       INT 21H
L_Cal:
       MOV CX,0
       MOV SI,CX
       MOV EAX,ARRAY[SI+4]            ;將輸入的操做數之一存EAX
       MOV EBX,ARRAY[SI]              ;將另外一操做數存EBX
       MUL EBX                        ;兩操做數相乘求積

       MOV EBX,1000000000            ;分離乘積中的高32位 , 低32位
       DIV EBX                       ;即分離開 DX , AX 

       MOV TEMP,EAX                  ;處理商
       CALL BINTOASCII                ;將商轉換爲十進制數並輸出
 
       MOV TEMP,EDX                    ;處理餘數
       CMP TEMP,0                         ;若餘數爲0  直接輸出低位的0
       JZ   Show_0
       CALL  BINTOASCII                 ;將餘數轉換爲十進制數並輸出
       JMP AGAIN                         ;返回繼續運算
Show_0:
       MOV CX,9                          ;輸出0
Display:
       MOV DL,'0'
       MOV AH,2
       INT 21H
       DEC CX
       CMP CX,0
       JNZ Display
       JMP AGAIN                        ;返回繼續運算

L_Quit1:
       CMP AL,'Q'                       ;'Q ' or 'q' 則退出
       JNZ L_Quit2
       JMP L_Quit

L_Quit2:
       CMP AL,'q'
       JNZ ER
       JMP L_Quit

ER:            
       MOV DX,OFFSET ERR           ;錯誤處理
       MOV AH,9
       INT 21H
       JMP AGAIN
L_Quit:
 .EXIT 0


;子程序名:   BINTOASCII
;子程序功能: 將無符號雙字變量TEMP中的二進制數抓轉換位相應的十進制 \  的ASCII碼並輸出
;入口參數:   雙字變量TEMP
;出口參數:   無
;所使用寄存器:EBX , EAX , EDX  
BINTOASCII PROC
       PUSH EAX                                  ;保護現場
       PUSH EBX
       PUSH ECX
       PUSH EDX
       MOV EAX,TEMP                  ;待處理數存EAX
       MOV EBX,10
       PUSH BX                       ;壓入10做爲結束標誌
B3:
       CMP EAX,0                      ;EAX=0 (  數據爲0  )  ,則退出
       JZ B4
       SUB EDX,EDX                    ;擴展 EDX 爲 0
       DIV EBX                        ;EDX:EAX/EBX (  10  )
       ADD DL,30H                                 ;餘數轉換爲ASCII碼
       PUSH DX                                      ;並將其入棧
       JMP B3
B4:
       POP DX                                                ;將各位數出棧
       CMP DL,10                                          ;是結束標誌( 10 ) ,則退出
       JE  B5 
       MOV AH,2                                     ;顯示各數        
       INT 21H
       JMP B4
B5:
       POP EDX                                      ;恢復現場
       POP ECX
       POP EBX
       POP EAX
       RET
BINTOASCII ENDP
  END

運行結果截圖:


課程設計心得:

通過一個星期的上機實踐學習,使我對彙編語言有了更進一步的認識和了解,要想學好它要重在實踐,要經過不斷的上機操做才能更好地學習它,經過實踐,我也發現個人好多不足之處,首先是本身在指法上還不行,常常按錯字母,經過學習也有所改進;再有對彙編語言的一些指令不太瞭解,還有對函數調用的正確使用不夠熟悉,經過實踐,使我在這幾個方面的認識有所提升。

經過實踐的學習,我認到學好計算機要重視實踐操做,不單單是學習彙編語言,仍是其它的語言,以及其它的計算機方面的知識都要重在實踐,因此後在學習過程當中,我會更加註視實踐操做,使本身便好地學好計算機。

 

參考文獻:

[1]沈美明,溫冬嬋.IBM-PC彙編語言程序設計[M].北京:清華大學出版社,1991.

[2]趙樹升,楊建軍.DOS/Windows彙編語言程序設計教程. 北京:清華大學出版社,2005.6

[3]錢曉捷. 彙編語言程序設計(第二版). 北京:電子工業出版社,2003.6

相關文章
相關標籤/搜索