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