計算
其中
和
是兩組數據,其中的所有數均爲80以內的正數。
要求在程序中必要處要寫上註釋。寫程序前,可以畫規範的流程圖以整理思路。
提示:
編程解決問題是一項有創造性的工作,學編程就是塑造創造力的過程。本題目可以設置不同的數據存儲方案,決定了不同的編程方案。
下面羅列幾種,供同學們選用:
(1)將、兩組數據存放在固定的內存位置,如2000H:0H處——謹慎使用這種方案,除非特殊情況(在需要使用這種方案的場合,這種方法往往也是最精妙的)。
(2)在程序中指定兩個段存放X和Y,如爲data1段中存放X向量的8個數據,data2段中存放Y向量的8個數據。計算結果可以存儲在代碼段的起始字單元中,也可以設計方案存放於另外定義的專門段中,或者前面定義的任一段中。在程序中,data1當數據段,data2當附加段即可。
下面的代碼可以作爲參考(當然可以改動)。
assume cs:code,ds:data1
data1 segment ;此段存放X
db 12,16,18,12,4,7,8,16
data1 ends
data2 segment ;此段存放Y
db 3,11,7,9,15,17,7,1
data2 ends
code segment
dw 0 ;此處存放求和結果,這是可能方案中的一種
start:
//代碼開始
mov ax,4c00h
int 21h
code ends
end start
(3)在一個數據段中存入所有的數據。在訪問時,其段地址均在DS中,用兩個寄存器分別指標xi和yi的偏移地址(BX常用於表示偏移地址,還可以用BP、SI、DI寄存器)。計算結果也可以存儲在X和Y之後。
下面的代碼可以作爲參考(當然可以改動)。
assume cs:code,ds:data
data segment
db 12,16,18,12,4,7,8,16 ;X
db 3,11,7,9,15,17,7,1 ;Y
dw 0 ;此處存放求和結果
data ends
code segment
start:
mov ax,4c00h
int 21h
code ends
end start
【參考解答】提供(2)、(3)兩種方案的代碼
(2)
assume cs:code,ds:data1
data1 segment
db 12,16,18,12,4,7,8,16 ;X
data1 ends
data2 segment
db 3,11,7,9,15,17,7,1 ;Y
data2 ends
code segment
dw 0 ;此處存放求和結果
start:
mov ax, data1
mov ds, ax ;數據段寄存器保存x的起始地址
mov ax, data2
mov es, ax ;附加段寄存器保存y的起始地址
mov dx,0 ;dx中放累加和
mov cx,8
s:mov al, [bx]
add al, al ;求出2x
mov ah, es:[bx] ;取出y
add al, ah ;al中存入2x+y
mov ah, 0
add dx, ax ;將本次求和結果加入dx
add bx,1
loop s
mov cs:[0], dx ;保存結果
mov ax,4c00h
int 21h
code ends
end start
(3)
assume cs:code,ds:data
data segment
db 12,16,18,12,4,7,8,16 ;X
db 3,11,7,9,15,17,7,1 ;Y
dw 0 ;此處存放求和結果
data ends
code segment
start:
mov ax, data
mov ds, ax ;數據段寄存器保存x的起始地址
mov dx,0 ;dx中放累加和
mov bx, 0 ;X的偏移地址
mov si, 8 ;Y的偏移地址
mov cx,8 ;循環次數
s:mov al, [bx] ;取出x
add al, al ;求出2x
mov ah, [si] ;取出y
add al, ah ;在al中存入2x+y
mov ah, 0
add dx, ax ;將本次求和結果加入dx
inc bx ;偏移地址加1
inc si
loop s
mov bx, 16
mov [bx], dx ;保存結果
mov ax,4c00h
int 21h
code ends
end start