汇编语言程序设计——循环结构例8

汇编语言程序设计——循环结构例8

设计目标

将 Y 字节数组分类为正数(Z1)和负数(Z2)两个数组.

设计思路

(1) 由于数组定义为字节单元,因此数组元素个数 N 可用当前单元地址 $ 和 Y 数组的首地址相减得到;

(2) 在循环中用分支指令判断正数和负数,正数、负数的个数分别用 SI 和 DI 表示。

; 6-9.asm 将字节数组Y分为正数和负数两个数组。
data segment
  y db 2,-4,-5,3,6,6,-8
  n equ $-y           ;数组长度
  z1 db n dup(?)
  z2 db n dup(?)
data ends
code segment
assume cs:code,ds:data
start:  mov ax,data
        mov ds,ax
        mov cx,n
        mov bx,0
        mov si,0
        mov di,0
rept1:  mov al,y[bx]         ;取出数组元素
        cmp al,0             ;判断正负数
        jle let1
        mov z1[si],al         ;正数数组
        inc si
        jmp let2
let1:   mov z2[di],al       ;负数数组
       inc di
let2:  inc bx             ;下一个元素
       loop rept1
      mov ah,4ch
      int 21h
code ends
 end start

debug结果:

汇编语言程序设计——循环结构例8_第1张图片

 

设计目标

在教材 6.5 节中,我们用单循环实现对一维数组求最大值,如果是二维数组求每行中的最大值,就要用双重循环实现。

查找 3×4 矩阵 A 每行中的最大值,并放入 MAX 矩阵。

设计思路

(1)外循环控制行数,内循环控制列数并完成最大值判断;

(2)内外循环都用 LOOP 指令,用堆栈保存外循环计数值 CX,从外循环进入内循环时要重置内循环的计数值 CX;

(3)用已存入一维矩阵 MAX 的数据与 A 矩阵的数据做比较,较大的数放入 MAX 后再与其它数继续比较。

; 6-10.asm  查找3×4矩阵A每行中的最大值放入MAX矩阵
data segment
  a db 2,-4,-5,10
    db 3,6,-7,-12
    db 14,-5,9,-3
 m  dw 3                        ;3行
 n  dw 4                        ;4列
max db 3 dup(0)
data ends
code segment
   assume cs:code,ds:data
start:  mov ax,data
        mov ds,ax
        mov cx,m                    ;共找3次,外循环次数
      mov bx,0
      mov si,0
rept2:  push cx                    ;外循环次数入栈保存
      mov cx,n                    ;内循环次数,4次
rept1:  mov al,a[bx]                ;找每行最大值
           cmp al,max[si]
        jle let2
         mov max[si],al            ;最大值放在max
let2:  inc bx                    ;继续判断下一元素
        loop rept1
        inc si                    ;下一行
        pop cx                    ;弹出外循环次数
        loop  rept2
        mov ah,4ch
        int 21h
code ends
     end start

运行结果:

img

实验结果分析

  • (1)虽然 A 矩阵是二维的,但在存储器中实际存放时,是按顺序连续存放的。因此编写程序时,可以把 A 矩阵的数据用 MOV AL,A[BX] 相对寄存器寻址方式连续取出;此时 BX 的值可以加到 11,就把 A 矩阵的 12 个元素分别取出了。
  • (2)从 0010H 单元开始是 MAX 矩阵,存放 3 个最大值。
  • (3)行列值 M 和 N 定义为字型是与 CX 循环计数器类型相匹配。

你可能感兴趣的:(汇编语言)