1. 程式人生 > >匯編語言系列Ⅱ 實現簡單數學運算

匯編語言系列Ⅱ 實現簡單數學運算

其它 緩沖 pre push n! 實現簡單 bsp 堆棧 算術

軟件:emu8086

語言:匯編語言(Assembly)

註意:本文列出了兩種算術運算的代碼,全部代碼為博主獨自一人編寫,會有瑕疵,謹慎使用。

5.計算S=1+2×3+3×4+4×5+···+N(N+1)

5.1設計要求:

設計程序,實現數學公式S=1+2×3+3×4+4×5+···+N(N+1)的算法。數值N由加鍵盤輸入,計算結果在顯示終端輸出。設計要求:計算結果不超過十六位寄存器的存儲能力,如有溢出提示錯誤。

5.2設計思路:

輸入N值然後把N給BH作為循環次數,通過循環實現乘和累加計算,結果為十六進制,通過除以10得到十進制,存入堆棧再依次輸出。

技術分享圖片

5.3程序清單:

DATA SEGMENT
     pkey   DB  0dh,0ah,
"pleas input N end by ‘;‘ :$" over DB 0AH,0DH,"overflow!",0dh,0ah,$ result DB 0dh,0ah,result is:,$ DAT1 DB 8 DUP(0) DATA ENDS STACK SEGMENT SSTACK DB 100 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK STATE: MOV AX,DATA MOV DS,AX LEA
SI,DAT1 ;開辟緩沖區 LEA DX,pkey MOV AH,9 INT 21H ;DOS功能調用,輸出字符串 LLP:MOV AH,1 INT 21H ;DOS功能調用,輸入N值 SUB AL,2FH INC DX ;DX計數 MOV [SI],AL ;將輸入的數據存在SI緩沖區 INC SI CMP AL,0CH ;輸入為封號結束輸入 JNZ LLP SUB SI,2 CMP DX,02H ;
DX不為2表示輸入為兩位數 JNZ LLLP LLP1:MOV CX,1 MOV BL,2 ;賦初始值 JMP LP LLLP: MOV DI,SI SUB DI,1 SUB [DI],1 MOV AL,10 MUL [DI] ADD [SI],AX ;輸入是兩位數時十位乘10加個位 SUB AH,AH JMP LLP1 LP: MOV BH,[SI] ;把循環次數給BH MOV AL,BL INC BL MUL BL ;BL(加1)和AL(原值)相乘給AX ADD CX,AX ;AX和CX相加給CX,通過循環實現累加 JO OOF ;如果溢出重新輸入 CMP BH,BL ;判斷是否達到N值 JNZ LP MOV AX,CX MOV CX,0AH MOV BX,0 LOP:MOV DX,0 DIV CX ;AX表示的32位數除以10,商放在AX,余數放在DX INC BX ADD DX,30H PUSH DX ;將余數依次壓入棧 CMP AX,0 JNZ LOP ;商不為0繼續除10 LEA DX,result MOV AH,9 INT 21H ;DOS功能調用,輸出字符串 OUTPUT: POP DX MOV AH,2 INT 21H ;DX中數據依次出棧並顯示 DEC BX JNZ OUTPUT ;出棧完成後停止 JMP STATE OOF:LEA DX,over MOV AH,09H INT 21H ;DOS功能調用,溢出顯示 JMP STATE CODE ENDS END STATE

5.4程序運行結果及分析:

乘法和累加計算根據流程圖一步步賦值即可得到,在輸入兩位數和結果轉十進制輸出時遇到了麻煩,通過查找資料不斷嘗試,最終找到了簡單的解決辦法,即輸入兩位時移位累加,輸出除以10存入堆棧並依次輸出顯示。

技術分享圖片

圖5 計算S=1+2×3+3×4+4×5+···+N(N+1)設計結果

6.計算N!

6.1設計要求:

掌握匯編語言實現高級語言中數學函數的方法。設計程序,實現數學公式N!=N(N-1)(N-2)······2*1的算法。數值N由鍵盤輸入,計算結果在顯示終端輸出。設計要求:N的範圍為0-65535,即不超出16位寄存器的存儲容量。

6.2設計思路:

輸入N值,通過循環實現階乘並將計算結果存入AX,然後十六進制轉十進制輸出。

技術分享圖片

6.3程序清單:

DATA SEGMENT 
    pkey   DB  0AH,0DH,"Please Input N(1-8):",$  
    result DB  0AH,0DH,"the results is:",$ 
    over   DB  0AH,0DH,"overflow!",0AH,0DH,$
DATA ENDS           

STACK SEGMENT
    SSTACK DB 100 DUP(0)
STACK ENDS          

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK
    
STATE: 
       MOV AX,DATA
       MOV DS,AX   ;數據段初始化

       LEA DX,pkey
       MOV AH,09H
       INT 21H       ;DOS功能調用,顯示字符串  
       
       MOV AH,1      
       INT 21H       ;DOS功能調用,輸入N 
       SUB AL,30H
       CMP AL,08H
       JA  OOF       ;輸入大於8溢出 
       
       XOR AH,AH   
       MOV BP,AX     ;賦循環計數值N給BP  
       
LP:    MOV BX,BP
       DEC BX
       JZ  LLP       ;階乘次數為BX,BX為0必須馬上跳轉
       MUL BX        ;AX中存放階乘結果(十六進制轉十進制用)
       DEC BP
       JNZ LP 

LLP:   MOV CX,0
       MOV BX,10
       
LLLP:  MOV DX,0     
       DIV BX        ;AX表示的32位數除以10,商放在AX,余數放在DX 
       ADD DX,30H    
       PUSH DX       ;將余數轉換為ASCII碼值並壓入棧
       INC CX
       CMP AX,0      ;商不為0就繼續除10
       JNZ LLLP 

       MOV AH,09H
       LEA DX,result 
       INT 21H       ;DOS功能調用,輸出字符串
       
LOP:   POP DX           
       MOV AH,2                                     
       INT 21H       ;DX各位出棧並顯示
       LOOP LOP     
       JMP STATE   

OOF:   LEA DX,over
       MOV AH,09H
       INT 21H      ;DOS功能調用,溢出顯示
       JMP STATE 
   
CODE ENDS
     END STATE

6.4程序運行結果及分析:

階乘部分是利用MUL指令AX中存放計算結果並實現階乘,除階乘計算部分外,其它部分和第五題類似,同樣結果轉十進制輸出時遇到了麻煩,利用除以10存入堆棧再依次取出並顯示來實現。

技術分享圖片

圖6 計算N!設計結果

匯編語言系列Ⅱ 實現簡單數學運算