2016-04-19 7 views
0

私は./mainに渡されたパラメータの数を出力する次のコードを持っています。 rodataセクションのfmtに注目してください。私はちょうどCのように、代わりに新しい行を印刷する、新しい行\nを含めました、それは印刷します。パラメータのアセンブリ:printf新しい行を印刷しません

数:1 \ nは

私のコードは次のとおりです。

;main.asm 
GLOBAL main 
EXTERN printf 

section .rodata: 
fmt db "Number of parameters: %d \n", 0 

section .text: 

main: 

    push ebp 
    mov ebp, esp ;stackframe 

    push dword[ebp+8]  ;prepara los parametros para printf 
    push fmt 
    call printf 
    add esp, 2*4 

    mov eax, 0  ;return value 

    leave   ;desarmado del stack frame 
    ret 

は、私は、以下を含む10 fmtで「...ナンバー」0の前後には、それを印刷することを知っているが、私はprintfがそれをやりたいです。 NASMでコードを組み立て、GCCでリンクして、実行可能ファイルを作成します。

+1

あなたはそのようなアセンブラコードを "コンパイル"せず、_assembler_を使用します。そして、結果のオブジェクトファイルを "コンパイル"せず、_link_します。とにかく、これはgccに関連せず、C言語ではありません。無関係のタグを追加しないでください。 – Olaf

答えて

4

あなたはNASM内の文字列の前後に引用符または二重引用符を使用する場合、それはCスタイルのエスケープシーケンスを受け付けません。

fmt db "Number of parameters: %d", 10, 0 

選択肢があります:Linuxでは、あなたはこのようなASCII 10として\nをエンコードすることができます。 NASMは、NASMの間の文字をCスタイルのエスケープシーケンスとして処理するバッククォート(バッククォート)をサポートしています。これは、同様に動作するはずです:

fmt db `Number of parameters: %d \n`, 0 

に注意してください:これらは、単一引用符ではなく、バッククォート。これはNASM documentationで説明されています

3.4.2文字列

文字列は単一引用符(「...」)のいずれかで囲まれた、最大8つの文字で構成され、二重引用符(」.. ")またはバッククォート(...)。一重引用符または二重引用符はNASMに相当します(ただし、一重引用符で定数を囲むと二重引用符で囲まれ、その逆も可能です)。それらの内容はそのまま表現されます。 逆引用符で囲まれた文字列は、特殊文字のCスタイル・エスケープをサポートします

+0

YASMのNASM構文はバッククォートで引用された文字列リテラルをサポートしていないことに注意してください。私はYASMがエスケープシーケンスで文字列定数を書く方法を持っているとは思わない。これは、ヤスムだけでなく、公式の鼻自体を気にする場合にのみ重要です。 –

+0

@PeterCordes:最後の段落の最初の質問は_NASM_と答えました。私の答えは_NASM_です。もし私が_YASM_を指していたら、私はそのように言ったでしょう。 _YASM_は_NASM_と同じ方法で_TASM_が_MASM_ではありません。質問がGAS、YASM、MASM構文(および他の亜種、いくつかの特徴を共有し、他のものを共有していないもの)に関するものであれば、私はそれらをカバーした答えを提示したでしょう。市場のすべてのアセンブラをカバーする回答を作成したいと思っていれば、私のゲストは変種です。 –

+0

私はあなたの答えが不完全であると主張していなかったか、あなたがそれを言及していたはずです。私はちょうどそれがYASMがNASM構文とほぼ完全に互換性があるので興味深い追加だと思った。 –

3

アセンブラはCではありません。Cコンパイラは\ nをASCII 10のエスケープコードとして認識します。アセンブラは\ nを2文字として扱いません。あなたが説明するように10を追加します。

関連する問題