【问题标题】:How to convert a positive number to negative in assembly如何在汇编中将正数转换为负数
【发布时间】:2010-12-26 16:16:16
【问题描述】:

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

输入是十六进制sdword

谢谢

【问题讨论】:

  • 您需要指定一个处理器。每个处理器使用一组不同的操作。
  • 哪种汇编语言?
  • 使用 NEG 指令。 “hex sdword”没有任何意义,十六进制是为人类服务的。

标签: assembly x86


【解决方案1】:

嗯,有两种方法可以做到这一点,最好是将数字加载到寄存器中,然后使用 Hans 提到的NEG 指令,即:NEG EAX 将否定 eax。另一种方法是XOR EAX,EAX SUB EAX,EDX,其中 edx 包含您要否定的数字

【讨论】:

  • 而不是XOR EAX,EAX,为什么不只是MOV EAX, 0h
  • @user1720897: XOR EAX,EAX 是一个打破依赖的习惯用法(参见英特尔优化指南),这意味着 CPU 可以使用寄存器重命名来加快速度。它也是一个较小的编码,这有助于 i-cache 压力和指令获取和解码。 TBH,在这种情况下没有区别,这只是我的一个习惯(但不是坏习惯)。
【解决方案2】:

你可以取数字的二进制补码。 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

【讨论】:

  • 我想将位于 sdword 中的数字转换为十六进制而不是二进制
  • 这没什么区别,您可以对十六进制使用相同的指令。例如,只需将 000000010B 替换为 0x123 即可
  • @MadhurAhuja 如果数字是负数,它也会改变他的符号吗?如果不是我需要做的操作,将正面变为负面,而不是将负面变为正面,总结:如果它是 pos 并且如果它是 neg,则改为负面。
【解决方案3】:

这是一个在线资源,展示了如何为 80x86 处理器执行此操作:http://webster.cs.ucr.edu/AoA/DOS/ch01/CH01-2.html

【讨论】:

  • 此链接不再有效。现在您知道为什么不鼓励仅使用链接的答案了。
猜你喜欢
  • 1970-01-01
  • 2011-04-20
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 2011-12-13
相关资源
最近更新 更多