user-0 提问: 有没有汇编的解释库

回复:
user: user-1
content: 还可以考虑生成一个临时.asm文件，扔给汇编器让其汇编并生成带机器码的.map文件，然后读这个.map文件的内容。

user: user-1
content: //汇编的解释库 //F("nop \n nop \n") 返回 "\x90\x90" //生成一个临时.c文件，扔给VC6编译器让其编译并生成带机器码的.cod文件，然后读这个.cod文件的内容。 #include <stdio.h> #include <stdlib.h> #include <string.h> char *F(const char* asmins,int *L) {     FILE *f;     static char s[1000];     char ln[80],*p;     int z,i,v,n;      f=fopen("tmp.c","w");     fprintf(f,         "#include <stdio.h>\n"         "int main() {\n"         "    __asm {////\n"         "%s"         "    }////\n"         "    return 0;\n"         "}\n",         asmins     );     fclose(f);     system("cl.exe /nologo /MDd /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"_AFXDLL\" /FAcs /Fa\"Debug/\" /Fo\"Debug/\" /Fd\"Debug/\" /FD /c tmp.c >NUL 2>NUL");     f=fopen("debug\\tmp.cod","r");     if (NULL==f) {         printf("Can not open file tmp.cod!\n");         exit(1);     }     z=0;     i=0;     while (1) {         if (NULL==fgets(ln,80,f)) break;         if (z==0) {             if (strstr(ln,"__asm {////")) {                 z=1;             }         }         if (z>0) {             if (strstr(ln,"}////")) break;             if (1==sscanf(ln,"  %x%n",&v,&n)) {                 p=ln+n;                 while (1) {                     if (1==sscanf(p,"%2x%n",&v,&n)) {                         s[i++]=(char)v;                         p+=n;                     } else break;                 }             }         }     }     fclose(f);     *L=i;     return s; } int main() {     char *a;     int i,L;      a=F("nop \n mov eax,0x12345678\n nop \n",&L);     for (i=0;i<L;i++) {         printf("\\x%02x",(unsigned char)a[i]);     }     return 0; } //\x90\xb8\x78\x56\x34\x12\x90 //

user: user-1
content: //汇编的解释库 //F("nop \n nop \n") 返回 "\x90\x90" //生成一个临时.c文件，扔给VC6编译器让其编译并生成带机器码的.cod文件，然后读这个.cod文件的内容。 #include <stdio.h> #include <stdlib.h> #include <string.h> char *F(const char* asmins,int *L) {     FILE *f;     static char s[1000];     char ln[80],*p;     int z,i,v,n;      f=fopen("tmp.c","w");     fprintf(f,         "#include <stdio.h>\n"         "int main() {\n"         "    __asm {////\n"         "%s"         "    }////\n"         "    return 0;\n"         "}\n",         asmins     );     fclose(f);     system("cl.exe /nologo /MDd /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"_AFXDLL\" /FAcs /Fa\"Debug/\" /Fo\"Debug/\" /Fd\"Debug/\" /FD /c tmp.c >NUL 2>NUL");     f=fopen("debug\\tmp.cod","r");     if (NULL==f) {         printf("Can not open file tmp.cod!\n");         exit(1);     }     z=0;     i=0;     while (1) {         if (NULL==fgets(ln,80,f)) break;         if (z==0) {             if (strstr(ln,"__asm {////")) {                 z=1;             }         }         if (z>0) {             if (strstr(ln,"}////")) break;             if (1==sscanf(ln,"  %x%n",&v,&n)) {                 p=ln+n;                 while (1) {                     if (1==sscanf(p,"%2x",&v,&n)) {                         s[i++]=(char)v;                         p+=n;                     } else break;                 }             }         }     }     fclose(f);     *L=i;     return s; } int main() {     char *a;     int i,L;      a=F("nop \n nop \n",&L);     for (i=0;i<L;i++) {         printf("\\x%02x",(unsigned char)a[i]);     }     return 0; } //\x90\x90 //

user: user-1
content: 引用 7 楼 zhao4zhong1 的回复:还可以考虑生成一个临时.asm文件，扔给汇编器让其汇编并生成带机器码的.map文件，然后读这个.map文件的内容。 //汇编的解释库 //F("nop \n nop \n") 返回 "\x90\x90" //生成一个临时.asm文件，扔给汇编器让其汇编并生成带机器码的.map文件，然后读这个.map文件的内容。 #include <stdio.h> #include <stdlib.h> #include <string.h> char *F(const char* asmins,int *L) {     FILE *f;     static char s[1000];     char ln[80],*p;     int z,i,v,n;      f=fopen("tmp.c","w");     fprintf(f,         "#include <stdio.h>\n"         "int main() {\n"         "    __asm {////\n"         "%s"         "    }////\n"         "    return 0;\n"         "}\n",         asmins     );     fclose(f);     system("cl.exe /nologo /MDd /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"_AFXDLL\" /FAcs /Fa\"Debug/\" /Fo\"Debug/\" /Fd\"Debug/\" /FD /c tmp.c >NUL 2>NUL");     f=fopen("debug\\tmp.cod","r");     if (NULL==f) {         printf("Can not open file tmp.cod!\n");         exit(1);     }     z=0;     i=0;     while (1) {         if (NULL==fgets(ln,80,f)) break;         if (z==0) {             if (strstr(ln,"__asm {////")) {                 z=1;             }         }         if (z>0) {             if (strstr(ln,"}////")) break;             if (1==sscanf(ln,"  %x%n",&v,&n)) {                 p=ln+n;                 while (1) {                     if (1==sscanf(p,"%2x",&v,&n)) {                         s[i++]=(char)v;                         p+=n;                     } else break;                 }             }         }     }     fclose(f);     *L=i;     return s; } int main() {     char *a;     int i,L;      a=F("nop \n nop \n",&L);     for (i=0;i<L;i++) {         printf("\\x%02x",(unsigned char)a[i]);     }     return 0; } //\x90\x90 //

user: user-2
content: 汇编到二进制都是一一对应的。 你用汇编写的程序，编译出来就是一一对应的二进制码。

user: user-3
content: 自己下载nasm的源码，做成一个lib调用

user: user-1
content: 参考gcc自带的汇编器的源代码？

user: user-4
content: 自己写： 1. 编译汇编码-->可执行文件         2. 执行上一步中的可执行文件。  汇编码虽然很低级，但是CPU依然不能直接执行。

user: user-0
content: 没有什么现成的可以直接用么

user: user-1
content: 参考MSDN98\SAMPLES\VC98\SDK\SDKTOOLS\IMAGE\DRWATSON\*.*

user: user-5
content: 搞个汇编和机器码对照表即可