问题描述
假设有一个字类型的数值 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 的值进行操作跳转的指令)
代码展示
; multi-segment executable file template.
data segment
arry1 dw 223, 4037, 5635, 8226, 11542, 14430, 45257, 811
len equ $-arry1 ;将数组长度定义为len
res1 db len/2 dup(0) ;定义了len/2个字节,且全为0
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
mov ax, data ;初始化变量
mov ds, ax
mov cx, 8 ;定义外层循环为8
lop1: mov bl, 16 ;定义内层循环16,遍历16个字节保存的8个数据
lop2: shl ds:arry1[di],1 ;每次向左移动1位
jc s ;如果每次cf = 1,跳转到s
add ds:res1[si], 1 ;给res1[di]加1
s: dec bl ;当bl == 0时,跳出内层循环
jnz lop2
add si, 1 ;res1向后移动1位
add di, 2 ;arry1向后移动2位
loop lop1
mov ax, 4c00h ;结束返回程序
int 21h
ends
end start
这篇博客介绍了如何用汇编语言编程,具体是通过shl和shr指令配合条件转移指令,统计一个字类型的数值数组arry1中每个元素包含'0'数据位的个数,并将统计结果存储在res1数组中。代码示例展示了详细的循环和计数过程。
1938





