汇编基础学习29

本文详细讲解了汇编语言中的有符号整数除法指令IDIV及其使用方法,并介绍了进行除法运算前必要的符号扩展指令CBW、CWD、CDQ的作用与用法。

文章转自 http://www.mcany.cn/article/304.htm

博主 没落的残阳

 

这节来学习下有符号整数除法指令 IDIV,此指令进行有符号的除法运算,使用的操作数格式与DIV指令格式相同。 在进行8位除法之前,被除数(AX)必须进行符号扩展,余数的符号和被除数总是相同。

        那么符号扩展顾名思义其实就是将它的符号位进行扩展,那么符号扩展有无相关的指令呢? 当然有, 那就是CBW CWD CDQ 指令。  
        
     首先看CBW指令,CBW指令是将(字节扩展至字)。我们从它后面的两个后缀就可以看的出来。B =byte   -   W = word 。 这个指令将扩展al的符号位至ah中。
        
     接着CWD指令, 是将字符号扩展至双字。W = WORD , D = DWORD  。 这样我们就不需要去记。 看下就OK了。 这个指令将扩展ax的符号位至dx中。

     CDQ指令 将双字符号扩展至8字节, 指的是扩展eax的符号位至edx寄存器中。
        
        
        
        1.举个例子 10进制 -66。
        -66 = -42h    ;十六进制
        去反码后 = 0BEh
        mov al, -66
        cbw
        
        那么此刻al = 0BEh ,此刻执行cbw, 刚刚说了cbw是将字节扩展至字。  这个指令将al的符号为扩展至ah中。

        大家猜测下cbw指令执行完, ax等于多少。。

        我想大家不约而同会说等于FFBEh 。  就是将我们的al符号位扩展至ah寄存器中。

      2.        
         同样cwd也是一样的。只是cwd是将ax的符号位扩展至dx中。
         举例
         mov ax, 0FFEBh
         cwd
         此刻cwd质量将我们ax寄存器的符号位扩展至dx寄存器中,所以此刻执行完后。 dx = FFFFh   ax= FFBEh

        
          我就不举例cdq指令,很简单,大家自己想一下,就是将eax的符号位扩展至edx寄存器中。

        
  介绍了上面的符号扩展我们现在来学习IDIV有符号除法指令,我们在进行有符号整数除法指令运算时候,一定要记得被除数进行符号扩展。余数的符号和被除数的符号相同。
                
        1.举个例子
        
        mov al, -66
        cbw
        mov  bl, 5
        idiv bl
        很明显执行第一句指令的时候al = 0EBh, 此刻执行cbw扩展指令,此刻我们的ax = 0FFEBh,然后此刻我们进行给bl传送立即数5,然后通过idiv 指令进行除法,大家是否还记得div指令操作8位除数的时候,商和除数保存在那里呢?  呵呵 商保存在al中,余数保存在ah中。

        那么大家想象最后执行完后 al =?  ah = ?
        
        注意商和余数是正数还是负数,由于我们除后,我们的商还是负数 ,注意看上面说的,不管怎么样我们的余数的符号位和被除数的符号位是相同的,所以此时余数也是负数。

        我们来计算下, al = -13 = -0dh  ,ah = -01h
        
         我们求反码。
         -0d
        15 - 0 = F
        15 - D = 2
        +1 = F3h
        很明显al = F3h
        
        -01
        15 - 0 = F
        15 - 1 = E
          +1
        ah = FF
          
        最终我们可以计算出来ah = 0FFh
                            al = 0F3h
        
        
          2.
        mov ax, -6000
        cwd
        mov bx, 300
        idiv bx
        
        -6000 = -1770h
        我们求反码
        15 - 1 = E
        15 - 7 = 8
        15 - 7 = 8
        15 - 0 = F
        +1
        = E890h
        此刻ax = E890h
        
        执行cwd指令后,我们的字扩展双字,ax = E890h dx = FFFFh
        
        然后执行mov bx, 300
        300转换16进制
        bx = 012ch
        此刻我们在通过idiv指令进行除法运算。  16位我们的商是存在ax寄存器,余数在dx寄存器中。
        
        我们计算下:
        ax = -20
           = -14h
        我们取反码
        15 - 1 = E
        15 - 4 = B
        EB + 1 = ECh
        
        那么我们的ax =? 等于00EC? 当然不是了, 因为我们要保留符号位的,所以此刻ax = FFECh 。
        
        余数由于是0,所以dx= 0000h 。
        
        
     呵呵 不难把

【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE33节点的配电网韧性提升方法,重点研究了移动储能系统的预布局与动态调度策略。通过Matlab代码实现,提出了一种结合预配置和动态调度的两阶段优化模型,旨在应对电网故障或极端事件时快速恢复供电能力。文中采用了多种智能优化算法(如PSO、MPSO、TACPSO、SOA、GA等)进行对比分析,验证所提策略的有效性和优越性。研究不仅关注移动储能单元的初始部署位置,还深入探讨其在故障发生后的动态路径规划与电力支援过程,从而全面提升配电网的韧性水平。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事智能电网、能源系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于科研复现,特别是IEEE顶刊或SCI一区论文中关于配电网韧性、应急电源调度的研究;②支撑电力系统在灾害或故障条件下的恢复力优化设计,提升实际电网应对突发事件的能力;③为移动储能系统在智能配电网中的应用提供理论依据和技术支持。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析,重点关注目标函数建模、约束条件设置以及智能算法的实现细节。同时推荐参考文中提及的MPS预配置与动态调度上下两部分,系统掌握完整的技术路线,并可通过替换不同算法或测试系统进一步拓展研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值