微机实验 求某数据区内负数的个数

; 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

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值