程序分析
分析下列程序,指出运行结果
DATA SEGMENT
SUM DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
XOR AX, AX ;
MOV CX, 10 ;
MOV BX, 2
LOP1: ADD AX, BX ;
INC BX
DEC CX
JNZ LOP1 ;
MOV SUM, Ax
MOV AH, 4CH
INT 21H
CODE ENDS
END START
(1)为加;行指令后加注释,注释不需很繁琐,解释清楚本行操作意图即可。
(2)该程序完成的功能是什么?程序执行后,SUM单元的值是什么?
2 程序设计
编写求6!=6乘以五乘以四乘以三乘以二乘以1的程序,结果存入AL中。
(1)第一步应分析要求,选择合适的结构设计流程图。
例如:本设计采用 结构。(注意选择的结构和下面自己编写的程序对应。)
(2)完成本功能的汇编程序段为:
这段程序是一个计算 2+3+4+...+11 的程序,运行结果为 60。
程序分析:
首先,声明了一个数据段(DATA SEGMENT)和一个代码段(CODE SEGMENT),并将 DS 段寄存器设置为数据段的段地址。
然后,将 AX 寄存器的值清零,并将 CX 寄存器设置为 10,将 BX 寄存器设置为 2。这里的目的是将累加器 AX 的初值设置为 2,并且 BX 的初值为 2,CX 的初值为 10,用于循环计数。
进入循环(LOP1)。
在循环中,将累加器 AX 加上 BX 的值,然后将 BX 的值加 1,将 CX 的值减 1。如果 CX 不为零,则跳转回循环开始处(JNZ LOP1)。
当循环完成后,将累加器 AX 中的值存储到变量 SUM 中,然后调用 INT 21H 中断结束程序的执行。
因此,程序的运行结果为 60。
问题1解答: 这段程序的功能是计算1到10的数字的2倍之和,在程序执行时,使用了AX,BX,CX,SUM和AH等寄存器。程序开始时,程序将数据信息存储在data段中,然后通过assume语句定义segment的地址。程序执行以"start"标记开始,首先MOV AX,DATA指令将data段地址存储在AX中,并将DS寄存器值设置为AX。接下来,这个程序使用XOR AX,AX指令将AX寄存器值设置为0,MOV CX,10 把10存储在CX中,MOV BX,2 把2存储在BX中。
然后,LOP1循环开始执行,程序加上BX并将其添加到AX中,此后降低CX的值并将其值与0比较,直到CX的值为0,跳出循环,SUM单元将被设置为AX的值,此后,INT 21H调用将程序终止。因此,最后SUM单元中将包含55 (12+22+32+....+102)。
问题2解答: 该问题中,需要计算6的阶乘,我们可以使用乘法循环,即从n开始(n=6),重复乘以n-1的值,直到乘以1。因此,我们需要执行65432*1=720的乘法操作来计算阶乘。 以下是汇编语言的段落:
DATA SEGMENT
FACTORIAL DW 1
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV CX, 6 ; 循环计数器
MOV BX, 6 ; n的初始值
LOP:
MUL BX ; AX = AX * BX
DEC BX ; BX = BX - 1
LOOP LOP ; LOOP指令将CX-1并跳转到Lop指令
MOV FACTORIAL, AX ; 结果存入FACTORIAL中
MOV AH, 4CH
INT 21H
CODE ENDS
END START
在该程序中,首先将1存储到FACTORIAL单元中,使用MOV AX, DATA和MOV DS, AX指令配置程序,然后将6存储到CX和BX中。LOP标记开始重复执行直到CX大于0,执行过程中,每一次,BX的值被减去一个1,同时执行MUL BX将AX的值与BX相乘,结果存储在AX中。通过LOOP LOP指令,就可以对CX进行减1,直到其值为0。之后,结果存入FACTORIAL单元,最后程序结束。