假設有一個字類型的數值 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 的值進行操作跳轉的指令)
源代碼
assume ds:data, ss:stack, cs:code
data segment
arr1 dw 223,4037,5635,8226,11542,14430,45257,811
len equ $-arr1
res1 dd len dup(0)
data ends
stack segment
dw 128 dup(0)
stack ends
code segment
start:
;初始化段寄存器
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 256
;lop1:(arr1的字數)8次
mov cx, 8
mov bx, 0 ;arr1內部字節偏移
lop1:
push cx
mov ax, 0 ;初始化ax, 用於記錄arr1每個字中0的個數
;lop2: (每個字的位數)16次
mov cx, 16
jcxz next
mov dx, word ptr[arr1][bx] ;dx存當前的字
lop2:
shl dx, 1
jc notz ;非零跳到notz,之間的代碼不執行
inc ax
notz:
loop lop2
mov word ptr [res1][bx], ax
add bx, 2
pop cx
loop lop1
next:
mov ax, 4c00h ; exit to operating system.
int 21h
code ends
end start ; set entry point and stop the assembler.