web-dev-qa-db-ja.com

アセンブリ 'call' vs 'jmp'

「call」ではなく「jmp」を使用するように言われましたが、「jmp」は私を好きではありません..正常。

「呼び出し」を使用して満足していますが、実際に「jmp」を試して克服しなければならない理由はありますか?

この単純なコードは、私がjmpのときに戻ることも終了することもないことを示しています。

_start:

    jmp _Print
    jmp _Exit

ret


_Exit:

    ; normal exit 

ret


_Print

    ; print something

ret

また..それが何かを変更する場合、私はこれをすべてLinux端末で実行しています。

14
user3502489

まず、jmpは、指定したラベル(プログラム命令がメモリに格納されているメモリアドレス)に単に「ジャンプ」しますが、callはその場所を格納しますスタック内の(call命令の下)、jmpラベルに戻り、ret命令で、jmpが元の場所に戻ります(上記のように、呼び出し命令の下に)保存されます。ご覧のとおり、少し違いがあります。私見、私はそれがc _ ++コンパイラが関数で行うことであるので、単にcall関数で良いと信じていますが、jmpが必要な場合は、それから、Push戻り位置または別のラベルを作成して、何らかのコードの実行が完了したら戻ります。

完了時に他のラベルにジャンプする例を次に示します。

_start:



 jmp _Print;



_start_label:



 jmp _Exit;

_Exit:
 ; exit stuff goes here

 ret;     

_Print:

;print stuff goes here

jmp _start_label;

または、単にcallを使用できます:)

26
nameGoesHere