2009-10-19 5 views
2

내가 어셈블리의 x86 16 비트에서 두 값을 테스트하고 값이 0보다 큰 경우 다음 점프하는 PROC를 호출하고, 그래서 나는이 같은 일을 오전 :어셈블리 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에서 TESTIT를 호출 한 MAIN 지점으로 되돌아갑니다. FOO에서 MAIN으로 JMP를 수행하고 싶지는 않습니다. TESTIT를 다시 호출하기 때문입니다. FOO 끝 부분에 RET을 넣으려고하면 명령 창이 깜박이는 커서로 멈 춥니 다.

참고 : 이것은 JG 대신 의사 op .IF ... .ENDIF을 사용하여 수행 할 수 있지만 백그라운드에서 일부 마법을 수행하는 의사 op없이 동일한 결과를 얻으려고합니다. 수동으로 달성하는 방법을 모르겠습니다. .

답변

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 
관련 문제