一段塵封已久的代碼,當年的課程設計!高精度乘法程序設計彙編語言版
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