Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51345
  • 博文数量: 10
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-30 10:39
文章分类

全部博文(10)

文章存档

2007年(10)

我的朋友

分类: C/C++

2007-05-05 02:33:17

今天上自习回来打开电脑觉得无聊就收拾一下文件夹,无意中打开了汇编文件夹的一个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
阅读(1930) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-03-11 17:44:23

希望成为你的网友,这几天我会详细的把一个TC混合编程的例子放到http://hi.baidu.com/qinfengling这个网站上,感兴趣就访问一下。

chinaunix网友2008-03-11 17:42:34

其实你是可以使用Tlink的,只是你的命令不对,假设你的tc装在C:下,那就试试tlink C:\tc\lib\c0s m,m.exe,,C:\tc\lib\cs