汇编包括排序,子程序等

编制一段完整的程序,从键盘上输入一个以‘$’结尾的字符串,然后对其中的数字字符(0~9)和非数字字符个数分别进行统计,并以十进制形式输出显示统计结果。

OUTPUTASTR MACRO STRADDR ;
	PUSH AX
	PUSH DX
	LEA DX, STRADDR
	MOV AH, 9
	INT 21H
	POP DX
	POP AX
	ENDM

INPUTASTR MACRO SADDR
	PUSH DX
	PUSH AX
	LEA DX, SADDR
	MOV AH, 0AH
	INT 21H
	POP AX
	POP DX
	ENDM

DATAS SEGMENT
  	CUE1 db "Please input a string(less than 32 letters): $"
  	buf db 40H dup('$')
  	cue2 db "Your string is too long!Please input again: $"
  	NEWLINE db 13,10,'$'
  	CUE3 DB "The sum of numbers is: $"
  	CUE4 DB "The sum of non-numbers is: $"
  	NUM DB 0, 0
DATAS ENDS

STACKS SEGMENT PARA STACK
    DW 20H DUP(?)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX

AGAIN:   
    OUTPUTASTR CUE1
    INPUTASTR BUF
    
    MOV AL, BUF+1
    CMP AL, 32
    JA ILLEGOL
    
    LEA SI, BUF+2
    XOR CX, CX
    MOV CL, BUF+1
    XOR DX, DX
LOP:
	MOV BL, [SI]
	CMP BL, 30H
	JB ISNOTNUM
	CMP BL, 39H
	JA ISNOTNUM
	INC DL ; NUMBER
CONTINUE:
	INC SI
    LOOP LOP
    
    MOV NUM, DL
    MOV NUM[01H], DH
    
    OUTPUTASTR NEWLINE
    OUTPUTASTR CUE3
    
    XOR AX, AX
    LEA SI, NUM
    MOV AL, [SI]
    CALL B2D 
    
    OUTPUTASTR NEWLINE
    OUTPUTASTR CUE4
    
    XOR AX, AX
    MOV AL, [SI+1]
    CALL B2D 
   
    MOV AH,4CH
    INT 21H
    
ISNOTNUM:
	INC DH ; NOT NUMBER
	JMP CONTINUE
    
    
ILLEGOL:
	OUTPUTASTR NEWLINE
	OUTPUTASTR CUE2
	OUTPUTASTR NEWLINE
	JMP AGAIN 

B2D PROC ;真值转10进制输出
	PUSH BX
	PUSH CX
	PUSH DX
	XOR BX, BX
	MOV BL, 10
	xor CX, CX
LOP1:
	
	DIV BL   ;AX / BL = AL ... AH
	
	PUSH AX
	inc CL
	
	AND AX, 00FFH
	CMP AX, 0
	JNE LOP1

lop2:	
	pop ax
	MOV DL, AH
	ADD DL, 30H
	MOV AH, 2 
	INT 21H
	loop lop2
	
	pop DX
	pop CX
	pop BX
	RET
B2D ENDP

CODES ENDS
    END START

编写一个比赛得分程序。共有7个评委,按百分制打分,计分原则是去掉一个最高分和一个最低分,求平均值。

OUTPUTASTR MACRO STRADDR ;输出一个字符串,STRADDR是字符串的首地址
	PUSH AX
	PUSH DX
	LEA DX, STRADDR
	MOV AH, 9
	INT 21H
	POP DX
	POP AX
	ENDM
DATAS SEGMENT
	cue1 db "Please the $"
	cue2 db " judges grades: $"
	NEWLINE DB 13, 10,  '$'
	INP DB 30H DUP('$')
	NUM DB 10H DUP(0)
	RESULT DW 0
	ILG DB "illegal! Try again!$"
	CUE3 DB "Averange is: $"
DATAS ENDS

STACKS SEGMENT PARA STACK
    DW 30H DUP(?)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    
RESTART:
    xor cx, cx
    mov cl, 30h
    XOR SI, SI
INPUT:    
    mov ah, 9h
    lea dx, cue1
    int 21h
    INC CL
    
    mov ah, 02h
    mov dl, cl
    int 21h
    
    mov ah, 9h
    lea dx, cue2
    int 21h
    
    PUSH CX; CX = 3XH
    SUB CL, 31H
    MOV DI, CX
    
    ADD DI, CX
    ADD DI, CX
    ADD DI, CX
    ADD DI, CX
    
    
    LEA DX, INP[DI]
    MOV AH, 0AH
    INT 21H
    
    MOV CL, INP[DI+1]
	CMP CL, 3
	JA ILLEGAL
    
    ;EXCHANGE TO TRUE VALUE
    XOR AH, AH
    MOV BL, 10
    XOR DL, DL
    INC DI
EXCHANGE:
	PUSH CX; CX <= 3
	INC DI
	MOV AL, INP[DI]
	CMP AL, 30H
	JB ILLEGAL
	CMP AL, 39H
	JA ILLEGAL
	SUB AL, 30H
	
   ADD AL, DL
    CMP CL, 1
    JE MULDONE
    MUL BL
MULDONE:
	MOV DL, AL
	CMP DL, 100
	JA ILLEGAL
    MOV NUM[SI], DL
     
    POP CX
    LOOP EXCHANGE
    
    ; PREPARE FOR NEXT INPUTMENT
    INC SI
   	LEA DX, NEWLINE
   	MOV AH, 09H
   	INT 21H
    POP CX
    CMP CL, 37H
    JNE input
    ;INPUT PART HAS DONE


    ;SORT
    LEA SI, NUM
    CALL SORT
    ;SORT DONE
    
    
 	; SHOW MEMORY 
    ;MOV CL, 7
    ;LEA DI, NUM
;OUTPUT:
    ;OUTPUTASTR NEWLINE
    ;OUTPUTASTR CUE3
    ;XOR AX,AX
    ;MOV AL, [DI]
    ;CALL B2D
    ;INC DI
    ;LOOP OUTPUT
    ;SHOW MEMORY DONE
    
    ;GET sum of the five numbers
    LEA DI, RESULT
    LEA SI, NUM
    CALL SUM
    
    ;SHOW SUM
    ;MOV AX, RESULT
    ;CALL B2D
    
    OUTPUTASTR NEWLINE
    
    ;SHOW AVERANGE
    OUTPUTASTR CUE3
    MOV AX, RESULT
    XOR BX, BX
    MOV BL, 5
    CALL AVERANGE
    
    
EXIT: 
    MOV AH,4CH
    INT 21H

ILLEGAL:
	OUTPUTASTR NEWLINE
	OUTPUTASTR ILG
	OUTPUTASTR NEWLINE
	JMP RESTART   
    
    
AVERANGE PROC;求平均值
	PUSH DX
	PUSH CX
	PUSH BX
	PUSH AX
	
	XOR CX, CX
	MOV CL, 2
	
AVE:
	DIV BL
	PUSH BX
	XOR DX, DX
	MOV DL, AH
	AND AX, 00FFH
	
	CMP CL, 1 
	JE ROUNDING; 四舍五入
	CALL B2D
	CMP CL, 2 
	JE PRINTPOINT
	
CTN:
	MOV AX, DX
	MOV BL, 10
	MUL BL
	POP BX
	LOOP AVE
	
RT:	
	POP AX
	POP BX
	POP CX
	POP DX
	RET
	
ROUNDING: 四舍五入
	PUSH DX
	PUSH AX
	PUSH BX
	
	MOV AX, DX
	MOV BL, 10
	MUL BL
	POP BX
	DIV BL
	
	CMP AH, 4
	JBE B
	POP AX
	ADD AX, 1
	CALL B2D
	JMP A
B:
	POP AX
	CALL B2D
A:
	POP DX
	POP BX
	JMP RT
	
PRINTPOINT:
	PUSH AX
	PUSH DX
	MOV AH, 02H
	MOV DL, '.'
	INT 21H
	POP DX
	POP AX
	JMP CTN
	
AVERANGE ENDP
    
    
    
SUM PROC; get sum 
		; SI SHOULD HAVE BEEN ASSIGNED SCOURSE ADDRESS
		; DI SHOULD HAVE BEEN ASSIGNED TARGET ADDRESS
	PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
	XOR CX, CX
	XOR AX, AX
	XOR DX, DX
	MOV CL, 5; the numbers which are about to sum are 5
	INC SI ;jump to the second number
SUMLOOP:
	MOV DL, [SI]
	INC SI
	ADD AX, DX
	LOOP SUMLOOP
	MOV [DI], AX
	
	
	POP DX
	POP CX
	POP BX
	POP AX
	
	RET
SUM ENDP
    
    
    
B2D PROC ;  true value to decimal and output
	PUSH BX
	PUSH CX
	PUSH DX
	PUSH AX
	
	XOR BX, BX
	MOV BL, 10
	xor CX, CX
LOP1:
	
	DIV BL   ;AX / BL = AL ... AH
	
	PUSH AX
	inc CL
	
	AND AX, 00FFH
	CMP AX, 0
	JNE LOP1

lop2:	
	pop ax
	MOV DL, AH
	ADD DL, 30H
	MOV AH, 2 
	INT 21H
	loop lop2
	
	POP AX
	pop DX
	pop CX
	pop BX
	RET
B2D ENDP
    
    
    ;SORT FUNCTION
SORT PROC; SI SHOULD HAVE BEEN ASSIGNED
	PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
	XOR CX, CX
	MOV CL, 7  ;SET COUNTING ELEMENT NUMBER, CAN BE CHANGED
OUTERLOOP:
	PUSH CX
	SUB CL, 1
	PUSH SI
INTERLOOP:
	MOV AL, [SI]
	MOV BL, [SI+1]
	CMP AL, BL
	JA ALTB 
CONTINUE1:
	INC SI
	CMP CL, 0
	JE CONTINUE2
	DEC CL
	JNE INTERLOOP
CONTINUE2:		
	POP SI
	POP CX
	DEC CX
	CMP CX, 0
	JNE OUTERLOOP

	POP DX
	POP CX
	POP BX
	POP AX
	RET

ALTB:   ; exchange two unsort numbers
	MOV DL, AL
	MOV AL, BL
	MOV BL, DL
	MOV [SI], AL
	MOV [SI+1], BL
	JMP CONTINUE1
	
SORT ENDP
    
CODES ENDS
    END START
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值