2009-10-19 61 views
2

我打電話一PROC組裝的x86 16位測試兩個值,然後跳轉如果該值大於零,所以我做這樣的事情:從彙編x86中的JMP返回?

TESTIT PROC 
    CMP AX,1 
    JG FOO 
    RET 
TESTIT ENDP 

FOO: 
    ;do something 
END FOO 

MAIN: 
    CALL TESTIT 
    .EXIT 
END MAIN 

END 

我的問題很簡單,我怎麼回從FOO返回到MAIN中稱爲TESTIT的點。我不想執行從FOO到MAIN的JMP,因爲這將再次調用TESTIT。 當我嘗試在FOO結尾處放置RET時,命令窗口被閃爍的光標卡住。

注意:我知道這可以通過使用僞操作.IF ... .ENDIF而不是JG來實現,但我想嘗試在沒有僞操作的情況下實現相同的結果,這在後臺執行一些魔術我不知道如何手動實現。

回答

8

FOO需要作爲子程序調用。爲此,請反轉跳轉的邏輯,然後使用CALL指令調用FOO。在FOO例程結束時放置RET指令。

TESTIT PROC 
    CMP AX,1 
    JLE BAR 
    CALL FOO 
BAR: 
    RET 
TESTIT ENDP 

FOO: 
    ;do something 
    RET 
END FOO 

MAIN: 
    CALL TESTIT 
    .EXIT 
END MAIN 

END