C ++アセンブリ「RETN 10」[重複] -- c++ フィールド と assembly フィールド 関連 問題

C++ Assembly “RETN 10” [duplicate]












0
vote

問題

日本語

次の関数があります。

<事前> <コード> int __declspec() MyFunc(SOCKET sSocket, const char* sData, int sSize, int sFlag) { pSocket = sSocket; return send(sSocket,sData, sSize, sFlag); }

とここでコンパイル後のアセンブリコードは次のとおりです。

<事前> <コード> PUSH EBP MOV EBP,ESP PUSH DWORD PTR SS:[EBP+14] // Flags MOV EAX,DWORD PTR SS:[EBP+8] PUSH DWORD PTR SS:[EBP+10] // DataSize MOV DWORD PTR DS:[pSocket],EAX PUSH DWORD PTR SS:[EBP+C] // Data PUSH EAX // Socket CALL DWORD PTR DS:[<&WS2_32.#19_send>] // send POP EBP RETN

私の質問は次のとおりです。

  1. RETN またはまたは<コード>または<コード>または
  2. の違いはどうですか?< RETN 103
  3. 最後の RETN を変更する必要があります。<コード> RETN 10
  4. 、C ++コードにする必要がありますか?
英語

I have the following function :

int __declspec() MyFunc(SOCKET sSocket, const char* sData, int sSize, int sFlag) {     pSocket = sSocket;     return send(sSocket,sData, sSize, sFlag); } 

And here is its assembly code after compiling :

PUSH EBP MOV EBP,ESP PUSH DWORD PTR SS:[EBP+14]               // Flags MOV EAX,DWORD PTR SS:[EBP+8] PUSH DWORD PTR SS:[EBP+10]               // DataSize MOV DWORD PTR DS:[pSocket],EAX PUSH DWORD PTR SS:[EBP+C]                // Data PUSH EAX                                 // Socket CALL DWORD PTR DS:[<&WS2_32.#19_send>]   // send POP EBP RETN 

My questions are:

  1. Whats the difference between RETN, RETN 8 or RETN 10 ?
  2. I have to change the final RETN to RETN 10, what changes should I make to my C++ code ?
</div
     
       
       

回答リスト

1
 
vote
vote
ベストアンサー
 

最後のRETNをRETN 10に変更しなければならない、C ++コードにどのような変更を加える必要がありますか?

呼び出される前に呼び出された関数を取得するには(<コード> 9988777661 を使用して、または他の手段を介して)、 <コード> stdcall 呼び出し条約。

MicrosoftのC / C ++コンパイラを使用している場合は、 __ stdcall modifier 、

<事前> <コード> void __stdcall foo(int arg1, int arg2) { // ... }

GCCを使用している場合は、 stdcall属性:

<事前> <コード> void __attribute__ ((stdcall)) foo(int arg1, int arg2) { // ... }

もちろん<コード> #define <コード>として<コード> 99887667 として 99887667 をいくつか保存し、コードをより移植可能にします。

CygwinのGCCを使用して上記のような機能の編集結果は、次の組み立てをもたらす:

<事前> <コード> _foo@8: push ebp mov ebp, esp ... (omitted for brevity) leave ret 8
 

I have to change the final RETN to RETN 10, what changes should i make to my c++ code ?

To get the called function to clean up the stack before returning (using RET(N) imm, or through other means), make it use the stdcall calling convention.

If you're using Microsoft's C/C++ compiler you can achieve this by adding an __stdcall modifier, as in:

void __stdcall foo(int arg1, int arg2) {   // ... } 

If you're using GCC you can achieve this using the stdcall attribute:

void __attribute__ ((stdcall)) foo(int arg1, int arg2) {   // ... } 

You could of course #define __stdcall as __attribute__ ((stdcall)) to save yourself some typing, and make the code more portable.

Compiling a function like the above using GCC in Cygwin results in the following assembly:

_foo@8: push    ebp mov ebp, esp ... (omitted for brevity) leave ret 8 
</div
 
 

関連する質問

0  私のstdcallアセンブラコードはスタックをバランスを付けています  ( My stdcall assembler code is unbalancing the stack ) 
_addps関数はスタックを不正引きし、stdcallになることを目的としています。私はそれ以上の情報はありません、そしてこれは私の2番目のアセンブラコードだけです(私の最初の最初のものはCDECL関数呼び出しをシミュレートしたテスト.exeでした)。 <事...

7  アセンブリで学ぶための重要な概念  ( Key concepts to learn in assembly ) 
私はあなたが新しい言語を学ぶことから最も重要なことの1つが新しい言語を使う方法ではなく、あなたがそれから得た概念の知識ではありません。私はあなたが私の本当のプロジェクトのどれでもそれを使わないならば、私はあなたがアセンブリがどれほど重要かどうかを尋ねても役に立...

0  アセンブリx86でこのマクロを作成するのに手助けが必要です  ( I need help creating this macro in assembly x86 ) 
メモリ内の2つの符号なし数の128ビットの2つの符号なし数を追加し、メモリ内の合計をn(n = n + m)にするマクロ "add128 n、m"を作成する必要があります。 これを数時間働くようにしようとしています、そして私はそれをまったく働くことができません...

18  NETのアセンブラライブラリ、ランタイム変数文字列をインジェクションのマシンコードに組み立てる  ( Assembler library for net assembling runtime variable strings into machine cod ) 
C#を呼び出すことができるx86アセンブラとしてそのようなものはありますか? x86命令を文字列として渡すことができ、バイト配列を取得することができます。存在しない場合は、私は自分のものを作ることができますか? CLEAR - C#からのアセンブリコー...

0  選択並びにスワップアクセス違反を修正する方法  ( How to fix selection sort swap access violation ) 
現在アセンブリを学び、言語を使って基本的な並べ替えアルゴリズムを実装しようとしています。私はそれの論理を降ろしたのだと思いますが、それは障害にあるかもしれません。どちらの場合でも、選択ソートのスワップ部分を実行しようとすると、アクセス違反エラーが発生します。私...

1  アセンブリプログラムを実行できません  ( Unable to run assembly program ) 
80x86アセンブリ言語とコンピュータアーキテクチャの紹介の読みを始めました.NASMを使用しようとしていますが、第3章に示す最初の例を実行しようとしましたが、失敗しています。誰かが本を読み、例を実行しますか?...

120  `Testl` EAXに対してEAX?  ( Testl eax against eax ) 
私はいくつかのアセンブリを理解しようとしています。 アセンブリは次のように、<コード> testl 行:に興味があります。 <事前> <コード> 000319df 8b4508 movl 0x08(%ebp), %eax 000319e...

0  メモリ内の同じ場所に 'EM(関数)を維持  ( Keep em functions in the same place in memory ) 
私はDLLでフックしようとしているWindows用のC ++アプリケーションを構築しています(組み立てコード)。しかし、私は私が作ったコンソールアプリケーションのリバースエンジニアリングに問題があります。 関数アドレスを同じ場所に保持したいが、DLLを編集して...

20  現代のコンパイラはMMX / 3Dnow / SSEの指示を使用していますか?  ( How do modern compilers use mmx 3dnow sse instructions ) 
x86命令セット拡張機能を読んで、いくつかの非常に具体的な状況でのみ役立つように見えます(例:SSE3のHADDPD - (hardsdpd - doudle))。これらには、故意に設定される必要がある特定のレジスタレイアウトが必要です。またはその前に...

0  int 0x10から出力される奇妙な印刷文字列  ( Weird print string output from int 0x10 ) 
こんにちは私は、「こんにちは男はここにhello manを印刷しているカスタム作成割り込みを画面上に印刷します。誰かがなぜ私に言うことができますか?これがコードです <事前> <コード> [ORG 100h] jmp start message: dw ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有