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