ios越狱需要注意什么:有关段内直接寻址的一个例题,请解释一下偏移量的符号扩展是怎么回事

来源:百度文库 编辑:高考问答 时间:2024/04/20 16:42:26
书上是这么描述的:“。。。偏移量为2的补码。假设disp=D8H,指令是放在代码段2196H相继2个地址单元内,因此转移地址的有效地址为:EA=2198H+FFD8H=2170H
在计算EA时,一个字节偏移量D8H必须符号扩展为16位(因为D8H最高符号位为1,所以扩展后的高位字节全为1[即FF] ),才能与IP相加。”

我不明白的地方是:
1,什么叫偏移量为“2的补码”?我只听说过补码是什么,什么叫“2的补码”?那个在指令中给出的D8H是已经是补码了,还是需要自己转换?
2,D8H是怎么“符号扩展”为FFD8H的?
3,2198H+FFD8H这个加法是怎么加的?我明白是16进制啊,满16进1,那我怎么加不出书上那个结果来?
tanyuguo 回答得很好。还有一点不明白,D8H首位符号位为1我明白,但为什么扩展的时候高8位都扩展为1不是0呢?

鬼火狼烟,谢谢。不过我仍然不明白你在说什么。

1、“2的补码”应该就是说计算机表示负数时用的将其绝对值的二进制数“取反加一”。这里的D8H是十进制数-40(十六进制28H)的补码。
2、D8H转成二进制是11011000,首位符号位是1,因此扩展成1111111111011000,即十六进制FFD8H。
3、计算机执行加法时是二进制加法,
0010 0001 1001 1000 -- 2198H
1111 1111 1101 1000 -- FFD8H
+
--------------------------------------
(1) 0010 0001 0111 0000 -- 2170H
结果有进位,但进位不被寄存器保存,直接忽略。

符号扩展即保持该数的正负性不变,因此最高位是什么,高8位就是什么。

我来做个补充吧呵呵,关键在于你的D8H是补码,由于计算机指令实际是化减为加通过加一个补码来处理运算,所以上面的偏移其实是减去28H,转为补码再加的意思就是减去28H的意思,但是补码如果要凑位扩展的话,由于我们要考虑到这个实际运算是减法,所以我们不能用逻辑移位来扩展位数,而应该使用算术移位来扩展位数才能得到正确的高位补码,这个也就是为什么平时用不到的算术移位却在指令集中很重要的一个主要原因。