1

外部アセンブリ関数を呼び出す C プログラムを実行しています。学術的な目的で、私は を実行しようとしていますstrcat。2 つの文字列をアセンブリ プログラムに char * パラメーターとして渡します。ebp をスタックにプッシュし、次のように string1 と string2 を edx と ebx に割り当てます。

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

string1 の末尾に a を追加して、機能するかどうかをテストしているだけです。'hi' と 'bye' を入力すると、C プログラムによって (文字列 1 を出力することによって) hiaaa が出力されることを期待します。代わりに、string2 がどんなに大きくても、通常は string1 の後に 13 個の a を取得します。ご意見をいただければ幸いです。本当に頭がおかしくなりそうです..

4

1 に答える 1

3

次のことを行いましたか:

push ebp
mov ebp, esp

頂点で?

その場合、引数は次の場所にあります。

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

また、

bottom:
    inc edx       ; This inc should be removed -- edx already points one
                  ; byte beyond the ultimate copied byte.
    mov BYTE PTR [edx], 0
于 2011-12-05T23:28:04.953 に答える