用匯編語(yǔ)言寫(xiě)一個(gè)輸入半徑輸出圓的周長(zhǎng)和面積的程序
?π,派,3.1415926...,百度空間給顯示出來(lái)的,怎么好像是個(gè)《小門(mén)》。
用匯編語(yǔ)言編程的題目,要求輸入圓的半徑,計(jì)算出周長(zhǎng)和面積。
求解這個(gè)題目,必須要用到圓周率 π 這個(gè)參數(shù)。
大家都知道,π 是無(wú)窮循環(huán)小數(shù)。編程時(shí),很多人認(rèn)為,要用到浮點(diǎn)數(shù)的運(yùn)算。
有人為了省事,就直接用 3 來(lái)代表 π,呵呵,這個(gè)誤差,可就有些太大了。
如果采用 π 的近似值來(lái)計(jì)算,其實(shí),也并不費(fèi)事。
π 的近似值有兩種公式:
約率 = 22/7 ? ?= 3.1428571428571428571428571428571
密率 = 355/113 = 3.1415929203539823008849557522124
如果采用密率來(lái)計(jì)算,由此帶來(lái)的誤差小于 0.0000003。
這個(gè)精度,可說(shuō)是相當(dāng)?shù)母吡耍旧?,可以滿足任何需求。
乘以 335、除以 113,完全是用整數(shù)計(jì)算,算法簡(jiǎn)單,速度極快,占用內(nèi)存空間也小。
用整數(shù)計(jì)算完畢后,在顯示的時(shí)候,則需要顯示小數(shù)點(diǎn)以及小數(shù)。
顯示小數(shù),很多人都不會(huì)的。
其實(shí),只要編寫(xiě)一個(gè)子程序,10 行而已,執(zhí)行一遍即可顯示一位小數(shù)。
下面的匯編語(yǔ)言程序,就是做而論道編寫(xiě)的:輸入半徑r,計(jì)算周長(zhǎng),顯示四位小數(shù)。
;---------------------------
ASSUME ?CS:CC, DS:QW
;---------------------------
QW ?SEGMENT
? ? M1 ?DB ?13, 10, 'Please ?input ?r : $'
? ? M2 ?DB ?13, 10, 'L = $'
? ? M3 ?DB ?13, 10, 'OVER ! $'
? ? R1 ?DW ??
? ? S1 ?DW ??
? ? S2 ?DW ??
QW ?ENDS
;---------------------------
CC ?SEGMENT
START:
? ? MOV ? AX, QW
? ? MOV ? DS, AX
;
? ? LEA ? DX, M1
? ? MOV ? AH, 9
? ? INT ? 21H
? ? CALL ?INPUT
? ? MOV ? R1, CX
? ? ADD ? CX, CX
? ? MOV ? AX, 355
? ? MUL ? CX
? ? MOV ? CX, 113
? ? DIV ? CX
? ? MOV ? S1, AX ? ?;整數(shù)
? ? MOV ? S2, DX ? ?;余數(shù),即小數(shù)
DISP:
? ? LEA ? DX, M2
? ? MOV ? AH, 9
? ? INT ? 21H
? ? MOV ? AX, S1
? ? CALL ?OUTPUT
? ? MOV ? DL, '.' ? ;輸出小數(shù)點(diǎn)
? ? MOV ? AH, 2
? ? INT ? 21H
? ? CALL ?OUTPUT_2 ?;輸出一位小數(shù)
? ? CALL ?OUTPUT_2 ?;輸出一位小數(shù)
? ? CALL ?OUTPUT_2 ?;輸出一位小數(shù)
? ? CALL ?OUTPUT_2 ?;輸出一位小數(shù)
? ? JMP ? EXIT
YICHU:
? ? LEA ? DX, M3
? ? MOV ? AH, 9
? ? INT ? 21H
EXIT:
? ? MOV ? AH, 4CH
? ? INT ? 21H ? ? ? ;返回DOS
;---------------------------
INPUT:
? ? MOV ? BL, 10
? ? MOV ? CX, 0
IN_X:
? ? MOV ? AH, 7
? ? INT ? 21H
? ? CMP ? AL, 13
? ? JE ? ?IN_END
? ? CMP ? AL, '0'
? ? JB ? ?IN_X
? ? CMP ? AL, '9'
? ? JA ? ?IN_X
? ? MOV ? DL, AL
? ? MOV ? AH, 2
? ? INT ? 21H
? ? MOV ? AL, DL
? ? SUB ? AL, 30H
? ? MOV ? AH, 0
? ? XCHG ?AX, CX
? ? MUL ? BL
? ? ADD ? CX, AX
? ? CMP ? CH, 0
? ? JNZ ? IN_END
? ? JMP ? IN_X
IN_END:
? ? RET
;---------------------------
OUTPUT: ? ? ? ?;輸出整數(shù)
? ? MOV ? BX, 10
? ? MOV ? CX, 0
OL1:MOV ? DX, 0
? ? DIV ? BX
? ? ADD ? DL, '0'
? ? PUSH ?DX
? ? INC ? CX
? ? CMP ? AX, 0
? ? JNZ ? OL1
? ? MOV ? AH, 2
OL2:POP ? DX
? ? INT ? 21H
? ? LOOP ?OL2
? ? RET
;---------------------------
OUTPUT_2: ? ? ?;輸出一位小數(shù)
? ? MOV ? AX, S2
? ? MOV ? CX, 10
? ? MUL ? CX
? ? MOV ? CX, 113
? ? DIV ? CX
? ? MOV ? S2, DX
? ? MOV ? DL, AL
? ? ADD ? DL, '0'
? ? MOV ? AH, 2
? ? INT ? 21H
? ? RET
;---------------------------
CC ?ENDS
? ? END ?START
;---------------------------
程序執(zhí)行后,顯示如下:
C:MASM>ww
Please ?input ?r : 50
L = 314.1592
C:MASM>
用整數(shù)計(jì)算,再顯示出來(lái)小數(shù),這個(gè)方法,是不是做而論道的獨(dú)創(chuàng)呢 ?
呵呵,應(yīng)該不能這么說(shuō)。
可是,以前,確實(shí),也沒(méi)有見(jiàn)誰(shuí)發(fā)表過(guò)這種處理方法。