ASM编程,ASM混合编程

1 , ASM混合编程可以把其它语言的dll库文件用dll2lib开转成lib文件供asm调用.如果两个obj都是用stdcall方式编译出来的.那么可以用link.exe链接成exe#pragma asm...asm code...#pragma endasm这个是可以的在keil里面对你的c文件文件上面点反键选择option for main 。c然后在里面有这个src的选项,勾了就可以了
2,asm编译的问题是这样的: ASM汇编连接后是.EXE程序,在.EXE程序的前部都有一个“重定位表”,里面保存了你的程序中所有类似你说的mov ax,code这样的指令中code部分(注意不是变量,是立即数)的偏移地址 。而指令中code部分的值则汇编成“段的相对段值” , 从第1个段算起 。举例来说,假设堆栈段在前面(长度=1000h字节),数据段居中(长度=2000h字节),代码段最后,那么,堆栈段的“相对段值”=0,数据段的“相对段值”=100h(1000h/16),代码段的“相对段值”=300h((1000h+2000h)/16) 。也就是ASM程序将mov ax,code这条指令汇编成mov ax,300h(注意是立即寻址方式) 然后,OS执行该程序时,假设分配的内存地址是12340h(段地址=1234h) , 然后OS将程序调入1234h段中,然后读入重定位表 , 根据重定位表中的地址,就可以找到每一个类似mov ax,code指令中code(刚才说了,是立即数)的存放地址(在实际的code段中,OS肯定知道该段地址),然后将1234h“加入”该单元,于是该立即数就变成了1534h(1234h+300h),这正是从12340h开始,给堆栈段留1000h字节,然后再给数据段留2000h字节后的“代码段”的段地址(12340h+1000h+2000h=15340h , 段地址=1534h) 现在,mov ax,code指令变成了mov ax,1534h , 正确地指向了“代码段” 。CODE 段的值在程序里一般是确定的,但当它被加载入内存后就不确定了,因为操作系统也是一个进程,比如SHELL/COMMAND,它会无限循环等待你的输入命令 , 知道你输入一个应用程序以后再加载到内存里运行,所以各个段在运行时内存中的位置是不定的 。没有什么特别 。例如:#include#include int power2( int num, int power ); int main( ) { int a=3,b=5; printf( "3 * 2^5 = %d\n", power2( a, b) ); } int power2( int num, int power ) { __asm { mov eax, num ; get first argument mov ecx, power ; get second argument shl eax, cl ; eax = eax * ( 2 ^ cl ) } // return with result in eax } ==== 就用普通的: cl 程序名 就编译和链接了 。编译成 .obj 不链接 用选项 -c针对不同的芯片,结果是不一样的 , 某些芯片是可以自己定义分配code字段的内存映射,这样可以精确控制 。有些则是编译器帮你做分配~【ASM编程,ASM混合编程】

    推荐阅读