2015-09-26 18 views
8

私は 'call'ではなく 'jmp'を試して使用するように言われましたが、 'jmp'は私には好きではありません..ジャンプすると終了しません幸せな日ではない)、通常通りコールを返して終了する。アセンブリ 'call'と 'jmp'

「コール」を使用して満足していますが、実際には「jmp」を試して克服すべき理由はありますか?

このシンプルなコードは、私が 'jmp'のときに戻ったり出たりしないかどうかを示しています。

ありがとうございました。

_start: 

    jmp _Print 
    jmp _Exit 

ret 


_Exit: 

    ; normal exit 

ret 


_Print 

    ; print something 

ret 

も...それは何も

+3

これは、あいまいな、と非常に不明瞭である使用することができます。ここ

が行われたときに、他のラベルにジャンプの一例です。 JMPは(戻り値を押すことによって)スタックを設定しないので、 'ret'を実行すると、偽の戻りアドレスがスタックからポップされ、コードがジャンプします。あなたは 'jmp'で' call'を偽装することができますが、jmpを実行する前にスタック上のリターンアドレスを自分でプッシュする必要があります。どのアセンブラとどのOSをターゲットにしていますか? 16または32ビット? –

+0

私はあなたの質問がこれに似た答えを持っているかもしれないと思います:http://stackoverflow.com/a/28133370/3857942。 –

+0

'JMP 'を使って' CALL'をシミュレートすることで、 'CALL'と' RET'関数が一緒にどのように一緒になるかを教えるために学校で行われることを除いて、(この場合は) 'JMP'を使用する理由はありません'。スタックについても教えてくれます –

答えて

9

まあを変更した場合、私は単にjmp、まず、すべてのLinuxターミナルでこれを実行していることである(あなたがそれに与えるラベルに「ジャンプ」 callは、スタック内に返される位置(call命令の下位)、jmpのラベル、次にret命令のjmpに格納されています(プログラム命令としてのメモリアドレスはメモリに格納されます)上記のように、コール命令の下)。あなたが見ることができるようにそこに少しの違いがあります。 IMHO、私はそれが単にcall機能には良いと思うが、それはC++コンパイラーが関数で行うものなのだが、jmpを入力しなければならない場合は、次にpushの戻り値を確認するか、いくつかのコードを実行します。

_start: 



jmp _Print; 



_start_label: 



jmp _Exit; 

_Exit: 
; exit stuff goes here 

ret;  

_Print: 

;print stuff goes here 

jmp _start_label; 

またはあなただけの呼び出し:)

+0

それは間違いなく物事を上回っています!私は今週だけ組立を学び始めたので、このようなアドバイスを受けることは良いことです。 – user3502489

+0

問題ありません!私はそれが助けてうれしい! – nameGoesHere