汇编程序:转圈求和

转圈求和

(1)写程序,对给出的8个数,将相邻的数求和(最后写第一个数与最后一个数的和),并把结果写在其后。在下面的示例中,求和的结果为3 5 7 9 11 13 15 9。

datasg segment
dw 1, 2, 3, 4, 5, 6, 7, 8
dw 0,0,0,0,0,0,0,0
datasg ends

提示1:相邻的两数,若前一数用[si]指示,相邻的后面一数则为[si+2]
提示2:前7个和数可以用统一的规则做出,最后一个和数,呃,转圈回去了,不妨特殊处理。
[参考解答]

assume cs:codesg,ds:datasg
datasg segment
dw 1, 2, 3, 4, 5, 6, 7, 8
dw 0,0,0,0,0,0,0,0
datasg ends
codesg segment
start: mov ax, datasg
mov ds, ax
mov si, 0 ;源数据地址
mov di, 16 ;结果写入地址
mov cx, 7 ;先处理前7轮
s: mov ax, [si] ;相邻数中第1个
add ax, [si+2] ;加上相邻的后一个数
mov [di], ax ;写入结果
add si, 2
add di, 2
loop s

mov ax, [si] ;最后一个数
add ax, ds:[0] ;加上第一个数,这儿的ds:不可省去,原因找课程前面讲过的内容
mov [di], ax ;作为最后一个和

mov ax,4c00h
int 21h
codesg ends
end start

(2)若要求将结果写在提供源数据的位置上,而不是在随后的空间中呢?
[参考解答]

assume cs:codesg,ds:datasg
datasg segment
dw 1, 2, 3, 4, 5, 6, 7, 8
datasg ends
codesg segment
start: mov ax, datasg
mov ds, ax
mov si, 0 ;源数据地址
mov cx, 7 ;先处理前7轮
mov dx, [si] ;关键:把第一个数暂存起来,因为这个位置上,很快要被写入求和结果了
s: mov ax, [si] ;相邻数中第1个
add ax, [si+2] ;加上相邻的后一个数
mov [si], ax ;写入结果
add si, 2
loop s

mov ax, [si] ;最后一个数
add ax, dx ;加上提前暂存的第一个数
mov [si], ax ;存入最后一个和

mov ax,4c00h
int 21h
codesg ends
end start

讨论:第一个数据需要被暂存下来,本程序中用了寄存器dx,还可用其他哪些方案?试着实现一下,很好玩嘞!

永不止步步 发表于04-20 10:03 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:363741个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号