汇编语言 编写一个求最大值、最小值、总和的程序

汇编语言 编写一个求最大值、最小值、总和的程序,第1张

-------------------------------------------------------------

编写一个求最大值、最小值、总和的程序

数据在数据段内直接初始化

数据范围在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  SEGMENT

              ASSUME    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

如有不正确处,望批评指正!!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/12319547.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存