【发布时间】:2010-12-26 16:16:16
【问题描述】:
我想在汇编中将正数转换为负数, 我需要一个代码示例
输入是十六进制sdword
谢谢
【问题讨论】:
-
您需要指定一个处理器。每个处理器使用一组不同的操作。
-
哪种汇编语言?
-
使用 NEG 指令。 “hex sdword”没有任何意义,十六进制是为人类服务的。
我想在汇编中将正数转换为负数, 我需要一个代码示例
输入是十六进制sdword
谢谢
【问题讨论】:
嗯,有两种方法可以做到这一点,最好是将数字加载到寄存器中,然后使用 Hans 提到的NEG 指令,即:NEG EAX 将否定 eax。另一种方法是XOR EAX,EAX SUB EAX,EDX,其中 edx 包含您要否定的数字
【讨论】:
XOR EAX,EAX,为什么不只是MOV EAX, 0h?
XOR EAX,EAX 是一个打破依赖的习惯用法(参见英特尔优化指南),这意味着 CPU 可以使用寄存器重命名来加快速度。它也是一个较小的编码,这有助于 i-cache 压力和指令获取和解码。 TBH,在这种情况下没有区别,这只是我的一个习惯(但不是坏习惯)。
你可以取数字的二进制补码。 IE。按位 NOT 后跟加一。
Data Segment
num dw 00000010B
Data Ends
Code Segment
Assume cs:code, ds:data
Begin:
mov ax, data
mov ds, ax
mov es, ax
mov ax, num
NOT ax
add ax, 00000001B
Exit:
mov ax, 4c00h
int 21h
Code Ends
End Begin
【讨论】:
这是一个在线资源,展示了如何为 80x86 处理器执行此操作:http://webster.cs.ucr.edu/AoA/DOS/ch01/CH01-2.html
【讨论】: