实验内容
假设有一个字类型的数值 arry1,试编写程序统计 arry1 数值及其后若干数值,在字单元中存储时每个数据中 含“0”数据位的个数,并将统计结果保存在 res1 数组中。数据段的代码定义如下:
data segment
arry1 dw 223,4037,5635,8226,11542,14430,45257,811
len equ $-arry1
res1 db len/2 dup(0)
data ends
注:可结合 shl(或 shr)指令和条件转移指令来实现对字节数据中“0”的计数。(提示:使用 shl 或 shr 指令, 移出位将写入标志寄存器中的 CF 标志位,而条件转移指令中正好有根据 CF 的值进行操作跳转的指令)
参考代码:
data segment
; add your data here!
arry1 dw 223,4037,5635,8226,11542,14430,45257,811
len equ $-arry1
res1 db len/2 dup(0)
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov di, 0 ;计算循环次数
mov cx, 8 ;数组循环次数
ArrayLoop:
mov al, 0 ;al清零
shl di, 1 ;计算偏移量
mov dx, ds:[di] ;获取待操作数据
push cx ;保存cx
mov cx, 16
BitLoop:
shr dx, 1 ;将最低位移动到CF中
jc BitLoopEnd ;最低位为1时跳转到结束
inc al ;结果+1
BitLoopEnd:
loop BitLoop ;si=0则结束循环
pop cx ;读取cx
shr di, 1
mov res1[di], al; 结果储存到res1中
inc di ;循环次数+1
loop ArrayLoop ;di=0则结束循环
mov ah, 4CH ;程序结束
int 21H
ends
end start ; set entry point and stop the assembler.