TASM汇编与TurboC混合编程.docx
《TASM汇编与TurboC混合编程.docx》由会员分享,可在线阅读,更多相关《TASM汇编与TurboC混合编程.docx(12页珍藏版)》请在冰豆网上搜索。
TASM汇编与TurboC混合编程
计算机操作系统实验报告
一、实验目的(1
二、实验内容(1
三、开发环境(1
四、分析设计(2
1、实验要求(2
2、设计原理(2
3、涉及到的类..........................................................................................错误!
未定义书签。
4、流程图..................................................................................................错误!
未定义书签。
五、结果及分析(3
1、运行示例(3
2、结果分析(7
六、心得体会(7
七、参考文献....................................................................................................错误!
未定义书签。
TASM汇编与TurboC混合编程
一、实验目的
在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(嵌入式系统等面向对象的高级语言编写的。
即:
我们的操作系统,不涉及高层部分,所以采用汇编+C的方式来编写。
作为测试,我们编写一个汇编程序afile.asm和一个C程序cfile.c,让它们相互调用。
具体来说,在afile.asm有一个显示一个字符的printChar函数和getChar(函数,在cfile.c中有一个实现打印字符串的printf(函数,在入口程序afile.asm中调用cfile.c中的cmain函数,再在cmain函数中调用printf(函数,最后由printChar函数在屏幕显示字符串中的字符。
参见下图:
hello,,,<回车>:
执行,键入:
Hello<回车>:
Windows中启动DOS命令执行模式,在命令行键入:
TASMafile.asmafile.obj
则会对启动afile.asm进行汇编,产生afile.obj:
用Tlink链接编辑器,用于将.obj链接为可执行程序.com,链接命令:
Tlink/tafile,,,<回车>:
Windows中启动DOS命令执行模式,在命令行键入:
TCC-mt-c-ocfile.obj
cfile.c则会对启动hello.c进行编译,产生hello.obj:
用Tlink链接编辑器,afile和cfile链接产生可执行的程序,链接命令:
Tlink/tafilecfile,,,<回车>:
运行程序:
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和,然后编译cfile.c生成cfile.obj和,链接两个程序,生成,打开在屏幕显示字符串“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_printCharpublic_getCharextern_cmain:
nearextern_printf:
near
_TEXTends
中山大学操作系统实验报告计科2班_DATAsegmentwordpublic'DATA'_DATAends_BSSsegmentwordpublic'BSS'_BSSendsendstartcfile.c:
externchargetchar(;externvoidprintChar(charch;voidprintf(constchar*str{while(*strprintChar(*str++;}/*charbuffer[10]="abcdefg";*/cmain({charbuffer[30]="hello,hupan11348041";printf(buffer;}10