NoPass proc far push ax push dx xor cx,cx mov cl,slength lea si,score mov bx,3ch; push cx mov cl,04h shl bh,cl;6005h add bl,bh pop cx rotate4: mov al,[si] cmp al,bl;score[i] < 60? jnc rotate5 inc count rotate5: inc si loop rotate4 mov cl,04h xor ax,ax mov al,count mov bl,0ah div bl;0102h mov dl,al mov bl,ah; add dl,30h mov ah,02h int 21h mov dl,bl add dl,30h int 21h pop dx pop ax ret NoPass endp写一下这段代码的涉及逻辑
时间: 2023-09-25 07:10:15 浏览: 130
这段代码是一个汇编语言程序的一部分,涉及到成绩统计的逻辑。下面是对代码的逻辑说明:
1. 首先,代码定义了一个名为NoPass的过程(procedure)。
2. 在过程开始处,将寄存器AX和DX压栈,以保存它们的值。
3. 接下来,使用异或(xor)指令将CX寄存器清零,并将变量slength的值加载到CX寄存器中。这个变量表示成绩数组的长度。
4. 使用LEA指令将数组score的起始地址加载到SI寄存器中。
5. 将十进制数3C(60)加载到BX寄存器中。这个值表示及格分数的阈值。
6. 将CX寄存器的值压栈,并将十六进制数04(4)加载到CL寄存器中。
7. 使用SHL指令将BH寄存器左移4位,然后将BL寄存器与BH寄存器相加。这样得到的值是6005H,用于与成绩进行比较。
8. 弹出CX寄存器的值。
9. 进入循环rotate4,该循环用于遍历成绩数组。
10. 先将数组中的当前成绩加载到AL寄存器中。
11. 使用CMP指令将AL寄存器中的值与BL寄存器中的值进行比较,判断当前成绩是否小于60。
12. 如果不小于60,则跳转到rotate5,否则执行下一条指令。
13. 在rotate5中,递增计数器变量count。
14. 将SI寄存器的值递增,即指向下一个成绩。
15. 使用LOOP指令将CX寄存器的值减1,并根据CX寄存器的值判断是否继续执行循环。如果CX寄存器的值不为0,则跳转回rotate4,否则执行下一条指令。
16. 将十六进制数04加载到CL寄存器中。
17. 使用XOR指令将AX寄存器清零。
18. 将count变量的值加载到AL寄存器中。
19. 将十进制数0A(10)加载到BL寄存器中。
20. 使用DIV指令将AX寄存器的值除以BL寄存器的值,商存放在AL寄存器中,余数存放在AH寄存器中。这样可以得到十进制数count的十位和个位。
21. 将AH寄存器的值加载到DL寄存器中,然后将DL寄存器的值加上30H(ASCII码中数字0的偏移量),得到十位数字的ASCII码。
22. 使用INT 21H中断调用,将十位数字打印到控制台上。
23. 将BL寄存器的值加载到DL寄存器中,然后将DL寄存器的值加上30H,得到个位数字的ASCII码。
24. 再次使用INT 21H中断调用,将个位数字打印到控制台上。
25. 最后,将DX寄存器和AX寄存器的值弹出栈,并使用RET指令返回到调用这段代码的位置。
总体来说,这段代码用于统计成绩数组中不及格(小于60)的成绩个数,并将个数以十进制形式打印到控制台上。
阅读全文