如何在x86汇编语言中使用.if,.else,.elseif

问题描述 投票:0回答:2

我在汇编时使用.if,.else等语句时遇到麻烦。

我的代码必须在适当的地方反转数字数组,并且它必须适用于不同的数据类型。我有一个if语句来检查数据的类型。如果它是BYTE类型,它将进入第一个if语句,如果是WORD,它将通过下一个,如果是DWORD,它将进入第三个。我的问题是,编译器将为不会执行的代码块抛出错误。在当前代码中,我将数组设置为字节,因此,对于最后两个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
assembly x86 masm masm32
2个回答
1
投票

根据需要添加大小覆盖(BYTE PTR号[esi],WORD PTR ...,DWORD PTR ...)。 –迈克尔


0
投票

[.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:MASM中的if指令。


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

© www.soinside.com 2019 - 2024. All rights reserved.