2017-03-14 9 views
1

조건부 결정을 내리고 그 결과에 따라 함수를 호출하는 방법이 있는지 알고 싶습니다.어셈블리의 같은 줄에 점프 및 호출

예를 들면. 나는 뭔가를 비교하고 싶다. 그들이 짝수이면 함수 호출을하고 싶습니다. 그러나 필자는 필자의 함수를 작성한 방법으로 함수를 호출하고 점프하지 않아야한다. (내 함수가 스택을 처리하는 방식에 따라) 그렇게 할 수있는 방법이 있습니까? 표시된대로 코드를 복사 했으므로 컴파일되지 않습니다. NASM을 사용

.endOfForLoop: cmp dword [ebp - 4], 1 ; compares the boolean to one 
je call print_prime ; if it is one then prime needs to be printed 
jmp call print_not_prime ; otherwise it is not prime 

, 86 32 비트 어셈블리, 리눅스, 인텔

+0

점프와 통화는 상호 배타적이며 두 가지 모두 함께 표시되지 않습니다. –

답변

1

당신이 경우 - 당시 다른 구현 것처럼 그냥 함수 호출 주위에 뛰어 :

.endOfForLoop: 
    cmp dword [ebp-4],1 
    jne .not_prime 
    call print_prime 
    jmp .endif 
.not_prime: 
    call print_not_prime 
.endif: 

당신은 수를 또한 함수 포인터와 cmov 명령어를 사용하여 코드를 분기하지 않도록하십시오. 그러나 내가 알고있는 모든 분기 예측자가 간접적 인 점프를 전혀 예측하지 않으므로 실제로는 이해하기 어렵고 실제로 더 빠르기 때문에 이와 같은 코드를 작성하는 것이 좋습니다.

.endOfForLoop: 
    cmp dword [ebp-4],1 
    mov eax,print_prime 
    mov ebx,print_not_prime 
    cmovne eax,ebx 
    call eax 
+0

@frillybob, 통화 후 아무 것도하고 있지 않다면 대신 통화 대상으로 jmp를 보낼 수 있습니다. 그 호출에서 돌아 오는 호출은 점프 루틴에서 호출자에게 반환되어 호출 - 호출 쌍을 저장합니다. – Johan