2012-12-22 24 views
2

在Visual C的__asm中,我想跳轉到存儲在寄存器中的位置,但它似乎不適用於條件跳轉,例如, JAE。通常這工作正常(如果您使用標籤)。如何在沒有*標籤的asm *中實現條件跳轉?

lea ecx, 0x0000001f[edx] 
     ;jmp ecx  ;ok 
     ;jae EXIT_LOOP ;ok 
     jae ecx  ; not ok "improper operand type" 

有沒有辦法做一個jae與寄存器(或堆棧)可變用Visual C __asm?也許有不同的方式來解決這個問題(有條件跳轉號碼,而不是標籤,在編譯時已知)?

回答

5

也許這是因爲x86上沒有這樣的操作碼:除了標籤外,您不能使用條件跳轉。你可能想:

... 
jb skip 
jmp ecx 
skip:... 

[編輯添加的標籤更少版]

這是醜陋,有點違背了使用ASM(即性能)的一個目標:注意,JB(下跳)相當於JC(跳進)。設A是跳轉到地址,如果AE和B是地址,如果B:

... 
sbb eax,eax,0 // propagate carry flag into register; eax == 0 or -1 
and eax,B-A  // eax = 0 or B-A 
add eax,A  // eax = A or B 
jmp eax 

你仍然需要找出你想要去的地址...

更復雜的技巧,如果你想使用其他標誌。您需要使用lahf或pushf指令將標誌置於可處理的位置。

呃。

+1

爲了澄清,一般問題是沒有使用標籤的條件JMP *。看來你給出的答案使用了一個標籤。即使沒有這樣的操作碼,你是否可以提供另一種解決方案,即不需要標籤? –