論理計算をしてみる

C言語でもできることだが、AndとかOrとかXorの計算をアセンブリコードで実装してみる。すべてアセンブリコードでやると入出力なんか考慮しなくてはならないので、関数部分だけアセンブリコードで書く。

  • logic.asm
	global _and
	global _or
	global _xor	
	section .text

_and:
	mov	eax, 1234H
	mov	edx, 5678H
	and	eax, edx
	ret

_or:
	mov	eax, 1234H
	mov	edx, 5678H
	or	eax, edx
	ret

_xor:
	mov	eax, 1234H
	mov	edx, 5678H
	xor	eax, edx
	ret
  • logic.c
#include <stdio.h>
int main()
{
	printf("and(0x1234 and 0x5678) = %x\n",and());
	printf("or(0x1234 or 0x5678) = %x\n",or());
	printf("xor(0x1234 xor 0x5678) = %x\n",xor());
	
	return 0;
}

使うのはnasmとgccのみである。nasmでアセンブルしてgccをほぼリンカとして使っている。そしてきちんと実行コードを作ることができる。結果は以下の通りである。

$ nasm -f win32 logic.asm
$ gcc logic.obj logic.c

$ ./a.exe
and(0x1234 and 0x5678) = 1230
or(0x1234 or 0x5678) = 567c
xor(0x1234 xor 0x5678) = 444c