0

这是我最近遇到的一个家庭作业问题。编写一个名为 twoscom 的子程序,它接收一个 8 位数字 A 作为参数,并返回一个与 A 的二进制补码相对应的 8 位值。知道怎么做吗?:/ 用 8F base 16 测试它

4

1 回答 1

0

大多数处理器中的数字已经编码为二进制补码,无需“转换”它们。通常,“二进制补码”是人类对数字的解释。

另一个问题是,如果您想计算给定的负数(实际上是二进制补码),即您需要 y = -x。

在许多平台中,这种简单的操作是通过特殊指令实现的,不需要使用函数:

; x86
    neg al

在没有neg指令的 CPU 上,它仍然很容易通过 2 条指令实现:

; pseudo cpu
    not reg8
    inc reg8

; or 
    xor reg8, 0ffh
    add reg8, 1

; or any other combination available

为什么这个操作不适合作为子程序来实现?这样的子程序将如下所示:

; al contains the argument and return the result.
twoscom:
      neg al
      ret

然后,如果你想用它来计算 cl 的二进制补码,你必须:

      mov  al, cl
      call twoscom

这样,您在 16 位程序上执行 4 条指令,在 16 位程序上执行 8 字节长,在 32 位程序上执行 10 字节长,更糟糕的是,影响内存读写(调用/ret 的堆栈操作)而不是单条指令:

      neg cl    ; always 2 bytes and memory access.

二进制补码只是非常非常基本的运算。您不会编写子程序来添加两个数字,是吗?

于 2013-08-03T08:28:39.717 回答