2017-09-02 8 views
3

私はアセンブリー(x86、linux)から始めて楽しいものです。私は上記のコードを持つ2つの問題を抱えている条件ジャンプが行われていません

section .text 
    global _start 

_start: 
    pop ebx  ;argc 
    dec ebx 
    test ebx,1 
    jne print_string 
exit: 
    mov ebx,0 
    mov eax,0 
    int 0x80 

print_string: 
    mov edx,len 
    mov ecx,msg 
    mov ebx,1 
    mov eax,4 
    int 0x80 
    call exit 

section .data 
msg db "Ok, no arg was passed",0xa 
len equ $ - msg 

を:これはちょうど私がコマンドラインからの引数を渡されていない場合、それはメッセージを出力し、それが後に終了かどうかを確認する私の非常に最初の小さなプログラムであり、 :

  1. jneは取得されません。私はdecの後にebxが0x00と等しいことをgdbで確認しましたが、test命令ではEFLAGSは変更されません。
  2. exit syscallが終了しません。 print_string終了を呼び出しているとは何度も何度もをprint_stringそこに行くように、代わりに出て行くの私はちょうど、私のメッセージは、無限ループに印刷されました。

ここで何が起こっているのですか?また、コードに関する他の勧告も歓迎されます。ありがとう。

+4

'test'は、あなたが何を考え実行しません。 'cmp'が必要です。また、あなたは 'je'ではなく' jne'を望みます。 'exit'のシステムコール番号は0ではなく1です。 – Jester

+0

これは正常です。私はより良い情報源を読む必要があると思われる。あなたがジャンプやcmpのための良いリファレンスを投稿することに興味があるなら、私はそれを正しいものとしてマークすることを嬉しく思います... – roirodriguez

+1

"x86命令テスト"のような通常google検索は、HTMLバージョンの命令の1つにつながりますリファレンスガイド、[http://x86.renejeschke.de/](http://x86.renejeschke.de/)と同様のものです。時にはそれらには小さな不正確さが含まれていることがありますが、通常、何かが期待どおりに機能していないかどうかをチェックするのはデバッガと一緒です。デバッガが短くなったバージョンが間違っていることを証明したときだけ、正式なインテルのドキュメント(インテルのWeb上で自由に入手可能なpdf)を掘り下げたり、いくつかのクイックリファレンスをクロスチェックしてください。 ASMのプログラミングでは、両方を使用することが不可欠です:debugger + docs – Ped7g

答えて

2

命令は、レジスタオペランドを変更せずにビット単位でandを実行します。
test ebx,1は、実行:flags = (ebx and 1)です。またはZF = IsEven(ebx)

ebx = 1であるかどうかをテストする場合は、cmpを使用する必要があります。
cmpは、レジスタのオペランドを変更せずに減算を実行します。

cmp ebx,1flags = ebx - 1またはZF = (ebx = 1)を実行します。あなたはexit()の間違ったパラメータを持っている

システムコール出口

正しいコードは次のとおりです。

exit: 
    mov ebx,0 
    mov eax,1 <<-- 
    int 0x80 
関連する問題