.MODEL SMALL
.STACK 100H
.DATA
ARR DW 1234H, 1111H, 5678H, 2222H, 3333H, 8765H, 4444H, 1357H
LEN EQU ($ - ARR)/2 ;获取数组长度
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV CX, LEN
MOV BX, 0 ;计数器清零
MOV DX, 0
LOOP_START:
MOV AX, [ARR+BX] ;获取当前数组元素值
CMP AH, 0 ;判断高字节是否为奇数
JPO EVEN_NUM ;跳转到偶数计数器
INC DX ;奇数计数器+1
JMP NEXT
EVEN_NUM:
INC BX ;BX自增为下一个数组元素做准备
NEXT:
ADD BX, 2 ;移动到下一个数组元素
LOOP LOOP_START
;奇偶数统计完成后, DX存放奇数, LEN-DX存放偶数
MOV CX, DX ;CX存放奇数
MOV DX, LEN
SUB DX, CX ;DX存放偶数
MOV AH, 4CH ;要求DOS返回退出代码
INT 21H
MAIN ENDP
END MAIN
在该程序中,我们定义了一个包含16位十六进制数字的数组ARR,并使用LEN计算该数组的长度。然后我们使用循环和CMP指令来判断每个元素中的高字节是否包含奇数值。如果元素是奇数,将DX计数器加1;如果元素是偶数,则跳转到偶数计数器。计数期间,我们还增加了BX的值以准备对数组的后续元素进行操作。在奇偶计数完成后,我们将分别存储DX和LEN-DX的值,以表示奇数和偶数的数量。最后,我们使用AH=4CH中断,要求DOS返回退出代码。