; multi-segment executable file template.
data segment
NUM DB 12H,88H,82H,89H,33H,90H,01H,10H,0BDH,01H ;输入数据
LEN EQU $-NUM ;$所代表的地址 - NUM这个变量的地址,
;即LEN = $ 与 NUM的距离,即LEN =9
ends
stack segment
dw 128 dup(0)
ends
code segment
ASSUME CS:CODE,DS:DATA
start:
; set segment registers:
mov ax, data
mov ds, ax
LEA DI,NUM ;得到DB首位地址
MOV CX,LEN
XOR CH,CH ;异或操作,CH清零
MOV BL,CH ;BL=CH,BL清零
A1: MOV AL,[DI]
TEST AL,80H ;检查数据首位是否为1,首位为1即为负数
JE A2 ;如果上一步判断为负数,则不执行该语句。
;若不为负数,则跳转到A2,DI+1.即判断下一个数字,循环执行,直至DB内所有数据判断完成
;补充:JE条件转移指令,利用标志位ZF相等即跳转(零标志位),运算结果为0,则ZF=1,
;反之ZF=0.标志结果存放在标志寄存器(FLAGS),也叫程序状态寄存器PSW
INC BL ;YSE BL+1,即负数个数加1
A2: INC DI ;NOT DI+1
LOOP A1 ;LOOP指令通过对CX-1并判断是否为0,作为循环终止条件
;即CX=0,则跳出循环。注意此处CX=LEN,即等于DX所存放的数据个数
MOV [DI+000AH],BL ;存结果,此处寻址方式为:相对基址变址寻址
MOV AX,4C00H ;DOS程序结束的三种方法之一,其特点不需任何条件,并返回寄存器al的值
INT 21H ;通俗点即AH=4CH,即调用INT 21H 4CH号的中断功能,该中断即安全退出程序
CODE ENDS
END START
微机实验 求某数据区内负数的个数
最新推荐文章于 2024-05-16 04:22:17 发布