如何将偏移量添加到程序计数器?

时间:2018-04-14 12:06:59

标签: c architecture

基本上,程序计数器可能有无符号的int值:

例如,如果PC是0b11110000(240),那么我们认为它是240,而不是负值。

但是,如果我们将偏移(符号扩展)添加到PC(0b11110000)以上,则附加值可以是负数或正数:

  

例如,如果我们将0b11111001(-7)添加到PC 0b11110000(240),则PC应该具有233(这意味着我们在无符号和有符号之间添加操作)。但是,如果偏移是正值,则PC 0b11110000(240)   + offset 0b00001111(15)= 255(这意味着我们在无符号和有符号之间添加操作)

如何在无符号和签名之间添加操作?

1 个答案:

答案 0 :(得分:1)

关于two's complement算术的一个好处是它对有符号和无符号量都能保持一致。事实上,在很多时候,CPU并不知道/关心它是在有符号数量还是无符号数量上运行 - 直到某一点(尤其是加法和减法),这主要是解释的问题。

你问了大约240 + -7和240 + 15.我们来看看签名域和未签名域中的这两个问题:

  1. unsigned + signed:

    240 + -7 = 233

    240 + 15 = 255

  2. unsigned + unsigned:

    240 + 249 = 233(489%256)

    240 + 15 = 255

  3. 签名+签名:

    -16 + -7 = -23

    -16 + 15 = -1

  4. 签名+无符号:

    -16 + 249 = -23

    -16 + 15 = -1

  5. 这里发生了什么?好吧,233 unsigned与-23签名相同:它们都是11101001(8位)。在二进制文件中,这两个问题看起来像这样:

    11110000 + 11111001 = (1)11101001
    
    11110000 + 00001111 =    11111111
    

    第一个结果溢出:它真的是111101001(489),但它溢出并且我们丢失了第9位,导致11101001(233)。

    其余的都是解释。 11110000是-16签名,或240未签名。 11111001是-17签名,或249未签名。 11101001是-23签名,或233未签名。 11101111是-1签名,或255无签名。 00001111始终为15。

    (所有这些都假设是两个补码。在一个补码或符号/幅度上,情况会有所不同。但是两个补码是你的计算机使用的。)