循环数值累加与显示
一、实验内容及
1.设计一个程序来计算S=1+2·3+3·4+4·5+……+N(N+1),直到N(N+1)超过200为止。程序的结果应在屏幕上显示。
2.清零从内存地址3000H开始的100个字节存储单元。
注意:本实验需要在DEBUG调试环境下完成,包括编写汇编程序、执行程序及结果检验。
二、实验步骤
实验内容一:
1.编写实验程序。
2.输入源代码。
3.对程序进行汇编、链接,执行程序并验证结果。
实验内容二:
1.输入源代码并确保其正确无误。
2.从3000H地址开始,对100个存储单元使用E命令输入任意数值。
3.程序执行可以通过DEBUG的G命令完成,或者使用T命令进行单步跟踪。
4.使用D命令来检验执行结果。
三、实验报告
1. 源程序
程序一
CODE SEGMENT
ASSUME CS:CODE
START:
mov dx,0001h ; 初始化dx为1,用于存储结果累加
mov bl,02h ; 初始化bl为2,作为循环中的乘数
lop2:
xor ax,ax ; 清零ax寄存器
mov al,bl ; 将bl的值移入al
inc bl ; bl自增1
mul bl ; 无符号乘法,结果存储在ax中
add dx,ax ; 将ax中的乘法结果累加到dx中
cmp ax,00C8h ; 将ax与200 (00C8h) 比较
jna lop2 ; 若ax小于等于200,则跳转回lop2继续循环
mov ch,04H ; 初始化ch为4,用于下一个循环
mov cl,04H ; 初始化cl为4,用于旋转指令
lop1:
rol dx,cl ; 将dx向左循环移位cl次
push dx ; 将dx压入栈保存
and dl,0Fh ; 与操作,获取dx的低4位
cmp dl,09h ; 比较dl与9
jbe next ; 如果dl小于等于9,跳转到next
add dl,7 ; 如果dl大于9,将dl增加7
next:
add dl,30h ; 将dl增加30h,准备输出
mov ah,2 ; 设置ah为2,准备调用中断21h进行字符显示
int 21h ; 调用中断21h,输出字符
xor dx,dx ; 清零dx
pop dx ; 从栈中恢复dx的值
dec ch ; ch自减1
jnz lop1 ; 如果ch不为零,则跳转回lop1继续循环
MOV AH,4CH ; 准备退出程序
INT 21H ; 调用中断21h,结束程序
CODE ENDS
END START
程序二
CODE SEGMENT
ASSUME CS:CODE
ORG 3000H ; 设置程序起始地址为3000H
START:
CLD ; 清除方向标志,确保串操作从低地址到高地址
MOV CX,0064H ; 设置计数器为100(0064H)
XOR AX,AX ; 将AX清零
REP STOSW ; 重复存储字符串操作,将AX的值存储到ES:DI指向的内存,并更新DI
HLT ; 暂停执行,等待中断
MOV AX,4C00H ; 准备退出程序
INT 21H ; 调用中断21h,结束程序
CODE ENDS
END START
2. 对程序中用到的寄存器说明其功能。
AX:累加器。所有I/O指令都通过AX与接口传送信息,中间运算结果也多放于AX中;
BX:基址寄存器。在间接寻址中用于存放基地址;
CX:计数寄存器。用于在循环或串操作指令中存放计数值;
DX:数据寄存器。在间接寻址的I/O指令中存放I/O端口地址;在32位乘除法运算时,存放高16位数。
DF:方向标志位。在数据串操作时确定操作的方向。
ZF: 零标志位。当运算结果为零时ZF=1
段寄存器:用于存放相应逻辑段的段基地址,8088有4个16位段寄存器
CS(代码段)指明代码段的起始地址
SS(堆栈段) 指明堆栈段的起始地址
DS(数据段) 指明数据段的起始地址
ES(附加段) 指明附加段的起始地址
3. 总结计数控制循环程序的设计方法。
将循次数放入CX中,CX=0终止。
4. 说明怎样使用DEBUG进行程序调试的。调试过程中所遇到的问题是如何解决的。
程序一
(1)编译
(2)连接
(3)运行
结果
程序二
(1)编译
(2)连接
查看程序执行
查看地址信息