turbo c 混编 汇编语言,Turbo C 编译 嵌入汇编

今天上自习回来打开电脑觉得无聊就收拾一下文件夹,无意中打开了汇编文件夹的一个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值