Assembly 如何在汇编中将正数转换为负数
我想将汇编中的正数转换为负数, 我需要一个代码示例 输入为十六进制sdwordAssembly 如何在汇编中将正数转换为负数,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
谢谢你可以取这两个数字的补码。即按位不加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,在这种情况下没有区别,这只是我的一个习惯(但不是一个坏习惯)。此链接不再有效。现在您知道为什么不鼓励使用仅链接的答案了。