.dataの代わりに.codeセクションに変数を作成する方法はありますか?私は、ただちに変数を作ることができないという点で、限られていると感じています。アセンブラの変数を.code(MASM)に定義する
答えて
あなたが求めているように聞こえますが、実行時にスペースを動的に割り当てることができます。答えは「はい」であり、最も一般的な方法の1つです。
int Func()
{
int Distance;
Distance = 132;
}
アセンブリでは、これは
push rbp
mov rbp, rsp
sub rsp, 8 Now RSP points to what is essentially Distance
mov dword [rbp-8], 132
別の値を@記憶することができるようになり[RBP-4]はダブルワードは4バイトのみを必要とします。
スペースを割り当てるにはいくつかの方法があります。必要なものを具体的に変更してから、自分または他の誰かがそれに基づいて例を挙げることができます。
私はあなたがこのようにそれを使用することができ、スタック上にある特定の変数のアドレスを保存し、このように、このマクロを使用して、他のアセンブラのために知っているが、TASMで、イムいけない
@pushsz macro msg2psh, empty
local next_instr
ifnb <empty>
%out too many arguments in macro '@pushsz'
.err
endif
call next_instr ; pushes the address of the message as the return address
db msg2psh,0
next_instr:
endm
:
push 0
@pushsz "hello world"
@pushsz "some text"
push 0
call MessageBoxA
ご覧のとおり、文字列は命令とともにエンコードされますが、文字列だけでなく他のタイプも使用できますが、この手法ではスタックを変更することに注意してください(上記のstdcallの例を参照してください) 、使用後にスタックをポップオフするかスタックを復元する必要があります。
もう1つのことは、メモリの読み込み/書き込みアクセスです。メモリが書き込み可能でなく、その中に何かを保存すると、例外が発生します。与えられたマクロは、ここで、データが読み取り専用されていると仮定し、別の例です:私は場合MASMマクロ構文のためにこれを変換することなく、MASMユーザー申し訳ありませんが、私はここにhttps://vxheaven.org/29a/29a-2/29a-2.3_3
これは、文字列のアドレスをリターンアドレスとしてプッシュするための 'call'の恐ろしい乱用です。これは、[不一致のコール/レットがリターンアドレスプレディクタスタックを破損するため、現代のCPUでひどく動作します。](http://stackoverflow.com/questions/22442766/return-address-prediction-stack-buffer-vs-stack-ストアドリターンアドレス)。 –
'.rodata'セクションにメッセージを置いて、そのアドレスを普通に' push 'するほうがずっと良いでしょう。 1つのマクロでこれをすべて実行することもできます( 'section .rodata'に切り替え、dbを文字列に変換し、前のセクションに戻します)。リンカーは、すべての文字列を読み取り専用のデータセクションに集め、データを途切れることなくコードに残します。 –
私はあなたがDOSの例からそのトリックを持っているのを見ます。コードサイズだけが重要なことは興味深い考えです。しかし、L1 CPUを分割したものであれば、Dキャッシュ内の文字列を保持し、何かが文字列を読み込んだときにIキャッシュを保持する必要があるため、古いCPUでもパフォーマンスが疑わしい。また、レジスターの代わりにスタックにargsが渡される、悪い古いABIでも役に立ちます。これは、286年または386年の時代のCPUのための素晴らしいアイデアだが、今は良い考えではない。 –
- 1. MASMでバイナリ文字列変数を定義する方法は?
- 2. 方法MASMに2つのfloatの変数を乗算する方法MASM
- 3. アセンブラの数字をintに変換
- 4. IDE「Visual MASM」と「Easy Code」の違いは?
- 5. GCCで別のアセンブラ(MASM、NASM、TASMなど)を使用しています
- 6. 定数のMasmビット単位の演算
- 7. 変数を定義する
- 8. ARMアセンブラの浮動小数点変数
- 9. スカラ関数変数:デフォルト値を使用する(関数定義または変数定義で定義する)
- 10. 変数の定義
- 11. Iは<code>result</code>変数介し<code>main</code>にアセンブラからいくつかのデータを渡したいC
- 12. MASM - キーワードと同じ名前のプロシージャを定義する方法は?
- 13. インクルードで定義(変数を定義する)の使用方法
- 14. 変数を定義する際のエラー
- 15. TypeScriptのデバッグ変数を定義する
- 16. "get"時にはCodeigniterの未定義変数 "get_where"時には未定義変数
- 17. Notice:定義済みの変数に未定義の定数を使用
- 18. このシンボルをmasmで定義できないのはなぜですか?
- 19. 目的C - プロパティを定義する際にインスタンス変数を定義する
- 20. SQLPlus変数定義
- 21. AMPL変数定義
- 22. SAS - 警告を生成せずに未定義のマクロ変数を含むマクロ変数を定義する
- 23. stdafx.cppの変数の定義
- 24. デザインガイドライン:変数を定義する場所
- 25. app.config内で変数を定義する
- 26. sageで変数ファミリを定義する
- 27. TensorFlow:グローバルスコープで変数を定義する
- 28. ngForでハッシュタグ変数を定義する
- 29. Djangoテンプレートで変数を定義する
- 30. Javascript - JSPで変数を定義する
この技術を持って、そのハードではないと思います
テキストでこれをやりたければ、何か変わるでしょうか?あるいは、私は13,10、 "Message $"をしなければならないでしょうか? –
私がしようとしているのは、ほぼすべて私のMASMプログラムの「スケルトン」を作ることです。だから、印刷、追加、減算などのためのマクロをたくさん作成しています。変数を作成するための別のマクロを作成したいのです(高水準言語のように、 "int [name]"と入力してその変数を使用することができます) –
ほとんどの場合、あなたが指しているのは_テンプレートです。実行可能ではあるが、具体的な質問をより重視した* SO *の範囲をはるかに超えている。 –