匯編語言系列之匯編實現(xiàn)簡單數(shù)學運算
軟件:emu8086
語言:匯編語言(Assembly)
注意:本文列出了兩種算術運算的代碼,全部代碼為博主獨自一人編寫,會有瑕疵,謹慎使用。
1.計算S=1+2×3+3×4+4×5+···+N(N+1)
1.1設計要求:
設計程序,實現(xiàn)數(shù)學公式S=1+2×3+3×4+4×5+···+N(N+1)的算法。數(shù)值N由加鍵盤輸入,計算結果在顯示終端輸出。設計要求:計算結果不超過十六位寄存器的存儲能力,如有溢出提示錯誤。
1.2設計思路:
輸入N值然后把N給BH作為循環(huán)次數(shù),通過循環(huán)實現(xiàn)乘和累加計算,結果為十六進制,通過除以10得到十進制,存入堆棧再依次輸出。

1.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 ;開辟緩沖區(qū)
LEA DX,pkey
MOV AH,9
INT 21H ;DOS功能調用,輸出字符串
LLP:MOV AH,1
INT 21H ;DOS功能調用,輸入N值
SUB AL,2FH
INC DX ;DX計數(shù)
MOV [SI],AL ;將輸入的數(shù)據(jù)存在SI緩沖區(qū)
INC SI
CMP AL,0CH ;輸入為封號結束輸入
JNZ LLP
SUB SI,2
CMP DX,02H ;DX不為2表示輸入為兩位數(shù)
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 ;輸入是兩位數(shù)時十位乘10加個位
SUB AH,AH
JMP LLP1
LP: MOV BH,[SI] ;把循環(huán)次數(shù)給BH
MOV AL,BL
INC BL
MUL BL ;BL(加1)和AL(原值)相乘給AX
ADD CX,AX ;AX和CX相加給CX,通過循環(huán)實現(xiàn)累加
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位數(shù)除以10,商放在AX,余數(shù)放在DX
INC BX
ADD DX,30H
PUSH DX ;將余數(shù)依次壓入棧
CMP AX,0
JNZ LOP ;商不為0繼續(xù)除10
LEA DX,result
MOV AH,9
INT 21H ;DOS功能調用,輸出字符串
OUTPUT:
POP DX
MOV AH,2
INT 21H ;DX中數(shù)據(jù)依次出棧并顯示
DEC BX
JNZ OUTPUT ;出棧完成后停止
JMP STATE
OOF:LEA DX,over
MOV AH,09H
INT 21H ;DOS功能調用,溢出顯示
JMP STATE
CODE ENDS
END STATE
1.4程序運行結果及分析:
乘法和累加計算根據(jù)流程圖一步步賦值即可得到,在輸入兩位數(shù)和結果轉十進制輸出時遇到了麻煩,通過查找資料不斷嘗試,最終找到了簡單的解決辦法,即輸入兩位時移位累加,輸出除以10存入堆棧并依次輸出顯示。

圖5 計算S=1+2×3+3×4+4×5+···+N(N+1)設計結果
2.計算N!
2.1設計要求:
掌握匯編語言實現(xiàn)高級語言中數(shù)學函數(shù)的方法。設計程序,實現(xiàn)數(shù)學公式N!=N(N-1)(N-2)······2*1的算法。數(shù)值N由鍵盤輸入,計算結果在顯示終端輸出。設計要求:N的范圍為0-65535,即不超出16位寄存器的存儲容量。
2.2設計思路:
輸入N值,通過循環(huán)實現(xiàn)階乘并將計算結果存入AX,然后十六進制轉十進制輸出。

2.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 ;數(shù)據(jù)段初始化
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 ;賦循環(huán)計數(shù)值N給BP
LP: MOV BX,BP
DEC BX
JZ LLP ;階乘次數(shù)為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位數(shù)除以10,商放在AX,余數(shù)放在DX
ADD DX,30H
PUSH DX ;將余數(shù)轉換為ASCII碼值并壓入棧
INC CX
CMP AX,0 ;商不為0就繼續(xù)除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
2.4程序運行結果及分析:
階乘部分是利用MUL指令AX中存放計算結果并實現(xiàn)階乘,除階乘計算部分外,其它部分和第五題類似,同樣結果轉十進制輸出時遇到了麻煩,利用除以10存入堆棧再依次取出并顯示來實現(xiàn)。

圖6 計算N!設計結果
到此這篇關于匯編語言系列之匯編實現(xiàn)簡單數(shù)學運算的文章就介紹到這了,更多相關匯編語言數(shù)學運算內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
ARM匯編判斷之如何用匯編判斷數(shù)組中正負數(shù)個數(shù)
這篇文章主要介紹了ARM匯編判斷之如何用匯編判斷數(shù)組中正負數(shù)個數(shù),在匯編語言中程序的基本框架是不變的,這里我們可以直接把正向遍歷的程序給貼過來,然后我們思考怎么運用判斷后綴把數(shù)組中正數(shù)和負數(shù)分開,進行判斷個數(shù)和分別求和,需要的朋友可以參考下2022-04-04
Windows10下利用DOSBOX和MASM32搭建匯編語言開發(fā)環(huán)境
這篇文章主要介紹了Windows10下利用DOSBOX和MASM32搭建匯編語言開發(fā)環(huán)境,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01

