NJUPT南邮 | 汇编_实验一

汇编语言语法练习及代码转换
实验要求:编写一个程序,统计负数的个数,并求最大数和最小数。
设数据段有8个数:
NUM DB -19,+28,37,-46,+55,61,-74,+255
设计一个程序完成:
(1)(必做)统计并显示负数的个数。
(2)(选做)找出真值最大和最小的数,并以二进制的形式显示在屏幕上。显示格式为:
MAX=XXXXXXXXB; MIN=XXXXXXXXB.

DATAS SEGMENT
NUM DW -19,+28,37,-46,+55,61,-74,+255
MAX DW 0  ;存放最大值
MIN DW 0  ;存放最小值
STR1 DB 'MAX=$'
STR2 DB 'B;MIN=$'
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV BX,OFFSET NUM
    MOV CX,8
    MOV DL,0	;DL存放统计人数
LAST:
	CMP WORD PTR [BX],0
	JGE NEXT	;大于等于 0 转到NEXT指令
	INC DL		;DL+1->DL
NEXT:
	INC BX		;NUM is WORD
	INC BX
	LOOP LAST
	ADD DL,30H	;DL=0-9ASCII码
	MOV AH,2
	INT 21H
	
	MOV DL,0DH
    MOV AH,2
	INT 21H
	MOV DL,0AH
    MOV AH,2
	INT 21H		;换行
	
	MOV DI,OFFSET NUM
    MOV AX,[DI]
    MOV MIN,AX
    MOV MAX,AX
    MOV CX,7			  ;设定循环次数
AGAIN:
	INC DI  
	INC DI                ;字型数据指针需要移动两个单位
	MOV AX,[DI]
	CMP AX,MAX
	JG BRANCH1           ;如果AX>MAX,则跳转标号名称为BRANCH1执行
	JMP BRANCH2			 ;否则,跳转BRANCHE2,不执行BRANCHE1
BRANCH1:
	MOV MAX,AX	         ;把当前最大值存入MAX
BRANCH2:
	CMP AX,MIN
	JLE BRANCH3          
	JMP LOOP1	
BRANCH3:
	MOV MIN,AX	       ;把当前最小值存入MIN,原理与MAX同
LOOP1:	
	LOOP AGAIN	        ;CX大于0就继续循环
	
	MOV AH,9H
	LEA DX,STR1
	INT 21H
    
    MOV AX,MAX
    CALL PRINT          ;调用子程序
    
	MOV AH,9H
	LEA DX,STR2
	INT 21H
	
    MOV AX,MIN
    CALL PRINT
    
    MOV AH,2H
	MOV DL,'B'
	INT 21H
    
    MOV AH,4CH
    INT 21H 
;-------------------------------------------------

PRINT PROC
	PUSH BX;数据入栈,保留数值
	PUSH DX	
	MOV DH,0;用于计数,总共16次
	
BINARYAGAIN:	
	CMP DH,16
	JE BINARYOVER;输出结束,到达函数末端
	ROL AX,1;移动一位
	MOV BX,AX
	AND AX,0001H
	MOV DL,AL
	ADD DL,48
	MOV AH,2
	INT 21H
	INC DH
	MOV AX,BX
	JMP BINARYAGAIN		
	
BINARYOVER:
	POP DX
	POP BX
	RET
PRINT ENDP

CODES ENDS
    END START


你可能感兴趣的:(南邮实验,masm)