作者:心若繁花花满地 | 来源:互联网 | 2023-06-08 14:01
..........
MOV CX,3
X1: MOV BX,X[SI]
MOV X[SI+2],BX
LOOP X1
我想问的是循环体MOV BX,X[SI] 一共执行几次,我认为是4次? 书上好像说的是三次.
MOV X[SI+2],BX
还有一个问题,求负数的绝对值是用NEG指令吗? 可NEG不是求补指令吗,怎么它取补后的值是绝对值吗? 那求补码又用什么指令呢?
谢谢!
19 个解决方案
是 3 次 (CX=3, 2, 1). LOOP 指令在 CX=1 时, 经过了该指令后 CX=0 了, 就不再进行循环了
NEG 是求相反数, 也就是 2 的补码
循环我明白了,
那个用NEG求负数的绝对值是老师说的,所以我郁闷了,你们一般求绝对值怎么求?
对于有符号数, 可以这样:
and ax, 0x7fff ; 相当于把符号位置零
不对吧. ax=-1=0xffff, and ax, 7ffffh 后 ax 为 7fffh = 32767 是 -1 的绝对值吗?
我现在想知道的是老师说的对不对? 可以用NEG求绝对值吗?
我个人认为的求补指令是求补码,也许是我的看法错了,所以来求教大家的? 谢谢!
用neg可以求绝对值.
NEG replaces the value of a register or memory operand with its two's complement. The operand is subtracted from zero, and the result is placed in the operand.
cmp ax, 0 ; 值放在ax中
jge gezero
neg ax
gezero:
...
求补码是正确的.
如:
-1: 0xffff
先求反: 0x0000
再加1: 0x0001 = 1
可以的,,,负数的才求补,,正数的补码和原码一样。
也就是说把要求的绝对值的值放在ax中,就可以求了吗?
为什么会这样呢? bx就不行了吗?
求补码是正确的.
如:
-1: 0xffff
先求反: 0x0000
再加1: 0x0001 = 1
这句话理解不了,为什么neg指令求补码也可以,求绝对值也可以. 负数在内存的存储方式不都是补码吗?
cmp ax, 0 ; 值放在ax中
jge gezero
neg ax
gezero:
...
上面的代码中, 如果ax>=0, 则|ax|=ax, 不用再求补码. 只有在ax <0时,
才求ax的补码.
还是不理解,你能举个例子来看看吗?我太笨了.
比如-1的补码是0FFH 这难道就是+1吗?
首先, 千万别说自己笨, 只是我说的很模糊.
-1的补码是0xffff. 它是这样求的:
1 : 0001
按位求反: fffe
末位加1: ffff -- -1
现在还按这个补码的求法, 作用在ffff上,
ffff : ffff
按位求反: 0000
末位加1: 0001 -- +1
这个过程就叫求某数的补码(two's complement)
我说的求负数的补码, 实际上是"求负数的补码的补码", 希望没有让你更晕 ;-)
也就是求负数的绝对值对吧!
呵呵! 我明白了"求负数的补码的补码" 这种话正是我想要的,谢谢!