問題タブ [nasm]
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.
com - x86アセンブリでのCOMオブジェクトvtableの構築
NASMを使用してx86アセンブリでCOMオブジェクトを構築しています。私はCOMを非常によく理解しており、x86アセンブリをかなりよく理解していますが、2つをメッシュ化すると、ハングアップします...(ちなみに、x86アセンブリの使用を思いとどまらせることを考えている場合は、ご遠慮ください。これをx86アセンブリで構築するのには特別な理由があります!)
COMオブジェクトで使用するvtableを作成しようとしていますが、関数への実際のポインターではなく、奇妙なポインターを取得し続けています。(相対的なオフセットを取得しているか、NASMが一時的な値をそこに埋め込んでおり、リンク中に実際の値に置き換えられていないと考えています)
私が構築しようとしている現在のインターフェースは、IClassFactory
次のようなコードのインターフェースです。
注:これはすべてのコードではありません。別のファイルにDllGetClassObject、DllMainなどがあります。
しかし、(NASM:を使用して)アセンブルして(nasm -f win32 comobject.asm
MS Link:を使用して)リンクlink /dll /subsystem:windows /out:comobject.dll comobject.obj
し、OllyDbgを使用して実行可能ファイルを調べると、vtableに奇妙な値が表示されます。たとえば、前回のビルドでは、関数の実際のアドレスは次のとおりです。
- QueryInterface-0x00381012
- AddRef-0x0038101A
- リリース-0x00381020
- CreateInstance-0x00381026
- LockServer-0x0038102E
しかし、vtableは次の値で出てきました:
- QueryInterface-0x00F51012
- AddRef-0x00F5101A
- リリース-0x00F51020
- CreateInstance-0x00F51026
- LockServer-0x00F5102E
これらの値はひどく疑わしいように見えます...ほとんど移転が行われなかったように。また、vtableは0x00F5104Aとして出力され、これらはすべてアクセスできないメモリアドレスです。(情報提供の目的で、これらの値は毎回異なります)
Visual Studio 2010Expressを使用してC++で同じことを試してみましたが、すべてうまくいきました。だから私はそれが私のアセンブリに欠けているものだと思います...
これらの値が適切に出力されない理由を誰かが私に指摘できますか?
linux - アセンブリ内のファイルからの読み取り
Linux環境でアセンブリ--x86を学習しようとしています。私が見つけることができる最も有用なチュートリアルは、NASMで便利なプログラムを書くことです。私が自分で設定しているタスクは単純です。ファイルを読み取り、それをstdoutに書き込みます。
これは私が持っているものです:
ここでの重大な問題は、チュートリアルでバッファ、bufsize
変数、または実際に変数を作成する方法についてまったく言及されていないことです。
どうすればよいですか?
(余談ですが、少なくとも1時間検索した後、アセンブリを学習するためのリソースの質が低いことに漠然と愕然としました。ドキュメントがネット上で取引されている伝聞だけである場合、いったいどのようなコンピューターが実行されますか?)
assembly - アセンブラのSegFaults?しかし、それは不可能です!:O
さて、私たち全員がC / C ++プログラマーが一度に私たちのタイムリーでない敵、悪魔のような信号SIGSEGV、セグメンテーション違反に遭遇したことを理解しています。さて、これは(過去形を強調して)魔法のGCC(またはg ++)コンパイラーによって吐き出されたマシンコードの一部内のフェイルセーフ/チェックシステムの形式であると理解しました。
だが!今日、私は仮想化されたArch Linuxシステム上で古き良きNASMを備えたx86アセンブラーをいじくり回していましたが、驚いたことに、そして残念なことに、悪意のあるSegFaultによってコーディング作業が再び妨げられました。
恐ろしい信号を生成したコードは次のとおりです。
Linuxカーネルがアセンブルされたプログラムをシェルにロードし、そこから実行することを理解しましたが、このMOV命令はプロセッサと1対1で相互作用すると思いました。カーネルは、私がアクセスしようとしていることをカーネルがどのように検出できるのでしょうか。少しのメモリで、命令を停止しますか?
プログラムがシェルにロードされたときに正確に何が起こるか、シェルに一度持っている権限、さらにはシェルとは何か、またはそれがどのように機能するかを理解するふりはしませんが、ASMがあなたに与えたと確信していましたプロセッサを完全に制御します。この魔法のカーネルは、プロセッサへの直接コマンドをどのように妨害しますか。また、本質的に純粋なマシンコードを作成するときに、このオペレーティングシステムコマンドのチェーンを実行しなければならないのはなぜですか。:O
assembly - ORG アセンブリ命令は何をしますか?
ORGディレクティブについての包括的な説明を誰か教えてもらえますか?
アセンブリで記述されたアプリケーションでいつ、なぜ使用されるのですか?
x86 または AMD64 で Nasm を使用する。
nasm - nasmでコンピューターをシャットダウンする
nasm からコンピューターへの電源をシャットダウンまたは停止することは可能ですか (違いはありますか?)。これを使用して再起動できることはわかっています:
シャットダウンに相当するものはありますか?16ビットOSを自作しています。
nasm - .asm をアセンブルする場合、同じ構文に逆アセンブルできますか?
hello! を出力する単純な nasm プログラムがあるとします。もちろん intel 構文で、(-f elf を使用して) アセンブルし、ndisasm を使用して逆アセンブルすると、まったく異なります! hello world プログラムと同じ単純な形式に逆アセンブルできないのはなぜですか? できませんか?
x86-64 - movlpsのNASM64ビットイミディエートアドレスは「dwordデータが境界を超えています」
64ビット幅のイミディエートアドレスを持つ命令movlpsが必要です。これは、Intelのマニュアルによると完全に可能であるはずです。だから、このようなもの:
しかし、私が得たのは、NASMがオペランドサイズを32ビットに切り捨て、対応する警告を出力することだけです。
さまざまな形式のqwordプレフィックスを試しましたが、成功しませんでした。
assembly - なぜこれが無効なオペランドなのですか?
私が書いているコンパイラによって生成された次のASMファイルがあります。
コンパイルしようとすると、次のエラーが発生します。
test.asm:16:エラー:オペコードとオペランドの組み合わせが無効です
test.asm:19:エラー:オペコードとオペランドの組み合わせが無効です
test.asm:29:エラー:オペコードとオペランドの組み合わせが無効です
NASMのドキュメントによると、次のことが許可されているため、これは実際には意味がありません。
MOV mem_offs、reg_eax 386
なぜこの操作を実行できないのですか?
assembly - OSに依存しない方法で文字列を出力するには?
OS に依存しない方法で文字列を出力しようとしています。たとえば、プログラムは Windows でも *nix と同じように実行する必要があります。
これは可能ですか?基礎となるアーキテクチャは同じ(x86)であるため、メソッドは同じであると想定しています。割り込みを呼び出すのと同じくらい簡単ですか?
この理由は、アセンブリ コードを生成するコンパイラを作成しようとしているためです。開発の初期段階では、ほんの一握りの機能しかありません。生成されたアセンブリ コードを Windows または Windows でテストできるようにしたいと考えています。または* nix。将来的には、同じコードを生成しながらプラットフォーム中立性を維持することは不可能になりますが、基本的にこの時点でやりたいことは、文字列を出力することだけです。
memory - 32 ビット アセンブラを使用してメモリを変更できない
NASM を使用してアセンブラ コードをアセンブルしています。組み立てたコードは次のようになります。
別のコードに問題があり、メモリを変更できないことに気付いたので、実際にそうであるかどうかをテストするためにこのコードを書きました。そうだった!アセンブルしたマシン コードをフロッピーの最初のセクタにコピーすると、プログラムが実行されました (MS VirtualPC を使用しました)。Virtual PC に割り当てられた RAM メモリを確認し、4 8 15 16 23 42 という数字を検索して、バイナリ コードがコピーされた場所を見つけました。データの最初のバイトは変更されていません。なぜそうなのですか?