2011-12-05 11 views
1

私は外部アセンブリ関数を呼び出すCプログラムを実行しています。学術目的のために、私はstrcatを実行しようとしています。 2つの文字列をchar *パラメータとしてアセンブリプログラムに渡します。私は、スタックにEBPをプッシュし、そのようEDXとEBXに文字列1と文字列2を割り当て、次のよう私のループは期待どおり実行されていません

mov edx, [ebp+8] 
mov ebx, [ebp+4] 

今残りは次のとおりです。

procStr1: 
    cmp BYTE PTR [edx], 0 
    jne readStr1 
procStr2: 
    cmp BYTE PTR [ebx], 0 
    jne readStr2 
    jmp bottom 
readStr1: 
    inc edx 
    jmp procStr1 
readStr2: 
    mov BYTE PTR [edx], 'a' 
    inc edx 
    inc ebx 
    jmp procStr2 

bottom: 
    inc edx 
    mov BYTE PTR [edx], 0 
    pop ebx 
    pop edx 
    pop ebp 
    ret 

私は単にそれを追加することによって動作するかどうかを確認するためにテストしていaはstring1の最後までです。私が 'hi'と 'bye'と入力すると、Cプログラムで文字列1を印刷してhiaaaを印刷します。代わりに、私はstring1の後に通常13のaを取得します。上部に

push ebp 
mov ebp, esp 

:私は

答えて

3

は、あなたがしました...それは本当に私の心を遠くされ、任意の入力をお願い申し上げますか!

bottom: 
    inc edx  ; This inc should be removed -- edx already points one 
        ; byte beyond the ultimate copied byte. 
    mov BYTE PTR [edx], 0 
+0

1のデータ処理はので、私は疑うそれだけだ(つまり 'INC edx'を除く)正常に見える、また

mov edx, [ebp+8] mov ebx, [ebp+Ch] ; 0xC, not 4 -- C-language passes args right-to-left 

もしそうなら、あなたの引数は、今で発見されていますこれらのポインタを正しい場所から取得する問題 – Martin

+0

Visual Studioでコンパイルするときに[ebp + C]を実行すると文法エラーが発生します。そして右から左には、第2パラメータが最初にスタックにプッシュされることを意味しますか? – Rythven

+0

投稿を編集しました.Cは16進数であるため、12(Cの値)を使用するか、hを追加します。アイデアは正しいですが、構文エラーです。右から左の場合は、第2パラメータが第1パラメータの前にプッシュされることを意味します。これはCの呼び出し規約であり、可変数の引数が可能です。 –

関連する問題