汇编语言程序设计——循环结构例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结果:
设计目标
在教材 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
运行结果:
实验结果分析
:
MOV AL,A[BX]
相对寄存器寻址方式连续取出;此时 BX 的值可以加到 11,就把 A 矩阵的 12 个元素分别取出了。