TASM总汇编与TurboC混合编程.docx
- 文档编号:27393561
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:11
- 大小:726.47KB
TASM总汇编与TurboC混合编程.docx
《TASM总汇编与TurboC混合编程.docx》由会员分享,可在线阅读,更多相关《TASM总汇编与TurboC混合编程.docx(11页珍藏版)》请在冰豆网上搜索。
TASM总汇编与TurboC混合编程
计算机操作系统实验报告
一、实验目的2
二、实验容2
三、开发环境2
四、分析设计2
1、实验要求2
2、设计原理3
3、涉及到的类5
4、流程图6
五、结果及分析8
1、运行示例8
2、结果分析9
六、心得体会9
七、参考文献10
TASM汇编与TurboC混合编程
1、实验目的
在dos下,练习使用TASM命令,并用TASM汇编并程序,了解汇编程序与c语言程序的相互调用机制及其原理。
二、实验容
实现DOS下的TASM汇编程序hello。
实现DOS下的TASM汇编程序和C语言混合编程。
三、开发环境
此程序的设计在Windows7操作系统下,用到notepad++,TASM工具,以及虚拟机vmwareplayer。
四、分析设计
1、实验要求
实现DOS下的TASM汇编程序hello,理解TASM的相关命令。
实现DOS下的TASM汇编程序和C语言混合编程,使程序能够完美的运行。
2.设计原理
C语言是专门为编写操作系统而发明的语言,大多数现代操作系统都是用C语言结合汇编语言编写的,也有部分高层代码(如用户态模块、GUI、API类库等)是用C++(通用)、Object-C(苹果公司)、C#(微软.NET)、Java(嵌入式系统)等面向对象的高级语言编写的。
即:
层次
语言
功能
高层
OOP(高级语言)
编写GUI和类库等
中层
C(中级语言)
实现算法和API
底层
汇编(低级语言)
控制硬件和I/O设备
我们的操作系统,不涉及高层部分,所以采用汇编+C的方式来编写。
作为测试,我们编写一个汇编程序afile.asm和一个C程序cfile.c,让它们相互调用。
具体来说,在afile.asm有一个显示一个字符的printChar函数和getChar()函数,在cfile.c中有一个实现打印字符串的printf()函数,在入口程序afile.asm中调用cfile.c中的cmain函数,再在cmain函数中调用printf()函数,最后由printChar函数在屏幕显示字符串中的字符。
参见下图:
afile.asm与cfile.c的相互调用关系
五、结果及分析
1、运行示例
Windows中启动DOS命令执行模式,在命令行键入:
TASMhello.asmhello.obj
则会对启动hello.asm进行汇编,产生hello.obj:
用Tlink编辑器,用于将.obj为可执行程序.,命令:
Tlink/thello,hello.,,<回车>:
执行hello.,键入:
Hello<回车>:
Windows中启动DOS命令执行模式,在命令行键入:
TASMafile.asmafile.obj
则会对启动afile.asm进行汇编,产生afile.obj:
用Tlink编辑器,用于将.obj为可执行程序.,命令:
Tlink/tafile,afile.,,<回车>:
Windows中启动DOS命令执行模式,在命令行键入:
TCC-mt-c-ocfile.objcfile.c则会对启动hello.c进行编译,产生hello.obj:
用Tlink编辑器,afile和cfile产生可执行的程序hupan.,命令:
Tlink/tafilecfile,hupan.,,<回车>:
运行程序:
2、结果分析
编写一个汇编程序afile.asm和一个C程序cfile.c,它们相互调用。
在afile.asm有一个显示一个字符的printChar函数和getChar()函数,在cfile.c中有一个实现打印字符串的printf()函数,在入口程序afile.asm中调用cfile.c中的cmain函数,再在cmain函数中调用printf()函数,最后由printChar函数在屏幕显示字符串中的字符。
先汇编afile.asm生成afile.obj和afile.,然后编译cfile.c生成cfile.obj和cfile.,两个程序,生成hupan.,打开在屏幕显示字符串“hello,hupan11348041”。
六、心得体会
做实验之前虽然好多细节部分还不是太了解,但是对一个进程的流向和执行过程还是有个大概的认识,所以这个实验做起来也不是那么的困难。
不过后来老师委托学习委员发给了大家一个资料包。
里面有文档还有TSAM相关的工具,于是实验过程要轻松了许多。
刚开始的时候,对TASM的相关命令不是很了解,于是编译出来的cfile程序一直无法运行,后来才知道没有用Tlink编辑器将cfile程序与afile程序在一起,于是cfile中调用的一些函数没有定义,相应的就无法运行了,将他们起来,才能够实现互相的调用。
出现这个问题的关键在于,我对汇编程序和C程序之间的互相调用规则以及原理没有很深的了解。
所以,在实验之前了解实验的基本步骤和实验的基本原理还是有很大的必要的。
另外一个问题,当我把两个程序在一起编译得到一个新的文件,可是打开却没有办法运行,原本我一直以为是出了问题,可是检查了好几遍,发现编译以及的步骤完全是没有问题,于是我又去看汇编程序以及cfile.c程序用没有问题。
经过反复的试验,XX和Google查找资料,向同学请教和讨论,终于找到程序的一个小错误,即把ss写成了sp,然后一帆风顺,顺利的完成了实验。
还要注意下一次的实验报告不要拖到要交报告的前一天来写,通常写的很急,不能够写的很完美,毕竟赶出来的东西不如精雕细琢的东西。
拖延症不好,无论是学习上还是生活上,今天的事情,今天毕。
附:
实验程序清单
afile.asm:
externmacro%1;统一用extern导入外部标识符
extrn%1
endm
.8086
_TEXTsegmentbytepublic'CODE'
assumecs:
_TEXT
DGROUPgroup_TEXT,_DATA,_BSS
org100h
start:
movax,cs
movds,ax;DS=CS
moves,ax;ES=CS
movss,ax;SS=cs
movsp,4800h;
callnearptr_cmain
.1:
jmp.1
_printCharproc
pushbp
movbp,sp
;***
moval,[bp+4]
movbl,0
movah,0eh
int10h
;***
movsp,bp
popbp
ret
_printCharendp
_getCharproc
movah,0
int16h
ret
_getCharendp
public_printChar
public_getChar
extern_cmain:
near
extern_printf:
near
_TEXTends
_DATAsegmentwordpublic'DATA'
_DATAends
_BSSsegmentwordpublic'BSS'
_BSSends
endstart
cfile.c:
externchargetchar();
externvoidprintChar(charch);
voidprintf(constchar*str){
while(*str)
printChar(*str++);
}
/*charbuffer[10]="abcdefg";*/
cmain(){
charbuffer[30]="hello,hupan11348041";
printf(buffer);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TASM 总汇 TurboC 混合 编程