只为记录汇编作业
题目:已知有NUM个数存放在以BUFFER为首地址的字节存储区中,试统计其中负元素的个数,要求放到COUNT单元,编写完整程序。
代码如下:
(负数≤9的情况)
;1.已知有NUM个数存放在以BUFFER为首地址的字节存储区中,试统计其中负元素的个数,要求放到COUNT单元,编写完整程序。
DATA SEGMENT
BUFFER DB 1,2,3,4,-1,0,-2,2,-3,3,-4,-5,'$' ;定义buffer
NUM EQU $-BUFFER ;计算buffer长度
COUNT DB 0 ;用来记录负数个数
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA BX,BUFFER ;使bx指向buffer位置
XOR CX,CX ;cx初始化
MOV CL,NUM ;把buffer长度给cl用来定义循环的次数
CYCLE:
XOR AX,AX ;ax初始化
MOV AL,[BX] ;把bx中的值赋给al
CMP AL,0 ;这里用带符号位的比较运算符,否则出错
JGE NEXT ;如果这个数大于等于0就跳到next函数
INC COUNT
JMP NEXT ;跳转到next函数
NEXT:
INC BX ;让bx指针+1
LOOP CYCLE ;跳到CYCLE函数循环 如果cl=0则跳出循环
ADD COUNT,30H ;让count变成ascll码并且输出
MOV DL,COUNT
MOV AH,02H
INT 21H
MOV AH,4CH ;结束
INT 21H
CODE ENDS
END START
(在上面代码的基础上优化,可输出负数个数≥9)
;1.已知有NUM个数存放在以BUFFER为首地址的字节存储区中,试统计其中负元素的个数,要求放到COUNT单元,编写完整程序。
DATA SEGMENT
BUFFER DB -1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,'$' ;定义buffer
NUM EQU $-BUFFER ;计算buffer长度
COUNT DW 0 ;用来记录负数个数
ANS DB 6 DUP(0) ;定义长度为6的数组,便于16进制转10进制的输出
LEN DB 0 ;用于定义输出数据时的长度
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA BX,BUFFER ;使bx指向buffer位置
XOR CX,CX ;cx初始化
MOV CL,NUM ;把buffer长度给cl用来定义循环的次数
CYCLE:
XOR AX,AX ;ax初始化
MOV AL,[BX] ;把bx中的值赋给al
CMP AL,0 ;这里用带符号位的比较运算符,否则出错
JGE NEXT ;如果这个数大于等于0就跳到next函数
INC COUNT
JMP NEXT ;跳转到next函数
NEXT:
INC BX ;让bx指针+1
LOOP CYCLE ;跳到CYCLE函数循环 如果cl=0则跳出循环
XOR AX,AX ;AX初始化
MOV AX,COUNT ;把count放入ax
XOR BX,BX ;BX初始化
MOV BX,10 ;把10放入bx中
MOV DI,OFFSET ANS ;把di指针指向buffer头地址
F:
XOR DX,DX ;dx初始化
DIV BX ;ax/bx 商放在AX,余数放在DX(因为余数≤9,所以在DL)
ADD DL,30H ;余数+30H,变成0-9的ascll码值方便输出
MOV [DI],DL ;此时的dl值已经是0-9的ascll码,将其放入di中
INC DI ;di指针+1
INC LEN ;len+1
CMP AX,0 ;ax与0作比较
JNE F ;如果ax≠0则继续跳到上面的f
XOR CX,CX ;cx初始化
MOV CL,LEN ;把len的值给cl
DEC DI ;di指针-1
PRINTF:
MOV DL,[DI] ;倒叙输出刚刚存的数据
MOV AH,2 ;输出单个字符
INT 21H
DEC DI ;di自减1
LOOP PRINTF ;如果cl>0则跳到printf函数并且cl-1,否则执行下一条语句
MOV AH,4CH ;结束
INT 21H
CODE ENDS
END START