Ax、Bx、Cx、Dx、AL、BL、CL、DL、AH、BH、CH、DH

        英文单词缩写:

                                 AH&AL=AX(accumulator):累加寄存器
                                 BH&BL=BX(base):基址寄存器
                                 CH&CL=CX(count):计数寄存器
                                 DH&DL=DX(data):数据寄存器
                                 SP(Stack Pointer):堆栈指针寄存器
                                 BP(Base Pointer):基址指针寄存器
                                 SI(Source Index):源变址寄存器
                                 DI(Destination Index):目的变址寄存器
                                 IP(Instruction Pointer):指令指针寄存器
                                 CS(Code Segment)代码段寄存器
                                 DS(Data Segment):数据段寄存器
                                 SS(Stack Segment):堆栈段寄存器
                                 ES(Extra Segment):附加段寄存器

        32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。

        4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。

        寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;

         寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用;

        寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;

        寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

        在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。

 

        变址寄存器32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。

 

  • 27
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
这段代码是一个汇编语言程序的一部分,涉及到成绩统计的逻辑。下面是对代码的逻辑说明: 1. 首先,代码定义了一个名为NoPass的过程(procedure)。 2. 在过程开始处,将寄存器AXDX压栈,以保存它们的值。 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)的成绩个数,并将个数以十进制形式打印到控制台上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值