如何在汇编中将正数转换为负数

9
我希望您能提供一段汇编代码,将正数转换为负数。
输入的数据是十六进制有符号双字。
谢谢。

2
你需要指定一个处理器。每个处理器使用不同的操作集。 - Cheeso
哪种汇编语言? - moinudin
5
使用NEG指令。 "hex sdword"没有具体含义,十六进制是为人类设计的。 - Hans Passant
可能是如何在汇编中计算负数的重复问题。 - Has QUIT--Anony-Mousse
3个回答

18

有两种方法可以实现这个功能,最好的方法是将数字加载到寄存器中,然后像Hans提到的那样使用NEG指令,即:NEG EAX 将会取反EAX。另一种方法是 XOR EAX,EAX SUB EAX,EDX,其中EDX包含你想取反的数字。


2
为什么不使用MOV EAX, 0h,而是使用XOR EAX, EAX - user1720897
12
@user1720897说:XOR EAX,EAX 是一种用于打破依赖关系的习惯用法(详见英特尔优化指南),这意味着CPU可以使用寄存器重命名来加速。同时,这也是编码更小,有助于减轻i-cache压力和指令获取与解码。说实话,在这种情况下,它并没有任何区别,只是我的一个习惯(但不是一个坏习惯)。 - Necrolis

1
你可以对这个数取二进制补码。即按位取反后加一。
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

我想将一个位于sdword中的数字转换成十六进制而不是二进制。 - alonp
2
这没有区别,你可以对16进制使用同样的指令。例如,只需用0x123替换000000010B即可。 - Madhur Ahuja
@MadhurAhuja 如果这个数字是负数,它的符号也会改变吗?如果不是,我需要进行什么操作才能将正数变为负数,而不是将负数变为正数,总之:只需在正数时更改为负数,如果是负数则不变。 - Ofir Attia

-3

4
这个链接已经失效了。现在你知道为什么只提供链接的回答受到反对了。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接