5

GAS を使用して ARM Linux 用のプログラムを作成していますが、開発をよりスマートにするためにいくつかのマクロを実行したいと考えています。それから私は知りたい:

(x+y*240)*2this: 、 werexおよびyareのマクロを作成するにはどうすればよいですか。これは次のintように使用されます。

mov r0, MACRO_SHOULD_BE_CALLED_HERE

そして、次のように呼び出されるマクロをどのように実行できますか:

JUST_MACRO_CALLED_HERE_TO_DO_SOMETHING

たとえば、印刷関数など、その内部で既に定義されていることを行うだけです。

また、マクロまたは関数呼び出しでいくつかの引数が必要な場合。どうすればそれができますか?

PS:x86のr0ようなARMレジスタですeax

4

3 に答える 3

3

GAS と NASM の比較 - マクロは、パラメータ化されたマクロを実行する方法を示していますが、単純な置換です。

于 2010-06-27T19:16:51.927 に答える
3

これは、最初のタイプのインライン gcc サンプルです。

int foo(unsigned short *p)
{
        int c;
        asm(".macro pixw nm, x, y\n"
            " .set \\nm, (\\x+\\y*240)*2\n"
            ".endm\n"
            "pixw pixo,1,2\n"
            "ldrh  %0, [%1, #pixo]\n" : "=r" (c) : "r" (p));
        return c;
}

またはアセンブラで、

.macro pixw nm, x, y
 .set \nm, (\x+\y*240)*2
.endm
pixw pix10_2,10,2 ; variable pixo is macro as parameters
 ldrh  r0, [r1, #pix10_2] ; get pixel offset.

多くの場合、代わりに「C」プリプロセッサを使用します。

于 2015-04-10T21:33:43.243 に答える
1

最初の例で必要なマクロをサポートするアセンブラは見たことがありません。2 番目の例は非常に簡単ですが、最も基本的なアセンブラーのドキュメントでさえカバーされているはずです。GNUasの場合、おそらく次のようなものが必要です。

.macro JUST_MACRO_CALLED_HERE_TO_DO_SOMETHING
    ...
.endm

の代わりに必要な指示を入力してください...

重要なデータを保持するために使用していた一連のレジスタを踏みつけないように、アセンブラ マクロには注意してください。通常、関数呼び出しは、これらの問題を解決するためのより良い方法です。

于 2010-06-27T16:42:06.813 に答える