用汇编语言写一个输入半径输出圆的周长和面积的程序
扫描二维码
随时随地手机看文章
π,派,3.1415926...,百度空间给显示出来的,怎么好像是个《小门》。
用汇编语言编程的题目,要求输入圆的半径,计算出周长和面积。
求解这个题目,必须要用到圆周率 π 这个参数。
大家都知道,π 是无穷循环小数。编程时,很多人认为,要用到浮点数的运算。
有人为了省事,就直接用 3 来代表 π,呵呵,这个误差,可就有些太大了。
如果采用 π 的近似值来计算,其实,也并不费事。
π 的近似值有两种公式:
约率 = 22/7 = 3.1428571428571428571428571428571
密率 = 355/113 = 3.1415929203539823008849557522124
如果采用密率来计算,由此带来的误差小于 0.0000003。
这个精度,可说是相当的高了,基本上,可以满足任何需求。
乘以 335、除以 113,完全是用整数计算,算法简单,速度极快,占用内存空间也小。
用整数计算完毕后,在显示的时候,则需要显示小数点以及小数。
显示小数,很多人都不会的。
其实,只要编写一个子程序,10 行而已,执行一遍即可显示一位小数。
下面的汇编语言程序,就是做而论道编写的:输入半径r,计算周长,显示四位小数。
;---------------------------
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 ;整数
MOV S2, DX ;余数,即小数
DISP:
LEA DX, M2
MOV AH, 9
INT 21H
MOV AX, S1
CALL OUTPUT
MOV DL, '.' ;输出小数点
MOV AH, 2
INT 21H
CALL OUTPUT_2 ;输出一位小数
CALL OUTPUT_2 ;输出一位小数
CALL OUTPUT_2 ;输出一位小数
CALL OUTPUT_2 ;输出一位小数
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: ;输出整数
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: ;输出一位小数
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
;---------------------------
程序执行后,显示如下:
C:MASM>ww
Please input r : 50
L = 314.1592
C:MASM>
用整数计算,再显示出来小数,这个方法,是不是做而论道的独创呢 ?
呵呵,应该不能这么说。
可是,以前,确实,也没有见谁发表过这种处理方法。