2016-09-22 1 views

答えて

2

あなたが求めているように聞こえますが、実行時にスペースを動的に割り当てることができます。答えは「はい」であり、最も一般的な方法の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バイトのみを必要とします。

スペースを割り当てるにはいくつかの方法があります。必要なものを具体的に変更してから、自分または他の誰かがそれに基づいて例を挙げることができます。

+0

この技術を持って、そのハードではないと思います

@pushsz "My Stringzero here" pop eax ; eax contains the address of the string 

テキストでこれをやりたければ、何か変わるでしょうか?あるいは、私は13,10、 "Message $"をしなければならないでしょうか? –

+0

私がしようとしているのは、ほぼすべて私のMASMプログラムの「スケルトン」を作ることです。だから、印刷、追加、減算などのためのマクロをたくさん作成しています。変数を作成するための別のマクロを作成したいのです(高水準言語のように、 "int [name]"と入力してその変数を使用することができます) –

+0

ほとんどの場合、あなたが指しているのは_テンプレートです。実行可能ではあるが、具体的な質問をより重視した* SO *の範囲をはるかに超えている。 –

2

私はあなたがこのようにそれを使用することができ、スタック上にある特定の変数のアドレスを保存し、このように、このマクロを使用して、他のアセンブラのために知っているが、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

+0

これは、文字列のアドレスをリターンアドレスとしてプッシュするための 'call'の恐ろしい乱用です。これは、[不一致のコール/レットがリターンアドレスプレディクタスタックを破損するため、現代のCPUでひどく動作します。](http://stackoverflow.com/questions/22442766/return-address-prediction-stack-buffer-vs-stack-ストアドリターンアドレス)。 –

+0

'.rodata'セクションにメッセージを置いて、そのアドレスを普通に' push 'するほうがずっと良いでしょう。 1つのマクロでこれをすべて実行することもできます( 'section .rodata'に切り替え、dbを文字列に変換し、前のセクションに戻します)。リンカーは、すべての文字列を読み取り専用のデータセクションに集め、データを途切れることなくコードに残します。 –

+0

私はあなたがDOSの例からそのトリックを持っているのを見ます。コードサイズだけが重要なことは興味深い考えです。しかし、L1 CPUを分割したものであれば、Dキャッシュ内の文字列を保持し、何かが文字列を読み込んだときにIキャッシュを保持する必要があるため、古いCPUでもパフォーマンスが疑わしい。また、レジスターの代わりにスタックにargsが渡される、悪い古いABIでも役に立ちます。これは、286年または386年の時代のCPUのための素晴らしいアイデアだが、今は良い考えではない。 –

関連する問題