問題タブ [yasm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - アセンブリから C で記述されたコードを呼び出す方法は?
解決済みの質問 リンカがリンク時にオブジェクトファイルでそれを見つけることができるように、メインシンボルをグローバルにする必要があります。コードを修正しました。
タスクを実行するときに、アセンブリ (YASM アセンブラー) から単純な C 関数を呼び出そうとしました:
C 関数を書きました:
呼び出しアセンブリ コードを書きました:
コンパイルされたアセンブリ:
コンパイルされた c コード:
両方のオブジェクト ファイルを単一の実行可能なバイナリ ファイルにリンクしようとしました:
得た:
コマンド/コードを修正して実行可能ファイルをビルドする方法について何か提案はありますか? はい、同様の質問を読みました(ただし、NASMアセンブラを使用しても解決策はありません)。
macos - x86_64 mach-o 形式で PAGEZERO に書き込む yasm
yasm アセンブラと ld リンカを使用するアセンブリ ブックに従っています。私は OSX 10.12 を使用しており、Mach-O 形式にアセンブルしようとしています。残念ながら、セグメンテーション違反が発生しています。これは元の .asm ファイルです。
私はそれをコンパイルします:
yasm -f macho64 -m amd64 -l メモリ.lst -o メモリ.o メモリ.asm
リンクします:
ld メモリ.o -o メモリ
lldb で実行すると、次のエラーが表示されます。
- スレッド #1: tid = 0xb3b4b、0x0000000000000001、停止理由 = EXC_BAD_ACCESS (コード = 1、アドレス = 0x1) フレーム #0: 0x0000000000000001 エラー: セクション __PAGEZERO からのデータ読み取りエラー
lldb で「ターゲット モジュール ダンプ セクション」を実行したところ、__PAGEZERO セグメントが次のように定義されていることがわかりました。
[0x0000000000000000-0x0000000000001000) --- メモリ.__PAGEZERO
clang でビルドされた通常の Mach-O バイナリを調べたところ、__PAGEZERO セグメントは次のようになっています。
[0x0000000000000000-0x0000000100000000) --- test.__PAGEZERO
その後、実際には PAGEZERO セグメントを作成するのはリンカーであることに気付きました。clang は「lld」と呼ばれる特別なリンカーを使用していると思います。私の質問は:
- PAGEZEROからの読み取りが原因で、実際に私のエラーが発生しましたか。
- その場合、リンカ (ld) に PAGEZERO を正しいサイズで定義するように指示できますか?
windows - yasm x86 アセンブリで構造体を初期化する
FindFirstFile および FindNextFile ウィンドウ関数で見つかったファイルに関する情報を格納する WIN32_FIND_DATA 構造を初期化しようとしています。問題は、yasm で stuct を初期化する方法がわからないことです。これが私のコードです:
私が得るエラーは次のとおりです。
assembly - アセンブリ ファイルのコンパイル時に再配置 R_x86_64_32 エラーを取得しています。別の VM ではなく、1 つの VM で動作する
コンソールから返された完全なエラーを以下に示します。VirtualBox と VMware で Lubuntu を使用しています (両方を試しました)。何らかの理由で、ラップトップでは機能しますが、デスクトップでは機能しません。多くのメッセージ フォーラムを通じて自分で調べてみたところ、自分のシステムの ld 自体に何か問題があるように思えますが、何が問題なのかを理解するのに十分なスキルがありません。「1つの終了ステータス」が失敗を意味することは知っていますが、それだけです。なぜ失敗するのかわかりません。あるマシンで実行され、他のマシンで実行されない場合、私のコードとは何の関係もありません。
私がプログラミングしている言語は、YASM コンパイラを使用したアセンブリです。コンパイル用のスクリプトは、エラー コードの下にリンクされています。
エラーコード:
コンパイル スクリプト:
上記のスクリプトは少し複雑ですが、以下のような単純なスクリプトも機能しないことに注意してください。
assembly - オブジェクトバイナリで不要なモジュールを除外するためのYASMのパラメータは何ですか?
yasm、ld、gccは不要な部分を除外できますか? C / C ++のようにgccが除外すると思います。
これらのコマンドでコンパイルおよびリンクします。
testSize1.o のサイズが testSize2.o より大きい。