组装:如何比较不同符号的数字?
Assembly: how to compare numbers of different signs?
晚上好。我正在做关于 Assembly 的实验工作。我必须比较 3 个数字 -8、-2 和 11 才能得到最大的。我用额外的代码翻译了它们,并用十六进制表示法表示它们。所以我得到错误的答案,因为 -2 = FE > 11 = B。问题是我怎样才能正确比较这些数字?
我使用 nasm, x86.
比较指令以及几乎所有算术指令都会修改状态寄存器中的一组标志。
标志的修改与指令的意图无关——例如无论(很少)需要检查该标志的状态,都会修改奇偶标志或辅助标志。
当-2与11进行比较,或者-2减去11时,处理器实际上并不知道-2是负数;相反,计算的是 0xfe - 0x0b,它不会溢出,因此 CarryFlag == 0。同样因为结果不为零,ZeroFlag == 0。因为 0xFE 的符号与 0x0b 不同,OverflowFlag == 0 也。
所有这些 OF、ZF、CF 的不同组合映射到更高级别的抽象,例如 unsigned <= unsigned
、any != any
、signed > signed
。在 Intel 体系结构中,'Below / Above' 指的是无符号比较,'Greater / Less' 指的是有符号比较——同样,同一组标志可以指代多个抽象,例如 JC
(参见 http://unixwiz.net/techtips/x86-jumps.html )
您可能需要的带符号比较的子集是 JG
或它的补码 JNG
,它代表 Jump Not Greater,等于 JLE
或 Jump Less 或等于。
除了条件分支,x64指令集还支持寄存器的条件set/move,armv7允许条件执行大多数指令,armv8允许条件执行一些有趣的指令序列(如a = b iff LessThan, else a = c + 1
).
晚上好。我正在做关于 Assembly 的实验工作。我必须比较 3 个数字 -8、-2 和 11 才能得到最大的。我用额外的代码翻译了它们,并用十六进制表示法表示它们。所以我得到错误的答案,因为 -2 = FE > 11 = B。问题是我怎样才能正确比较这些数字? 我使用 nasm, x86.
比较指令以及几乎所有算术指令都会修改状态寄存器中的一组标志。
标志的修改与指令的意图无关——例如无论(很少)需要检查该标志的状态,都会修改奇偶标志或辅助标志。
当-2与11进行比较,或者-2减去11时,处理器实际上并不知道-2是负数;相反,计算的是 0xfe - 0x0b,它不会溢出,因此 CarryFlag == 0。同样因为结果不为零,ZeroFlag == 0。因为 0xFE 的符号与 0x0b 不同,OverflowFlag == 0 也。
所有这些 OF、ZF、CF 的不同组合映射到更高级别的抽象,例如 unsigned <= unsigned
、any != any
、signed > signed
。在 Intel 体系结构中,'Below / Above' 指的是无符号比较,'Greater / Less' 指的是有符号比较——同样,同一组标志可以指代多个抽象,例如 JC
(参见 http://unixwiz.net/techtips/x86-jumps.html )
您可能需要的带符号比较的子集是 JG
或它的补码 JNG
,它代表 Jump Not Greater,等于 JLE
或 Jump Less 或等于。
除了条件分支,x64指令集还支持寄存器的条件set/move,armv7允许条件执行大多数指令,armv8允许条件执行一些有趣的指令序列(如a = b iff LessThan, else a = c + 1
).