【问题标题】:Comparing Signed and unsigned values in numeric processor比较数字处理器中的有符号和无符号值
【发布时间】:2020-07-08 14:11:30
【问题描述】:

嘿,伙计们,我的期末考试即将到来,目前正在学习装配,我正在努力解决一件事,我也无法真正找到答案。 假设我有 2 个双值 x1=-0.5 ,x2=1.0 我想比较 x1 和 x2,但遗憾的是其中一个是有符号的(x1),另一个是无符号的, 我想使用 Condition ,假设 #C 相当于

                       "While(x1<=x2)"

所以我使用以下代码:

_find_delta2 PROC NEAR
    PUSH BP
    MOV BP,SP
    MOV AX,0
    L1:
    MOV AX,0
    FLD CNT
    FMUL QWORD PTR [BP+22];ST0=I*H
    FADD QWORD PTR [BP+6]; STO0=I*H+X1
    FST TMP ; TMP=I*H+X1
    FCOMP QWORD PTR [BP+14] ; ST0 COMPRAE WITH X2
    FSTSW AX
    SAHF
    JNL DONE

遗憾的是,在第一个循环中,尽管 x1=-0.5, x2=1.0,但似乎满足条件 我该如何解决这个问题? 谢谢!

【问题讨论】:

  • 我已经标记了 CPU 架构。如有错误请更正标签。另外,请提供minimal reproducible example,因为您的代码 sn-p 无法按原样复制。至少添加设置 x87 堆栈的代码和具有所需值的BP+14
  • 嘿fuz,我已经添加了代码段,我还想要一个关于如何比较无符号和有符号双数的一般解释
  • 什么是“AX 标志”? fstsw ax 后跟sahf 是正确的,你只需要在jae(或jnb)之后。
  • 它们看起来像是浮点数,是吗?这意味着它们都始终是签名的。
  • @Soske 请不要张贴代码图片。而是将您的代码作为文本发布。再说一遍:我对minimal reproducible example 比你的完整代码更感兴趣。您的大部分逻辑与您的问题无关,但是您比较的数字的值很重要!也就是说,这就像用户 ecm 已经提到的有符号/无符号比较问题。

标签: assembly x86 x86-16 x87


【解决方案1】:

...但遗憾的是其中一个已签名(x1),另一个未签名

在处理浮点数时确实没有要考虑的无符号数


While(x1<=x2)

使用 x1 加载 ST(0) 后,您可以使用以下方法比较 x1x2

FCOMP QWORD PTR [BP+14]

如果 ST(0) 小于 SRC,则 C0 标志为 1
如果 ST(0) 等于 SRC,则 C3 标志为 1

执行后:

FSTSW AX
SAHF

C0 标志将被复制到 CF 进位标志和
C3 标志将被复制到 ZF 零标志。

从这里您可以看到您的&lt;= 条件(“小于或等于”)是如果设置了这些标志中的一个或两个,则为TRUE。使用jbe 指令(“跳到低于或等于”)。

    fcomp qword ptr [bp+14]
    fstsw ax
    sahf
    jbe TRUE
FALSE:
    ... x1 > x2
TRUE:
    ... x1 <= x2

【讨论】:

  • 非常感谢!对我帮助很大
猜你喜欢
  • 2012-07-28
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 2021-10-31
  • 2011-07-21
  • 2015-10-31
相关资源
最近更新 更多