微机实验-1

题目大概是:用分支结构实现以下功能

  1. 打印学号姓名
  2. 生成20个数并打印
  3. 统计这些数的正数,0,负数个数,并打印统计结果

STACK SEGMENT STACK 'STACK'
        DW 100H DUP(?)
TOP LABEL WORD
STACK ENDS
DATAS SEGMENT
  STRING1 DB 'No.17041831',0DH,0AH,'$'
  STRING2 DB 'Name.srh',0DH,0AH,'$'
        STRING3 DB 0DH,0AH,'$'          ;回车+换行
        STRING4 DB ', ','$'             ;逗号
        STRING5 DB '-','$'              ;负号
        STRING6 DB 'GREATZ:','$'
        STRING7 DB 'ZERO:','$'
        STRING8 DB 'LITTLEZ:','$'
  BUFFER DW 20
                X = 10
                REPT 20
                X = (X+65533) mod 65535
                DW X
                ENDM
        GREATZ DW ?
        ZERO DW ?
        LITTLEZ DW ?
DATAS  ENDS
 
CODES  SEGMENT
  ASSUME   CS:CODES,DS:DATAS,ES:DATAS,SS:STACK
START:
  MOV AX,DATAS	   ;装载DATAS数据段到DS寄存器
  MOV DS,AX
        MOV ES,AX
        MOV AX,STACK
        MOV SS,AX
        LEA SP,TOP

  ;显示前两行信息
  LEA DX,STRING1	  ;LEA指令载入STRING1 的地址
        MOV AH,9	;屏幕显示指令
        INT 21H
  LEA DX,STRING2
        INT 21H
  
  ; 统计
        XOR AX,AX
        MOV GREATZ,AX
        MOV ZERO,AX
        MOV LITTLEZ,AX
        MOV CX,BUFFER
        LEA SI,BUFFER+2

ST_COUNT:
        MOV AX,[SI]
        MOV DX,AX
        PUSH AX         ;保护现场
        PUSH CX
        CALL dispdec
        POP CX
        POP AX
        CMP CX,1
        JNZ COUNT4
        JMP COUNT0

COUNT0:
        MOV AX,[SI]     ;在COUNT4中,AX被破坏
        ADD SI,2

        AND AX,AX       ;设置sf位,判断是否为正
        JLE COUNT1      ;ZF=1 or SF!=OF跳转
        INC GREATZ      ;没跳转就是正数
        JMP COUNT3

COUNT1:         ;判断是否为0
        JL COUNT2       ;ZF=0 AND SF⊕OF=1
        INC ZERO
        JMP COUNT3

COUNT2:         ;负数处理
        INC LITTLEZ

COUNT3:         ;判断是否继续
        DEC CX          ;减少次数
        JNZ ST_COUNT    ;CX不为0就继续
        JMP COUNT5

COUNT4:
        LEA DX,STRING4
        MOV AH,9	;屏幕显示指令
        INT 21H
        JMP COUNT0

COUNT5:
        LEA DX,STRING3          ;换行
        MOV AH,9
        INT 21H

        LEA DX,STRING6
        MOV AH,9
        INT 21H
        MOV DX,GREATZ
        CALL dispdec
        LEA DX,STRING4
        MOV AH,9
        INT 21H
        
        LEA DX,STRING7
        MOV AH,9
        INT 21H
        MOV DX,ZERO
        CALL dispdec
        LEA DX,STRING4
        MOV AH,9
        INT 21H

        LEA DX,STRING8
        MOV AH,9
        INT 21H
        MOV DX,LITTLEZ
        CALL dispdec

  MOV AH,4CH	;返回操作系统
  INT 21H

dispdec proc uses AX BX CX DX   ;显示十进制数
        MOV AX,DX
        XOR DX,DX
        MOV BX,10
        MOV CX,0
        AND AX,AX
        JL fushu
        JMP a
fushu:
        XOR AX,0ffffh           ;65536-AX
        PUSH AX
        PUSH DX
        LEA DX,STRING5
        MOV AH,9
        INT 21H
        POP DX
        POP AX
        JMP a
a:
        CMP AX,10
        JB ok
        DIV BX
        ADD DL,30h
        PUSH DX
        XOR DX,DX
        INC CX
        JMP a
ok:
        ADD AL,30h
        PUSH AX
        INC CX
b:
        POP DX
        MOV ah,2
        INT 21h
        LOOP b
        RET
dispdec endp

CODES  ENDS
        END   START

 

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注