2016-05-03 7 views
2

プロシージャに3つのパラメータを渡して追加し、MASMの税務登録に戻そうとしています。しかし、結果はランダムな巨大な数でオフになっています。私は3つの変数を関数に渡しているCスタイルの呼び出し規約を使用しようとしています。私は間違って何をしていますか?ここに私のコードは次のとおりです。あなたのサブルーチン本体MASMのプロシージャにスタックを介してパラメータを渡す

INCLUDE PCMAC.INC 


.MODEL SMALL 
.586 
.STACK 100h 
.DATA 

.CODE 
     EXTRN GetDec :NEAR, PutDDec : NEAR, PutHex : NEAR 
Main PROC 
     _Begin 
     push 10 
     push 20 
     push 30 

     call Test1 


     call PutDDec 
     add esp, 12 

     _Exit 
Main ENDP 
Test1 PROC 
    ; *** Standard subroutine prologue *** 
    push ebp 
    mov ebp, esp 
    sub esp, 4 
    push edi 
    push esi 

    ; *** Subroutine Body *** 

    mov eax, [ebp+8] ; parameter 1/character 
    mov esi, [ebp+12] ; parameter 2/width 
    mov edi, [ebp+16] ; parameter 3/height 

    mov [ebp-4], edi 
    add [ebp-4], esi 
    add eax, [ebp-8] 
    add eax, [ebp-4] 

    ; *** Standard subroutine epilogue *** 
    pop esi ; Recover register values 
    pop edi 
    mov esp, ebp ; Deallocate local variables 
    pop ebp ; Restore the caller’s base pointer value 

    ret 
Test1 ENDP 
End Main 

答えて

3

私は間違っていますか?

あなたはコードをコメントしていないし、デバッガを使用していません。

mov [ebp-4], edi 
add [ebp-4], esi 
add eax, [ebp-8] ; <---- what is this ebp-8 here? 
add eax, [ebp-4] 

3つの数字を追加するには、2つの追加が必要です。なぜ3つありますか? また、あなたも、あなただけ行うことができ、ローカル変数を使用する必要はありません。

push ebp 
mov ebp, esp 

mov eax, [ebp+8] ; parameter 1/character 
add eax, [ebp+12] ; parameter 2/width 
add eax, [ebp+16] ; parameter 3/height 

mov esp, ebp ; Deallocate local variables 
pop ebp ; Restore the caller’s base pointer value 

ret 

または、あなたはちょうどそのスタックフレームを必要としない場合:

mov eax, [esp+4] 
add eax, [esp+8] 
add eax, [esp+12] 
ret 
+0

ありがとうございます。私が "Call PutDDec"と呼ぶと、その結果は加算されません。あなたはこの理由を知っていますか?ありがとう – user190494

+0

'PutDDec'がどのように引数を期待しているのか分かりません。 'Call PutDDec'の前に' mov [esp]、eax'を追加すると試してみる価値があります。 – Jester

+0

PutDDecはEAXレジスタの小数点版を出力します – user190494

0

、三つのパラメータの合計は次のように行うことができる:

mov [ebp-4], edi ;Move EDI into your local var 
add [ebp-4], esi ;Add ESI into your local var 
add eax, [ebp-4] ;Finally, add the contents of your local var into EAX 
        ;(note that EAX contains first param) 

あなたのミスが[ebp-8]にありました。

Jesterがもっと徹底的な答えで指摘したように、実際には和を行うためにローカル変数は必要ありません。

0

私ができました私は基本的なポインタのax部分を使ってプログラムを動かすために、DWではなく2つのDBを押していたので:

INCLUDE PCMAC.INC 


.MODEL SMALL 
.586 
.STACK 100h 
.DATA 
sum DWORD ? 

.CODE 
     EXTRN GetDec :NEAR, PutDec : NEAR, PutHex : NEAR 
Main PROC 
     _Begin 
     push 10 
     push 20 

     call Test12 
     ;and eax, 0ffffh 

     call PutDec 

     _Exit 
Main ENDP 
Test12 PROC 
    push bp 
    mov bp, sp 

    mov ax, [bp+6] ; 
    add ax, [bp+4] ; 

    pop bp 
    ret 4 
Test12 ENDP 
End Main 
+1

私の関数として、[ESP + 12] RETを' EAXを追加[ESP + 8] 、EAXを追加し、 'のMOV EAXを以下のい。それは、あなたの他の/後の質問に属します: "MASM:参照によって値を渡す方法"。また、あなた自身の答えを受け入れることは非常にうれしくありません。同時に、ジェスターがあなたを助けました! –