- 编写计算1+2+3+…+99+100的程序,要求把结果存放于WORD类型变量X中 。
- 从STR1为起始地址的30个字符,依次传送到以STR2为起始地址的连续字节存储单元中。
- 在BLOCK单元开始的存储区中,连续存放着30个学生的课程成绩,统计其中各个分数段的学生人数:90~100 80~89 70~79 60~69 60分以下的学生数分别存放到S9 S8 S7 S6 S5中。
代码一
DATAS SEGMENT
;此处输入数据段代码
SUM DW ?
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
XOR AX,AX ;AX清0
MOV CX,100
again:
ADD AX,CX ;从100倒序累加到AX
LOOP again
MOV SUM,AX
MOV AH,4CH
INT 21H
CODES ENDS
END START
代码二
DATAS SEGMENT
;此处输入数据段代码
STR1 DB 'ABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789'
STR2 DB 30 DUP(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV SI,OFFSET STR1 ;源地址指针
MOV DI,OFFSET STR2 ;目的地址指针
MOV CX,30 ;设置循环次数
again:
MOV AL,[SI]
MOV [DI],AL
INC SI ;指针+1
INC DI ;指针+1
LOOP again
MOV AH,4CH
INT 21H
CODES ENDS
END START
代码三
DATAS SEGMENT
;此处输入数据段代码
BLOCK DB 20,30,100,50,65,49,25,22,39,98,56,77,63,30,66,75,41,88,12,77,78,69,55,66,68,88,6,82,92,63,76
COUNT EQU 30
S9 DB 0
S8 DB 0
S7 DB 0
S6 DB 0
S5 DB 0
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV BX,OFFSET BLOCK ;源地址指针
MOV CX,COUNT ;循环次数30
again:
MOV AL,[BX] ;取出数据送至AL
CMP AL,100 ;与100比较
JA exit ;大于100 直接结束
CMP AL,90 ;与90比较
JAE L9 ;大于等于90 到L9
CMP AL,80 ;与80比较
JAE L8 ;大于等于80 到L8
CMP AL,70 ;与70比较
JAE L7 ;大于等于70 到L7
CMP AL,60 ;与60比较
JAE L6 ;大于等于60 到L6
L5:
INC S5 ;S5+1
JMP L10 ;转L10循环
L6:
INC S6 ;S6+1
JMP L10 ;转L10循环
L7:
INC S7 ;S7+1
JMP L10 ;转L10循环
L8:
INC S8 ;S8+1
JMP L10 ;转L10循环
L9:
INC S9 ;S9+1
L10:
INC BX ;BX+1到下一数据
LOOP again ;执行循环
exit:
MOV AH,4CH
INT 21H
CODES ENDS
END START
代码一
利用循环实现从1到100相加,首先将AX寄存器清零,设置CX值为100,循环again,将CX值加到AX上,每次CX-1,最后将AX值赋值到SUM内存单元中存储结果。
代码二
首先将源地址存放到SI,将目的地址存放到DI,设置CX值即循环次数为字符串长度,然后将[SI]即源地址指针指向的内容通过AL转存到[DI]指针的地址处。
代码三
Block源地址指针存放到BX寄存器中,设置CX寄存器值为COUNT,即数据的个数,通过循环again,依次确定每个数据的范围,将对应存储地址单元的内容加1,最终得到执行结果。
图表 1 代码一测试
图表 2 代码二测试
图表 3 代码三测试