1

Pascal からこのコードを実行するにはどうすればよいですか :

               MOV EAX, variable1
               PUSH EBX, EAX
               MOV EAX, variable2
               POP EBX
               AND EBX, EAX

function(variable1, variable2) でメソッド/関数の引数を定義する場所。

これは学校の課題であり、Java/C++ などの代わりに Pascal/Assembly をやらせている理由がわかりません。

これは、これで助けが必要になる前に、私がたくさんの仕事をした割り当て全体ではありません。

4

3 に答える 3

1

明示的なアセンブリ コードを呼び出すには、基本的に 2 つの方法があります (Pascal だけでなく、任意の言語から)。

最初の方法は、アセンブリを独自のファイルに記述し、アセンブラでアセンブルすることです。次に、結果のオブジェクト ファイルをプログラムの残りの部分とリンクし、アセンブリ関数を呼び出すことができます。この方法では、コンパイラが使用する呼び出し規約を理解する必要があるため、すべてがリンク時と実行時に整列します。

2 番目の方法は、'インライン アセンブリ' を使用することです。これは、アセンブリ コードを通常の言語ソース ファイルに直接記述するためです。コンパイラ固有の機能を使用して、アセンブリ ブロックを宣言し、コンパイラで適切に動作させる必要があります。この方法を使用すると、コードを他のコンパイラに移植するのが難しくなりますが、システムの ABI/呼び出し規約を理解していなくても問題を解決できる場合があります。

于 2010-06-11T22:09:21.970 に答える
0

Pascal/Delphi で GJ の回答を詳しく説明するには、次のように全体をまとめることができます。

function TestAsmFunction (variable1, variable2: longword): longword; 
assembler; {<- this was neccesary in Turbo Pascal, but not in Delphi}
register; {<- it's the default calling convention anyway. So variable 1=EAX, variable2= EDX}
asm
MOV EAX, variable1        {actually unneccesary (= mov eax, eax)}
PUSH EBX                  
MOV EBX, variable2        {compiles to mov ebx, edx}
AND EAX, EBX              
POP EBX                   
end;                      {Return value is in EAX}
于 2010-06-19T11:42:38.653 に答える
0

一般に、外部プロシージャーまたは関数でのレジスター使用 (Borland pascal) の規則では、EDI、ESI、ESP、EBP、および EBX レジスターを保持する必要がありますが、EAX、ECX、および EDX レジスターは自由に変更できます。

したがって、asm コードは次のようになります。

MOV EAX, variable1        //EAX := variable1          
PUSH EBX                  //save EBX
MOV EBX, variable2        //EBX := variable2        
AND EAX, EBX              //store result to EAX
POP EBX                   //restore EBX

呼び出し規約に応じて、関数はレジスタまたはスタックを介して引数を返します。したがって、使用している呼び出し規約の種類を確認してください。

于 2010-06-12T08:19:20.520 に答える