当前位置: 代码迷 >> 汇编语言 >> 求双字节补码的有关问题
  详细解决方案

求双字节补码的有关问题

热度:89   发布时间:2016-05-02 04:28:40.0
求双字节补码的问题
复习汇编下的51,遇见了一个问题,强迫症犯了,老想知道为什么是这样:
首先对低字节取补,然后判其结果是否为全“ 0”。 若是,则高字节取补,
否则高字节取反。
代码如下:
START: MOV R0, #addr1              ;原码低字节地址送 R0
        MOV R1, #addr2              ;补码低字节地址送 R1
        MOV A, @R0                  ;原码低字节送 A
        CPL A                        ; A 内容取补
        INC A
        MOV @R1, A                  ;存补码低字节
        INC R0                       ;调整地址,指向下一单元
        INC R1
        JZ ZERO                      ;( A) =0 时转 ZERO
        MOV A, @R0                  ;原码高字节送 A
        CPL A
        MOV @R1, A                  ;高字节反码存入 addr2+1 单元
        SJMP LOOP1
  ZERO: MOV A, @R0                 ;高字节取补存入 addr2+1 单元
        CPL A
        INC A
        MOV @R1, A
        LOOP1: RET




不明白的地方是对高字节求补码的方法:“判其结果是否为全“ 0”。 若是,则高字节取补,
否则高字节取反。”
------解决思路----------------------
负数补码的方法是按位取反后加一。
如果低字节取补后是0说明低字节源码就是0000 0000,如果对这个双字节数取补,先取反后低字节为1111 1111,再加1后就必然要向高字节进位,就是高字节要加1,也就相当于高字节取补;
如果低字节取补后不为0说明低字节取反后不可能为1111 1111,所以加1后不会向高字节进位,所以高字节取反就可以了。
  相关解决方案