【问题标题】:How to use .if, .else, .elseif for x86 Assembly language如何在 x86 汇编语言中使用 .if、.else、.elseif
【发布时间】:2019-10-24 19:05:07
【问题描述】:

我在使用 Assembly 的 .if、.else 等语句时遇到了一些问题。

我的代码必须反转一个数字数组,并且它必须适用于不同的数据类型。我有一个 if 语句来检查数据的类型。如果它是 BYTE 类型,它将进入第一个 if 语句,如果是 WORD,它将进入下一个,如果是 DWORD,它将进入第三个。我的问题是编译器会为不会执行的代码块抛出错误。在当前代码中,我将数组设置为字节,因此它会为最后 2 个 if 语句块引发错误。请给我一些关于如何解决这个问题的建议。

numbers BYTE 10h, 20h, 30h, 40h, 50h, 60h, 70h, 80h, 90h

L1:

.if (ebx == 1) 
    mov al, numbers[esi]
    xchg al, numbers[edi]
    mov numbers[esi], al 
.elseif (ebx == 2) 
    mov ax, numbers[esi]
    xchg ax, numbers[edi]
    mov numbers[esi], ax 
.else 
    mov eax, numbers[esi]
    xchg eax, numbers[edi]
    mov numbers[esi], eax
.endif
add esi, (type_of_numbers)
sub edi, (type_of_numbers)

Loop L1

【问题讨论】:

  • 根据需要添加大小覆盖(BYTE PTR numbers[esi]WORD PTR ...DWORD PTR ...)。
  • 这是一个非常简单快捷的解决方案,效果很好。谢谢!

标签: assembly x86 masm masm32


【解决方案1】:

根据需要添加大小覆盖(BYTE PTR 数字[esi]、WORD PTR ...、DWORD PTR ...)。 ——迈克尔

【讨论】:

    【解决方案2】:

    .if / .elseif运行时 检查,而不是像 C #if / #else 这样的汇编时检查。这就是为什么所有块都必须正确组装的原因,即使它们与numbers 的类型不匹配。

    这看起来非常效率低下;你肯定知道numbers 在汇编时的类型,比如TYPE numbers,并且想要使用与该类型宽度匹配的访问吗?

    MASM 具有汇编时IFELSE(注意缺少.)用于基于常量的条件汇编。这将让您只组装与 numbers 声明匹配的块,因此不需要任何大小覆盖。

    How do you compare variable types in assembly? 并参见 https://msdn.microsoft.com/en-us/library/4bd8b239.aspx re: if MASM 中的指令。

    所以我认为你会做类似的事情

    IF       TYPE numbers == 1
       ... byte swap
    ELSEIF   TYPE numbers == 2 
       ... word swap
    ELSE
       ... dword swap
    ENDIF
    

    我不是 100% 确定您可以在 IF / ELSEIF 指令中使用 TYPE symbol


    (当然,如果您关心效率,则不会使用xchg [mem], reg,因为这是具有完整内存屏障的原子交换:不幸的是,它暗示了lock 前缀。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      相关资源
      最近更新 更多