求双字节补码的问题

地主家的大撒孩 2015-02-04 05:11:29
复习汇编下的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”。 若是,则高字节取补,
否则高字节取反。”
...全文
1007 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
weerw366 2018-10-14
  • 打赏
  • 举报
回复
低字取补后判断高字节是否要加1,高字节已先取反
  • 打赏
  • 举报
回复
引用 楼主 u010204272 的回复:
复习汇编下的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”。 若是,则高字节取补, 否则高字节取反。”
明白了。 ZERO: MOV A, @R0 ;高字节取补存入 addr2+1 单元 CPL A INC A MOV @R1, A LOOP1: RET 此处的"INC A"其实加的是低字节的进位。求补码的加一由 START: MOV R0, #addr1 ;原码低字节地址送 R0 MOV R1, #addr2 ;补码低字节地址送 R1 MOV A, @R0 ;原码低字节送 A CPL A ; A 内容取补 INC A 这里的“INC A”执行过了。 谢谢。汇编太过灵活,包罗万象
纵横车 2015-02-04
  • 打赏
  • 举报
回复
负数补码的方法是按位取反后加一。 如果低字节取补后是0说明低字节源码就是0000 0000,如果对这个双字节数取补,先取反后低字节为1111 1111,再加1后就必然要向高字节进位,就是高字节要加1,也就相当于高字节取补; 如果低字节取补后不为0说明低字节取反后不可能为1111 1111,所以加1后不会向高字节进位,所以高字节取反就可以了。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧