汇编语言语法练习及代码转换
实验要求:编写一个程序,统计负数的个数,并求最大数和最小数。
设数据段有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