問題タブ [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++ - jitted 関数で stdout.write を呼び出す YASM アセンブリ
Just-In-Time コンパイラを作成しようとしていますが、動作させたくないコードがあります。私のプラットフォームは x86-64 ubuntu です。
yasm で次のコードを記述しました。
したがって、正しく理解できれば、これはA
stdout に書き込まれるはずです。今、私はこのコードをコンパイルします
これにより、次のマシンコードが生成されました。
次に、結果のコードを C++ で読み取り、次のように呼び出します。
C++ の部分は、単純な算術演算で既に試しており、うまく機能したので問題ないと思います。
とにかく、セグメンテーション違反はありません。コードは実行されているようですが、何も起こりません。stdout には何もありません。
何かアドバイス?
//編集:完全な C++ コード:
c++ - Cmake:YASM ソース ファイルのビルド
CMake 3.4.1 を使用して、Visual Studio 2013 64 ビット C++ ソリューションを生成およびビルドしています。プロジェクトの 1 つには、VisualStudio で yasm アセンブラーを lib としてコンパイルする .asm ファイルも含まれています。これらのファイルに yasm を使用するように CMake を構成するにはどうすればよいですか?設定方法の例を含むドキュメントは見つかりませんでした。
linux - 64 ビット アセンブリ: ld が 64 ビット システム コールではなく 32 ビット システム コールを使用するのはなぜですか?
64 ビット レジスタを使用し、(私が思うに) 適切なコマンドをアセンブルしてリンクしているにもかかわらず/usr/include/asm/unistd_32.h
、ではなくからのシステムコール番号を使用する必要があるのはなぜだろうと思っています。 unistd_64.h
ファイルhellow.asmは(64.hのものを使用すると機能しないため、32.hのように書き込みに4、終了に1を使用していることを認識しています。書き込みは1であり、 exit 60 を試してみましたが、結果はありませんでした。)
file
実行可能ファイルとオブジェクトファイルで次のように返されます。
オブジェクトファイル:ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
実行可能:ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
私/usr/include/unistd.h
は:
この投稿をここまで読んだなら、私の "hello world" プログラムが代わりに "hey you beauty" と言っている理由がわかるはずです: 私のコンピューターが、バーにいる汚れた老人のように私に話しかけてくるのが好きです。 .
linux - 作成したファイル名の末尾にある余分な文字
アセンブラーを学習しようとしていますが、このチュートリアルで問題が発生しています http://www.tutorialspoint.com/assembly_programming/assembly_file_management.htm
ファイルを書き出すときを除いて、うまく機能します。ではなく、myfile.txt
という名前になっていmyfile.txtWelcome to Tutorials PointWritten to file?
ます。
理由が分からないようです。チュートリアルからソースを削除しましたが、同じことを行います。
誰かが理由を教えてもらえますか?
nasm 2.12.02 を使用しています。yasm 1.2.0 でも試してみたので、アセンブラー コードが原因であると確信しています。
私は構築して実行していますOpenSUSE Linux 3.16.7-35-default #1 SMP Sun Feb 7 17:32:21 UTC 2016 (832c776) x86_64 x86_64 x86_64 GNU/Linux
c - コンパイル済みコードを NASM および MSVC とリンクする際の未解決の参照
アセンブリ ( でコンパイル) を/でyasm
コンパイルされたオブジェクトと結合しようとしています。これは、最終的な実行可能ファイルにリンクされている に ( で)リンクしようとしています。msvc
cl.exe
link.exe
.dll
ソースからオブジェクト ファイルを作成することも、これらのオブジェクトから dll を作成することも、まったく問題なく動作します。
最後のステップで、 を.dll
実行可能ファイルにリンクすると、次のエラーが発生します。
私はCを使用しています.Win64には名前マングリングがありませんが、複数のスキーム(_xxx_xxxx
またはなど__imp_xxx_xxxx
)を試しました。
オブジェクト ファイルを調べると、dumpbin.exe
すべてのシンボルが明らかになります。
しかし、からエクスポートされたシンボルにはありません.dll
:
.dll
を使用して、宣言を 内でエクスポートされたものとしてマークしましたが__declspec(dllexport)
。
リンカーを満足させ、シンボルが実際にそこにあることを彼に伝える方法はありますか?
assembly - gdb は、.bss 内のシンボルと .data 内のシンボルに対して異なる動作をします
最近、YASM を使用して Intel x86-64 アーキテクチャのアセンブリ言語を学び始めました。本で提案されているタスクの1つを解決しているときに(Ray Seyfarthによる)、次の問題に遭遇しました。
.bss セクションのバッファにいくつかの文字を配置すると、gdb でデバッグ中に空の文字列が表示されます。.data セクションのバッファに文字を配置すると、gdb で期待どおりに表示されます。
gdbで私は得る:
LINE 1: の後
x/s &buf
、結果 -0x7ffff7dd2740 <buf>: ""
行 2 の後:
x/s &str_test
、結果 -0x601030: "A"
が正しいアドレスに評価されていないように見える&buf
ため、まだすべてゼロが表示されます。0x7ffff7dd2740 は、その によると、デバッグ中のプロセスの BSS にない/proc/PID/maps
ため、意味がありません。 が間違ったアドレスに評価されるのに、正しいアドレスに評価されるのはなぜ&buf
&str_test
ですか? どちらも「グローバル」シンボルではありませんが、デバッグ情報を使用してビルドしました。
x86-64 Ubuntu 15.10 上の GNU gdb (Ubuntu 7.10-1ubuntu2) 7.10 でテスト済み。
で構築しています
nm
実行可能ファイルでは、正しいシンボル アドレスが表示されます。
(編集者注:奇妙さはOPのasmではなくgdbの動作にあるため、多くの質問を書き直しました!)。
assembly - アドレッシング モードと同じ式でアドレスを計算すると、gdb が BSS 配列の変更を表示しないのはなぜですか?
.bss セグメントに大きなバッファを持つ簡単なプログラムを作成
次に、配列セルの値をインクリメントしようとしました。
gdb では、3 番目の命令の実行前と実行後の両方で同じ値 (0) が表示されます。
保存したアドレスを調べようとすると、まだ 0 が表示されるのはなぜですか?
x86-64 - なぜゼロで埋めなかった
10000 ビットに割り当てられた配列 = 1250 バイト (10000/8):
ポインタをテストしました:
メモリが割り当てられました:
その割り当てられたメモリをゼロで埋めようとしました:
チェックされた最初のバイト:
チェックされた最後のバイト (0 - 最初のバイト、1249 - 最後のバイト)
解決した質問
入力する必要がありましたx/1c $rax + 1249