记录下自己写的第一个汇编程序

1.题目要求

在内存数据段符号地址为SDATA处连续存放了60个无符号字节数据,试统计该60个数中能被13除尽的数的个数(该结果应存于数据段符号地址COUNT处)。要求:写出完整的数据段与代码段。

2.代码

DATA    SEGMENT
SDATA   DB  10  DUP (5)
        DB  10  DUP (26)
        DB  20  DUP (13)
        DB  20  DUP (9) ;这里设置了60个数,能被13整除的有30个
COUNT   DB  0
DATA    ENDS

_STACKS SEGMENT STACK
        DW  64  DUP (?)
_STACKS ENDS

CODE    SEGMENT
        ASSUME CS:CODE, DS:DATA, SS:_STACKS, ES:DATA
START:  MOV AX,DATA
        MOV DS,AX
        MOV ES,AX
        MOV AX,_STACKS
        MOV SS,AX       ;初始化各段首地址
        LEA SI,SDATA
        MOV CX,60
        XOR AX,AX       ;ax清零,存放余数和商
        MOV BL,0        ;bl清零,存放个数
        MOV BH,0DH      ;bh存放除数:13
NEXT:   MOV AL,[SI]
        MOV AH,0
        DIV BH          ;AX%BH,余数放入AH,商放入AL
        INC SI          ;使si指向下一个被除数
        CMP AH,0        ;判断余数是否为0
        LOOPNZ NEXT     ;cx不为0且余数不为0时跳转
        CMP CX,0
        JZ  A1          ;cx若为0则结束循环
        INC BL          ;能被整除数+1
        CMP AH,0
        LOOPZ NEXT      ;跳回去继续循环
A1:     MOV COUNT,BL    ;把最终结果写到COUNT处
        HLT
CODE    ENDS
        END START
;OK VERSION

3.仿真结果

程序运行结束后各寄存器状态

然后是ds段内存区域的状态

可以看到BL所存放的结果为1EH,转换为十进制刚好为30。也就是说一共有30个数能被13整除,这与我们预设的数据相吻合