
编写一个求最大值、最小值、总和的程序
数据在数据段内直接初始化
数据范围在0-100之间,可以用字节变量,由于数据的个数不多,因此总和可以用字变量
将计算的结果在屏幕上显示出来
.MODEL SMALL
-------------------------------------------------------------
数据段的定义
-------------------------------------------------------------
.DATA
数组直接在数据段内初数州始化
ARRY DB5, 6, 7, 8, 16, 4, 7 总和不能超出255
ARRY_LEN EQU $ - ARRY 避免拆毕脊了计算数据个数的麻烦
定义显示数据
D_MAX DB 13, 10, 'MAX = $'
D_MIN DB 13, 10, 'MIN = $'
D_SUM DB 13, 10, 'SUM = $'
定义变量
MAXDB 0 最大值
MINDB 255 最小值
SUMDB 0 总和
.CODE
NUM_STR PROC
MOV AH, 0
MOV BL, 100
DIV BL
MOV DX, AX
MOV AH, 2
ADD DL, 30H
INT 21H
MOV AL, DH
MOV AH, 0
MOV BL, 10
DIV BL
MOV DX, AX
MOV AH, 2
ADD DL, 30H
INT 21H
MOV DL, DH
ADD DL, 30H
INT 21H
RET
NUM_STR ENDP
启动函数旅渗
START PROC
MOV AX, @DATA
MOV DS, AX
以下循环程序 求MAX、MIN、SUM
MOV BX, OFFSET ARRY
MOV CX, ARRY_LEN
LOP:
MOV AL, [BX]
CMP AL, MAX
JCNEXT1
MOV MAX, AL
NEXT1:
CMP AL, MIN
JNC NEXT2
MOV MIN, AL
NEXT2:
ADD SUM, AL
INC BX
LOOP LOP
以下程序处理MAX的显示
LEA DX, D_MAX
MOV AH, 9
INT 21H
MOV AL, MAX
CALL NUM_STR
以下程序处理MIN的显示
LEA DX, D_MIN
MOV AH, 9
INT 21H
MOV AL, MIN
CALL NUM_STR
以下程序处理SUM的显示
LEA DX, D_SUM
MOV AH, 9
INT 21H
MOV AL, SUM
CALL NUM_STR
程序结束
MOV AX, 4C00H
INT 21H
STARTENDP
END START
CODE SEGMENTASSUME CS:CODE
ORG 100H
START:
PUSH CS
POP DS
PUSH CS
POP ES
CALL INPUTNUM
LEA SI,ARRAY
MOV CX,[NUM]
MOV AX,0
MOV [NUM_MAX],AX
@MAIN0: MOV AX,WORD PTR [SI]
CMP [NUM_MAX],AX
JNC @MAIN1 无符号数用 jnc,有符号数用 jl
MOV [NUM_MAX],AX
@MAIN1: INC SI
INC SI
LOOP @MAIN0
LEA DX,LFCR
MOV AH,9
INT 21H
MOV AX,[NUM_MAX]
CALL DISPAX
MOV AH,4CH
INT 21H
NUM_MAX DW ?
LFCR DB 10,13,'$'
==============================================================
键盘输入数值数组子程序(数组名为array,元素个数存放在num中)
INPUTNUM PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
PUSHF
输入的字数据以一个空格分隔,以回车符结束输入
LEA DI,ARRAY 将数组第一个元素的有效地址置入DI
MOV WORD PTR[NUM],0
STIN:
MOV AX,0
PUSH AX
AGAIN1:
MOV AH,1
INT 21H
MOV BYTE PTR[CHAR],AL
CMP AL,13
JE LINE0
CMP AL,' '
JE LINE0
SUB AL,30H
MOV AH,0
MOV SI,AX
POP AX
MOV CL,10
MOV CH,0
MUL CX
ADD AX,SI
PUSH AX
JMP AGAIN1
LINE0:
POP AX
MOV WORD PTR[DI],AX
INC WORD PTR[NUM]
CMP BYTE PTR[CHAR],13
JE STINEND
INC DI
INC DI
JMP STIN
STINEND:
POPF
POP BP
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
ARRAY DW 500 DUP(0)
NUM DW 0
CHAR DB ?
INPUTNUM ENDP
将要显示的无符号数置于 ax 中
DISPAX PROC NEAR
PUSH AX
PUSH BX
瞎锋盯PUSH CX
基芦 PUSH DX
PUSH SI
PUSH DI
PUSH BP
PUSHF
================
PUSH CS
POP DS
MOV BYTE PTR NZ,0
PUSH AX
LEA SI,DIVARR
MOV CX,5
@1:
POP AX
MOV DX,0
MOV BX,[SI]
DIV BX
PUSH DX
CMP AL,0
JNE @2
磨和 CMP BYTE PTR NZ,1
JE @2
CMP CX,1
JE @2
MOV DL,20H
JMP @3
@2:
ADD AL,30H
MOV DL,AL
MOV BYTE PTR NZ,1
@3:
MOV AH,2
INT 21H
INC SI
INC SI
LOOP @1
POP DX
=============
MOV DL,32
MOV AH,2
INT 21H
POPF
POP BP
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
DIVARR DW 10000,1000,100,10,1
NZ DB 0
DISPAX ENDP
CODE ENDS
END START
这道题的关键是如何判断奇数和偶数。在二进制书中,奇数的最低位为1,而偶数的最低位为0.我们可以用测验码0001H来测试。主程序是:
xor ax ;奇数计数器ax清零
xor bx 检查num1是否为奇数,奇数标志位
test num1,0001H
jz OS1 偶数,跳转奇数,继续执行
inc ax 出现一个奇数
inc bx num1为奇数,bx被置1
OS1 test num2,0001H
jzOS2 ;mum2为偶数,桐晌旁跳转
inc ax ;mum2为奇数
jump LOOP1
OS2 cmp ax,00H是否为两个偶数,零个奇数即为两个偶数。
jne LOOP1 否,跳转
inc num1;是,将两个数据分别加一
inc num2
jump LOOP2
LOOP1 cmp ax,0010H检查奇数谨陆个数(0010H=2)
jeLOOP2 ;两个奇数,跳转
cmp bx,1 ;此时只有一个奇数,再判断mum1是否为奇数跳转
jeLOOP2 num1是奇数,跳转
xchg num1,num2 否局橡,交换
LOOP2 mov num1,da1;赋值
mov num2,da2
end
如有不正确处,望批评指正!!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)