Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在汇编中将正数转换为负数_Assembly_X86 - Fatal编程技术网

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

Assembly 如何在汇编中将正数转换为负数,assembly,x86,Assembly,X86,我想将汇编中的正数转换为负数, 我需要一个代码示例 输入为十六进制sdword 谢谢你可以取这两个数字的补码。即按位不加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

我想将汇编中的正数转换为负数, 我需要一个代码示例

输入为十六进制sdword


谢谢

你可以取这两个数字的补码。即按位不加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

这里有一个在线资源,展示了如何为80x86处理器实现这一点:

好吧,有两种方法,最好是将数字加载到寄存器中,然后使用Hans提到的
NEG
指令,即:
NEG EAX
将否定EAX。另一种方法是
XOR EAX,EAX SUB EAX,EDX
,其中EDX包含要求反的数字

,您需要指定一个处理器。每个处理器使用不同的操作集。哪种汇编语言?使用NEG指令。“hex sdword”没有任何意义,hex是人类的。可能的重复我想将sdword中的数字转换为十六进制而不是二进制。如果没有区别,您可以对hex使用相同的指令。只需将0000000 10b替换为0x123即可example@MadhurAhuja如果数字是负数,它也会改变他的符号吗?如果不是我需要做的操作,将正变为负,而不是将负变为正,总之:如果它是正的,如果它是负的,只需将其变为负的。与其
XOR-EAX,EAX
,不如
MOV-EAX,0h
?@user1720897:
XOR-EAX,EAX
是一个打破依赖关系的习惯用法(请参阅《英特尔优化指南》),这意味着CPU可以使用寄存器重命名来加快速度。这也是一种较小的编码,这有助于i-cache压力以及指令获取和解码。TBH,在这种情况下没有区别,这只是我的一个习惯(但不是一个坏习惯)。此链接不再有效。现在您知道为什么不鼓励使用仅链接的答案了。