已知有NUM个数存放在以BUFFER为首地址的字节存储区中,试统计其中负元素的个数,要求放到COUNT单元,编写完整程序。

只为记录汇编作业

题目:已知有NUM个数存放在以BUFFER为首地址的字节存储区中,试统计其中负元素的个数,要求放到COUNT单元,编写完整程序。

代码如下:

(负数≤9的情况)

;1.已知有NUM个数存放在以BUFFER为首地址的字节存储区中,试统计其中负元素的个数,要求放到COUNT单元,编写完整程序。
DATA SEGMENT
    BUFFER DB 1,2,3,4,-1,0,-2,2,-3,3,-4,-5,'$'   ;定义buffer
    NUM EQU $-BUFFER              ;计算buffer长度
    COUNT DB 0                    ;用来记录负数个数
DATA ENDS
CODE SEGMENT                      
    ASSUME CS:CODE ,DS:DATA
START:
    MOV AX,DATA
    MOV DS,AX
                                  
    LEA BX,BUFFER    ;使bx指向buffer位置
    XOR CX,CX        ;cx初始化
    MOV CL,NUM       ;把buffer长度给cl用来定义循环的次数
    
CYCLE:
    XOR AX,AX        ;ax初始化
    MOV AL,[BX]      ;把bx中的值赋给al
    CMP AL,0         ;这里用带符号位的比较运算符,否则出错
    JGE NEXT         ;如果这个数大于等于0就跳到next函数
    INC COUNT
    JMP NEXT         ;跳转到next函数
NEXT:
    INC BX           ;让bx指针+1
    LOOP CYCLE       ;跳到CYCLE函数循环 如果cl=0则跳出循环
    
    ADD COUNT,30H    ;让count变成ascll码并且输出
    MOV DL,COUNT
    MOV AH,02H
    INT 21H     
    
    MOV AH,4CH      ;结束
    INT 21H
CODE ENDS
    END START

(在上面代码的基础上优化,可输出负数个数≥9)

;1.已知有NUM个数存放在以BUFFER为首地址的字节存储区中,试统计其中负元素的个数,要求放到COUNT单元,编写完整程序。
DATA SEGMENT
    BUFFER DB -1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,'$'   ;定义buffer
    NUM EQU $-BUFFER     ;计算buffer长度
    COUNT DW 0           ;用来记录负数个数
    ANS DB 6 DUP(0)      ;定义长度为6的数组,便于16进制转10进制的输出
    LEN DB 0             ;用于定义输出数据时的长度
DATA ENDS
CODE SEGMENT                      
    ASSUME CS:CODE ,DS:DATA
START:
    MOV AX,DATA
    MOV DS,AX
                                  
    LEA BX,BUFFER    ;使bx指向buffer位置
    XOR CX,CX        ;cx初始化
    MOV CL,NUM       ;把buffer长度给cl用来定义循环的次数
    
CYCLE:
    XOR AX,AX        ;ax初始化
    MOV AL,[BX]      ;把bx中的值赋给al
    CMP AL,0         ;这里用带符号位的比较运算符,否则出错
    JGE NEXT         ;如果这个数大于等于0就跳到next函数
    INC COUNT
    JMP NEXT         ;跳转到next函数
NEXT:
    INC BX           ;让bx指针+1
    LOOP CYCLE       ;跳到CYCLE函数循环 如果cl=0则跳出循环
    
    XOR AX,AX          ;AX初始化
    MOV AX,COUNT       ;把count放入ax
    XOR BX,BX          ;BX初始化
    MOV BX,10          ;把10放入bx中
    MOV DI,OFFSET ANS  ;把di指针指向buffer头地址
F:
    XOR DX,DX     ;dx初始化
    DIV BX        ;ax/bx 商放在AX,余数放在DX(因为余数≤9,所以在DL)
    ADD DL,30H    ;余数+30H,变成0-9的ascll码值方便输出
    MOV [DI],DL   ;此时的dl值已经是0-9的ascll码,将其放入di中
    INC DI        ;di指针+1
    INC LEN       ;len+1
    CMP AX,0      ;ax与0作比较
    JNE F         ;如果ax≠0则继续跳到上面的f
    XOR CX,CX     ;cx初始化
    MOV CL,LEN    ;把len的值给cl
    DEC DI        ;di指针-1
PRINTF:
    MOV DL,[DI]   ;倒叙输出刚刚存的数据
    MOV AH,2      ;输出单个字符
    INT 21H
    DEC DI        ;di自减1
    LOOP PRINTF   ;如果cl>0则跳到printf函数并且cl-1,否则执行下一条语句    
    
    MOV AH,4CH      ;结束
    INT 21H
CODE ENDS
    END START

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值