代码之家  ›  专栏  ›  技术社区  ›  Ari157

x86_64 Linux程序集中的逻辑与实现

  •  0
  • Ari157  · 技术社区  · 2 年前

    在assembly中,我没有使用 x < 1 但我想不出如何实现,我可以使用 true )这毫无意义 -1 < 1 将返回 1

    所以我很困惑,我该怎么做,任何已知的实现 我可以用哪个?我找不到,已经找了一段时间了

    2 回复  |  直到 2 年前
        1
  •  3
  •   fuz    2 年前

    标准解决方案是实施 a && b

    if (a)
        return (b);
    else
        return (0);
    

    i、 e.使用条件跳转。在足够新的x86上,您还可以使用 cmov

    ; assumes input in eax and ebx
    mov ecx, eax    ; ecx = A
    test ebx, ebx   ; B?
    cmovnz ecx, ebx ; ecx = A ? B : A
    
        2
  •  3
  •   Kolodez    2 年前

    这是一个没有跳跃的答案:假设您想要计算 RCX RDX 并将其存储在 RAX RBX (注意,被调用的函数通常必须保留 RBX公司

    xorl %eax, %eax   # RAX = 0
    xorl %ebx, %ebx   # RBX = 0
    cmpq %rcx, %rbx   # CF = (RCX != 0)
    adcb %bl, %al     # RAX = (RCX != 0)
    cmpq %rdx, %rbx   # CF = (RDX != 0)
    adcb %bl, %al     # RAX = (RCX != 0) + (RDX != 0)
    shrb $1, %al      # RAX = ((RCX != 0) + (RDX != 0)) >> 1
    

    现在 RAX == 1 RCX != 0 RDX != 0 ; 否则 RAX == 0

        3
  •  2
  •   pts    2 年前

    AND 说明)。