3

Assembly を使用して 2 つの数値の GCD を取得し、私が見たチュートリアルで使用される例としてそれらを出力する単純な C++ プログラムを作成しています。それが何をしているのかは理解していますが、なぜそれが機能しないのか理解できません。編集:実行時に追加する必要がありますが、何も出力されません。

#include <iostream>
using namespace std;

int gcd(int a, int b)
{
int result;
_asm
{
    push ebp
    mov ebp, esp
    mov eax, a
    mov ebx, b
looptop:
    cmp eax, 0
    je goback
    cmp eax, ebx
    jge modulo
    xchg eax, ebx
modulo:
    idiv ebx
    mov eax, edx
    jmp looptop
goback:
    mov eax, ebx
    mov esp, ebp
    pop ebp

    mov result, edx
}

return result;
}

int main()
{
cout << gcd(46,90) << endl;
    return 0;
}

32ビットのWindowsシステムで実行しています。助けていただければ幸いです。コンパイルすると、4 つのエラーが発生します。

warning C4731: 'gcd' : frame pointer register 'ebp' modified by inline assembly code
warning C4731: 'gcd' : frame pointer register 'ebp' modified by inline assembly code
warning C4731: 'main' : frame pointer register 'ebp' modified by inline assembly code
warning C4731: 'main' : frame pointer register 'ebp' modified by inline assembly code
4

1 に答える 1

3

コンパイラは、関数の最初と最後にこれらまたは同等の命令を挿入します。

push ebp
mov ebp, esp
...
mov esp, ebp
pop ebp

それらを手動で追加すると、 を介して関数のパラメーターにアクセスできなくなりますebp。これが、コンパイラーが警告を発行する理由です。

これら 4 つの命令を削除します。

また、デバッガの使用を開始します。今日。

于 2012-10-16T10:49:39.997 に答える