asmxp(あせむえっくすぴー) -- assembly expression

http://morihyphen.hp.infoseek.co.jp/files/asmxp.tar.gz
でも出しちゃうよ!
asmxpは式感覚でJITアセンブリが書けちゃうなんかです。昨今のらいとうぇいつならんげーじとかそういうネタふりでした。

int
main( int argc, char **argv )
{
	using namespace asmxp;
	using namespace asmxp::x86;

	if ( argc < 2 )
		throw "e-";

	std::ofstream out( argv[1] );
	if ( !out )
		throw argv[1];

	typedef std::vector<unsigned char> v_t;
	v_t v;

	(mov( eax, *(eax+4))
	 | add( eax, *(eax+4) )
	 | mov( *(eax+4), eax)
	 | add( *(ecx+4), eax )
	 | mov(ecx,eax)
	 | add(ecx,eax)
	 | mov(eax,0x08)
	 | add(eax,0x08)
	 | mov(*dword(4),eax)
	 | add(*dword(4),eax)
	 | mov(esi,*dword(4))
	 | add(ecx,*dword(4))
	 | mov(*dword(4),8)
	 | add(*dword(4),8)
	 | mov(*(eax + 4),8)
	 | add(*(ebp + 4),8)).emit( std::back_inserter(v) );
	std::ostream_iterator<char> os(out);

	std::copy( v.begin(), v.end(), os );
}

こんな感じでアレするとアレだよ!なんかそんなこんなあんな。


expression template の力によって、

int test( char *buf )
{
	using namespace asmxp;
	using namespace asmxp::x86;
	int addr = 4;

	( mov(eax,0x08) | mov(ecx, *dword(addr) ) ).emit( buf );

	return 0;
}

こんなのは、

_Z13constant_testPc:
.LFB1785:
	pushl	%ebp
.LCFI2:
	movl	%esp, %ebp
.LCFI3:
	movl	8(%ebp), %eax
	movb	$-72, (%eax)
	movb	$8, 1(%eax)
	movb	$0, 2(%eax)
	movb	$0, 3(%eax)
	movb	$0, 4(%eax)
	movb	$-117, 5(%eax)
	movb	$13, 6(%eax)
	movb	$4, 7(%eax)
	movb	$0, 8(%eax)
	movb	$0, 9(%eax)
	movb	$0, 10(%eax)
	xorl	%eax, %eax
	popl	%ebp
	ret

こんなんにコンパイルされます。GCCは偉い。


いまのところmov,add,xor,sub,sbb,adc,or,andぐらい使えます。SIBが使えないのでもうちょっと頑張ると思ったけどネムいので寝ますおやすみなさい。説明はラベルが使えるぐらいになったら書く。
おっと、ディスプレースメント無しのレジスタ間接が無い。