小谈16位汇编NEG求补指令

来源:互联网 发布:帝国cms采集规则下载 编辑:程序博客网 时间:2024/05/19 20:45

16位汇编,看到别人写的3行代码对一个32位数求补,举例子论证

NEG是求补指令,把他之后的操作数求补(先求反再加1)
本指令影响标志位CF、OF、SF、PF、ZF及AF.

有一个32位的数
高16位存储在Dx
低16位存储在Ax,写出指令对其求反

NEG DX
NEG AX
SBB DX,0

NEG后面的操作数,如果值不为0,CF就总为1
让我死都不明白的是为什么NEG指令要这样设置,为什么如果NEG后面操作数不为0就让那个CF等于1?当操作数为0时,取反加1还是0进了一位,当操作数为0的时候CF才应该等于1啊,而其他数求补都没有进位,为什么CF就等于1了呢?
后来发现在这道题中就可以看出这样设置非常正确
举个例子,假如DX和Ax中的数都不为0,
设Dx= 0000 0000 0000 1000
AX= 0000 0000 0000 0010
这个数完整的是
0000 0000 0000 1000 0000 0000 0000 0010
求补
1111 1111 1111 0111 1111 1111 1111 1110

分别求反两个数
则DX=1111 1111 1111 1000
AX=1111 1111 1111 1101
这个数完整写出来
1111 1111 1111 1000 1111 1111 1111 1101
对比正确求反结果,DX多加了一个1(注:求反与求补不同)


NEG指令设置的是后面的操作数只要不为0则CF为1
所以在SBB(sub with borrow)的时候,把CF减了进去


我们再来看当其中DX和AX其中一个为0的时候
我们就设DX= 0000 0000 0000 1000
AX=0000 0000 0000 0000 0000
NEG DX
则dx=1111 1111 1111 1000
NEG AX
AX仍然为0,且CF=0
SBB DX,0
DX<- DX-0-CF
即:DX<- DX-0-0
DX的值不变
得到1111 1111 1111 1000 0000 0000 0000 0000
我们来求补0000 0000 0000 1000 0000 0000 0000 0000 这个数
先求反1111 1111 1111 0111 1111 1111 1111 1111
加1
1111 1111 1111 1000 0000 0000 0000 0000
得出的结果是正确的

其实现在看这个问题不是很难,不过我们知道了为什么NEG指令对后面操作数如果不是0,CF就等于1,和平常的无符号数溢出有点不一样

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩晚上睡觉不盖被子怎么办 镜子对着房间门怎么办 高血压引起的眼底出血怎么办 墙砖颜色选深了怎么办 墙砖颜色太深怎么办 30岁了没有朋友怎么办 产检宝宝腿短怎么办 2岁宝宝不学说话怎么办 4岁了还不会说话怎么办 两周岁还不说话怎么办 2岁了不会说话怎么办 一岁宝宝蛀牙了怎么办 分手了想联系他怎么办 和婆家人闹翻了怎么办 2岁宝宝不好断奶怎么办 2岁宝宝断奶哭闹怎么办 脑子感觉变笨了怎么办 5岁数学不开窍怎么办 小孩拼音太差了怎么办 我生了爸爸孩子怎么办 三岁宝宝特别犟怎么办 孩子说老师打他怎么办 孩子在幼儿园不合群怎么办 孩与厌学不想学怎么办 1岁宝宝太活泼怎么办 3岁宝宝不爱看书怎么办 6岁不好好吃饭怎么办 二岁宝宝不吃饭怎么办 2岁半宝宝不爱吃饭怎么办 宝宝一岁了不爱吃饭怎么办 一岁多的宝宝不爱吃饭怎么办 小孩不吃饭还吐怎么办 一岁婴儿不吃饭怎么办 写字久了肩膀疼怎么办 6岁儿童不写字怎么办 孩子字写得丑怎么办 6岁儿童怕写字怎么办 高三学生上课困怎么办 高三学生压力大怎么办 数学会做的做错怎么办 脑子很笨反应慢怎么办