アセンブリコードをマトモに書き直す
配列プログラミング - かーねる・う゛いえむにっきのアセンブリコードをマトモに書き直した。
ただ、最短なアセンブリコードの実行時間が最短かというと、そんな事も無いかもしれない。メモリアクセスとか色々あるので、ある特定のインストラクションは遅いとか、色々ありそうな気もする。
#include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <unistd.h> #include <sys/mman.h> #include <assert.h> int stack[32768], *sp = stack; void *func_table[2] = {(void *)putchar, (void *)getchar}; unsigned char *program; void **funcp = func_table; int main(void) { long psize; int i = 0, j; #ifdef BSD psize = getpagesize(); #else psize = sysconf(_SC_PAGE_SIZE); #endif if((posix_memalign((void **)&program, psize, psize))) err(1, "posix_memalign"); if(mprotect((void*)program, psize, PROT_READ | PROT_WRITE | PROT_EXEC)) err(1, "mprotect"); program[i++] = 0x55;// push %ebp program[i++] = 0x89; program[i++] = 0xe5;// mov %esp,%ebp program[i++] = 0x83; program[i++] = 0xec; program[i++] = 0x18;// sub $0x18,%esp program[i++] = 0x8b; program[i++] = 0x5d; program[i++] = 0x08;// mov 0x8(%ebp),%ebx program[i++] = 0x8b; program[i++] = 0x75; program[i++] = 0x0c;// mov 0xc(%ebp),%esi for(j = 0; j < 65; j++) { program[i++] = 0xff; program[i++] = 0x03;// incl (%ebx) } program[i++] = 0x8b; program[i++] = 0x03; // mov (%ebx),%eax program[i++] = 0x89; program[i++] = 0x04; program[i++] = 0x24;// mov %eax,(%esp) program[i++] = 0xff; program[i++] = 0x16; // call *(%esi) program[i++] = 0xc9;// leave program[i++] = 0xc3;// ret ((void (*)(int *, void**))program)(sp, funcp); // free(program); return 0; }