实验相关文件

exp3.zip

数组求和

目标

计算出数组元素的和,并存入sum变量中。

思路

首先在数据段定义数组内容x、数组长度len、求和结果sum,均使用16位双字节dw类型。

x dw 10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h
len dw 08h
sum dw 00h

我们将使用循环进行累加求和,其中cx保存循环计次,si指向当前数组元素、ax作为临时累加和。

初始化它们,将x数组起始地址移入si,再使用xor位异或指令清零寄存器。

lea si, x ; 数组元素指针
xor cx, cx ; 清零计数
xor ax, ax ; 清零和

随后进入循环体,使用add累加当前元素[si]ax

si指针向后移动2个字节,因为x内的元素是双字节dw类型。

自增循环计数器cx

使用cmp进行比较,如果当前循环次数cx不等于数组长度len,则继续循环。

_loop:
	add ax, [si]
	add si, 2
	inc cx
	cmp cx, len ; 循环判断
	jnz _loop

完整代码

data segment
	x dw 10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h
	len dw 08h ; 数组长度

	sum dw 00h
data ends

stack segment stack
	dw 512 dup(?)
stack ends

code segment
	assume cs:code, ds:data, ss:stack
start:
	mov ax, data
	mov ds, ax

	lea si, x ; 数组元素指针
	xor cx, cx ; 清零计数
	xor ax, ax ; 清零和
	_loop:
		add ax, [si] ; 求和
		add si, 2 ; 向后移动两个字节,因为数据段的 x 是双字节 dw 类型
		inc cx ; 循环计数
		cmp cx, len ; 循环判断
		jnz _loop

	mov sum, ax ; 计算结果存入 sum 中

	mov ax, 4c00h ; 退出
	int 21h
code ends
end start

调试观察