汇编练习:求向量和

计算
在这里插入图片描述
其中
在这里插入图片描述

在这里插入图片描述
是两组数据,其中的所有数均为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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章