2009-10-19 65 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