レジスタを使ったマスク

AL/AHレジスタを使ってマスク処理をアセンブラで書いてみます。
まずは、代入するだけの処理。
変数aに0x12345678を代入します。

takk@deb9:~/tmp$ cat -n t.c
     1  #include <stdio.h>
     2  int main()
     3  {
     4          unsigned long a;
     5          asm("movq $0x12345678,-0x8(%rbp)");
     6          printf("%08x\n",a);
     7  }
takk@deb9:~/tmp$

実行。

takk@deb9:~/tmp$ gcc t.c
takk@deb9:~/tmp$ ./a.out
12345678
takk@deb9:~/tmp$

さきほどのプログラムをベースに、ALレジスタを用いて下位8bitを0x00にする処理を、作ってみます。
ローカル変数をEAXにコピーして、ALを0にした後、EAXをローカル変数に戻すだけです。

takk@deb9:~/tmp$ cat -n t.c
     1  #include <stdio.h>
     2  int main()
     3  {
     4          unsigned long a;
     5          asm("movq $0x12345678,-0x8(%rbp)");
     6          asm("mov -0x8(%rbp), %eax");
     7          asm("mov $0,%al");
     8          asm("mov %eax,-0x8(%rbp)");
     9          printf("%08x\n",a);
    10  }
takk@deb9:~/tmp$ gcc t.c
takk@deb9:~/tmp$ ./a.out
12345600
takk@deb9:~/tmp$

次は、bit8~15をマスク。AHレジスタに0xFFを入れます。

takk@deb9:~/tmp$ cat -n t.c
     1  #include <stdio.h>
     2  int main()
     3  {
     4          unsigned long a;
     5          asm("movq $0x12345678,-0x8(%rbp)");
     6          asm("mov -0x8(%rbp), %eax");
     7          asm("mov $0xFF,%ah");
     8          asm("mov %eax,-0x8(%rbp)");
     9          printf("%08x\n",a);
    10  }
takk@deb9:~/tmp$ gcc t.c
takk@deb9:~/tmp$ ./a.out
1234ff78
takk@deb9:~/tmp$

コツを掴んできました。

次は上位16bitをオール0にします。

takk@deb9:~/tmp$ cat -n t.c
     1  #include <stdio.h>
     2  int main()
     3  {
     4          unsigned long a;
     5          asm("movq $0x12345678,-0x8(%rbp)");
     6          asm("mov -0x8(%rbp), %eax");
     7          asm("mov $0,%ebx");
     8          asm("mov %ax,%bx");
     9          asm("mov %ebx,-0x8(%rbp)");
    10          printf("%08x\n",a);
    11  }
takk@deb9:~/tmp$ gcc t.c
takk@deb9:~/tmp$ ./a.out
00005678
takk@deb9:~/tmp$

コメント

タイトルとURLをコピーしました