2009-10-17 10 views
12

Próbuję znaleźć online korzystanie z funkcji języka asemblera "je". Czytam, że je oznacza skakać, jeśli jest równy i to jest dokładnie to, czego chcę. Jakie jest rzeczywiste użycie tej funkcji, lub innymi słowy, jak mogę wpisać tę funkcję, aby sprawdzić wartość i przeskoczyć, jeśli jest równa coś?Język złożenia je funkcja skoku

Proszę dać mi znać.

BTW, używam NASM, jeśli to robi różnicę.

Odpowiedz

16

Powiedzmy, że chcesz sprawdzić, czy EAX jest równa 5 i wykonywać różne działania na podstawie wyniku tego porównania . Innymi słowy, stwierdzenie "if".

; ... some code ... 

    cmp eax, 5 
    je .if_true 
    ; Code to run if comparison is false goes here. 
    jmp short .end_if 
.if_true: 
    ; Code to run if comparison is true goes here. 
.end_if: 

    ; ... some code ... 
+0

Jaka jest tu składnia asemblera? –

+0

To powinno być prawidłowe NASM, jeśli dobrze pamiętam. – bcat

+0

Czy może sprawdzić inny rejestr niż EAX? –

1

Cóż, w końcu znalazłem swoją odpowiedź. : P Zasadniczo nazywasz je label_to_jump_to po wywołaniu cmp.

Jeśli cmp pokazuje, że obie wartości są równe, je przeskoczy do określonej etykiety. Jeśli nie, spowoduje to, że wykonanie będzie płynne.

+4

Edsger Dijkstra musiał nienawidzić asemblera; jest pełen GOTO :-) –

+4

Nie musi być zgodny z instrukcją "CMP", chociaż jest to najczęstszy przypadek. Jak powiedzieli inni, instrukcje 'Jcc' mogą być zgodne z instrukcją, która ustawia' FLAGS'. Obejmuje to prawie wszystkie instrukcje arytmetyczne i kilka innych. – bcat

2

Zazwyczaj poprzedzasz je z cmp (lub test lub odpowiednikiem) zwykle, co ustawia flagę w rejestrze EFLAGS. Oto link dla prostego serwera echa w NASM, który może pomóc w ogóle. Zignoruj ​​irytujące reklamy Google.

Przykładem użycia może być dla je:

cmp eax, ebx 
    je RET_FAIL 
    jmp RET_SUCCESS 

RET_FAIL: 
    push 1 
    pop eax 
    ret 

RET_SUCCESS: 
    push 0 
    pop eax 
    ret 
+0

jeśli RET_SUCCESS pojawia się przed RET_FAIL, nie potrzebujesz drugiego skoku. – asveikau

+0

Dzięki, to był po prostu kopiowany makaron z zadania nieudanego ucznia. – mrduclaw

10

będzie to skok, jeśli „równe flaga” (znany również jako „zero flaga”) w rejestrze FLAGS jest ustawiony. Zostaje to ustawione w wyniku operacji arytmetycznych lub instrukcji takich jak TEST i CMP.

Na przykład: (jeśli mnie pamięć nie myli to prawo jest poprawna :-)

cmp eax, ebx ; Subtract EBX from EAX -- the result is discarded 
       ; but the FLAGS register is set according to the result. 
je .SomeLabel ; Jump to some label if the result is zero (ie. they are equal). 
       ; This is also the same instruction as "jz".
4

muszę powiedzieć je func jest sprawdzenie, czy flaga jest ustawiona zera, a następnie przejść do czegoś innego lub przejść do następnej instrukcji, które obserwuje.

test cx, cx 
je some_label 

Instrukcja testowa działa tylko bitowo ORAZ z dwóch argumentów i ustawia FLAG zgodnie z wynikiem AND. Instrukcja je następnie używa flagi ZERO, aby zdecydować się na skok lub kontynuować.

Powyższy kod służy do sprawdzania, czy cx ma wartość zero, czy nie.

  • Jeśli cx jest zero, test ustawi flagę zero, a następnie je spowoduje przeskok do pewnego miejsca;
  • Jeśli cx nie jest zerem, test nie ustawi flagi zerowej, je kontynuuje wykonywanie poniższej instrukcji.

UWAGA: je nie jest testem równym, ale przetestowaniem flagi ZERO, która została ustawiona przez niektóre instrukcje przed tym.