5

インラインアセンブリブロック内からシステムコールを使用して単一の文字を書き込むことは可能ですか? もしそうなら、どのように?次のような「何か」になるはずです。

__asm__ __volatile__
                    (
                     " movl $1,  %%edx \n\t"
                     " movl $80, %%ecx \n\t"
                     " movl $0,  %%ebx \n\t"
                     " movl $4,  %%eax \n\t"
                     " int $0x80       \n\t"
                     ::: "%eax", "%ebx", "%ecx", "%edx"
                    );

$80 は ascii の 'P' ですが、何も返されません。

どんな提案でも大歓迎です!

4

3 に答える 3

2

IIRC、あなたの例では2つのことが間違っています。まず、mov $0, %ebx を使用して stdin に書き込みます。次に、write は 2 番目の引数としてポインターを受け取ります。そのため、1 文字を書き込むには、その文字がメモリのどこかに格納されている必要があり、% に値を直接書き込むことはできません。 ecx

元:

.data
char: .byte 80
.text
mov $char, %ecx

私はLinuxで純粋なasmのみを実行しました.gccを使用してインライン化したことはありません.アセンブリの途中にデータをドロップすることはできないため、インラインアセンブリを使用してポインタを取得する方法がわかりません.

編集:やり方を思い出しただけだと思います。「p」をスタックにプッシュして %esp を使用できます

pushw $80
movl %%esp, %%ecx
... int $0x80 ...
addl $2, %%esp
于 2010-06-02T14:19:01.637 に答える
0

何かのようなもの


char p = 'P';

int main()
{
__asm__ __volatile__
                    (
                     " movl $1,  %%edx \n\t"
                     " leal p , %%ecx \n\t"
                     " movl $0,  %%ebx \n\t"
                     " movl $4,  %%eax \n\t"
                     " int $0x80       \n\t"
                     ::: "%eax", "%ebx", "%ecx", "%edx"
                    );
}

追加lea: char の実効アドレスをecxレジスタにロードするために使用したことに注意してください。ebx$0 と $1の値を試してみましたが、とにかくうまくいくようです...

外部文字の使用を避ける

int main()
{
__asm__ __volatile__
                    (
                     " movl $1,  %%edx \n\t"
                     " subl $4, %%esp \n\t"
                     " movl $80, (%%esp)\n\t"
                     " movl %%esp, %%ecx \n\t"
                     " movl $1,  %%ebx \n\t"
                     " movl $4,  %%eax \n\t"
                     " int $0x80       \n\t"
                     " addl $4, %%esp\n\t"
                     ::: "%eax", "%ebx", "%ecx", "%edx"
                    );
}

注意: Intel プロセッサのエンディアンにより動作します! :D

于 2010-06-02T14:24:37.043 に答える