1

私は挿入関数に相当するアセンブリに取り組んでおり、リストの要素をどのように正確に配置して、そこにデータを収めることができるか疑問に思っていました。情報を挿入する正しいアドレスを見つけましたが、そこにあるものを上書きせずにデータを書き込む方法について少し混乱しています。私の考えは

    set givespace, %l1
    !Next part is at the bottom in data section
    .section ".data"
    givespace:
          .align 48

ここで、48 は要素のサイズです。これにより、無効なアライメント境界というエラーが表示されます。何か案は?

4

1 に答える 1

0

質問を正しく理解し、事前定義されたサイズのデータ​​構造にスペースを静的に割り当てる必要がある場合は、行を置き換える必要があります

      .align 48

次までに

      times 48 db 0

これは、少なくとも NASM にとっては正しい方法です。いずれにせよ、アセンブラー マニュアルを参照して、この構成がアセンブリ コンパイラでサポートされていることを確認することをお勧めします。お使いのコンパイラが上記の例とまったく同じ表記法をサポートしていない可能性は非常に高いですが、いずれにしても同様のアナログをサポートします。'times' コマンドには次の構文があります。

    times <number of repeats> <body>

where は、ボディが結果のコードに挿入され、標準のアセンブリ命令を含む回数を指定します。上記の例では、null への初期化を伴うメモリのバイトの割り当てです。したがって、たとえば、次の 2 つのコード セクションは同じです。

     times 5 dd 012345678h

     dd 012345678h
     dd 012345678h
     dd 012345678h
     dd 012345678h
     dd 012345678h

.align ディレクティブは、メモリ空間の割り当てに対して正しくありません。これには別の目的があります。次のコードまたはデータのチャンクを事前定義された値に合わせることです。たとえば、この場合

    VAR1 db 0
    .align 48
    VAR2 db 0

VAR1 のアドレスが 0x1234 になる場合、コンパイラは、VAR2 のアドレスが 48 バイト境界に確実に配置されるように、未使用の 44 バイトを挿入します。この場合、アドレスは 0x1260 (0x1260 = 0x62 * 30 + 0 ) になります。正直なところ、コンパイラは通常、2 の累乗の値にのみ位置合わせを許可します。48 は 2 の累乗ではないため、上記の例のアセンブラをコンパイルするとエラーが発生する可能性が高くなります。そのため、.align ディレクティブによって割り当てられる未使用のバイト数を制御するのは困難です。0 からディレクティブ パラメーターまでの任意の値を指定できます。この値は、プログラムのソース コードの変更に応じて変化します。

But NOTE! This is an approach for the statical memory allocation during compilation time! If you need dynamical memory allocation in the run time, you need to write your own or find and adopt some third party memory allocator. If you program will run in the OS environment, you can request dynamical memory allocation by using OS API. (for example VirtualAlloc in WinAPI).

于 2012-12-06T05:55:58.857 に答える