今天上自习回来打开电脑觉得无聊就收拾一下文件夹,无意中打开了汇编文件夹的一个ppt,是讲在Turbo C是怎么使用嵌入汇编的,觉得不错,汇编已经学得快一年的,而且我现在正在看反汇编呢,可是发现自己不知道汇编代码是这么编译运行的,实则惭愧阿。
找来以前的课本--哦,恍然大悟,原来是这样的。
我把上面的代码拷下来,才发现竟然没告诉我们是这么编译的。直接编译以前好像干过,不行。上网搜,还是有些的,都是csdn的,按照上面的说法下了个tasm(后来发现自己有masm),把tasm.exe托到tc目录(可以直接用masm)。
#include void upper(char *dest,char *src)
{ asm mov si,src
/* dest和src是地址指针 */
asm mov di,dest
asm cld
loop: asm lodsb /* C语言定义的标号 */
asm cmp al,'a'
asm jb copy /* 转移到C的标号 */
asm cmp al,'z'
asm ja copy
/* 不是’a’到’z’之间的字符原样复制 */
asm sub al,20h /*小写字母转换成大写*/
copy: asm stosb
asm and al,al
/* C语言中,字符串用NULL(0)结尾 */
asm jnz loop
}
main() /* 主程序 */
{
char str[]="This Started Out As Lowercase!";
char chr[100];
upper(chr,str);
printf("Origin string:\n%s\n",str);
printf("Uppercase String:\n%s\n",chr);
}
就这个例子了,进入命令行,输入tcc -S file.c 生成.asm文件,按照网上说的用link连接,可是出错,大意是访问地址出错。怎么办,用tlink试一下,呵呵还是不行,是printf未定义(后来想起这个需要c的库函数,苯阿,都是问题解决了才看到问题的本质阿)。还是去找,网络的信息真多,也真浪费时间阿,你看都几点了。有个说法是 tlink m.obj cs.lib,但是要么就出错,要么就运行exe时显示ntvdm cpu 遇到无效的指令。查了一下原因貌似堆栈溢出,哦,那就自己添加堆栈申请的代码阿。。。,没完没了
后来,拿了一本书,清华大学的,有两种方法,一种是以工程方式(这个还没来得及看呢,有机会以后讲了),第二中是分别用c和汇编的编译器得到他们的目标代码,在连接在一起阿。(阿,真辛苦!)
我先 tcc -S file.c 生成.asm文件,再用tasm编译出目标文件,最后直接用tc打开c文件,编译运行。ok。说来真的简单阿,可是花了我这么多的时间,为什么没有人教我阿,啊啊啊 。
附带上c中嵌入汇编的的要求:
格式
asm 操作码 操作数
举例
asm mov ax,ds;
asm pop ax; asm pop ds; asm ret;
asm push ds
操作码支持8086/8087指令或若干伪指令:db/dw/dd和extern
操作数是操作码可接受的数据:立即数、寄存器名,还可以是C语言程序中的常量、变量和标号等
内嵌的汇编语句可以用分号“;”结束,也可以用换行符结束
使用C的注释,如 / * … * /
正确运用通用寄存器、标号等
命名约定
汇编语言过程应采用C语言类型
声明约定
C对调用的外部过程、变量等采用EXTERN说明
汇编语言程序的标识符用public操作符定义
寄存器使用约定
存储模式约定
采用相同的存储模式
参数传递约定:堆栈和共享变量
感谢燕姿的歌,不然睡着了都。。
----by adrian