汇编与C混合编程及ELF文件格式.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
汇编与C混合编程及ELF文件格式 为了编写较为复杂的操作系统模块,仅靠汇编语言是不够的,还需要(专为编写操作系统而发明的)C语言。直接与硬件打交道的工作由汇编语言负责,而其他高层的逻辑操作使用大家所熟悉的C语言会更加有效。我们编写操作系统程序,需要将汇编代码和C语言代码进行混合编译,生成单一的可执行文件。 在微软的可执行文件格式中(参见汇编与接口课件“第2章汇编”文档的2.4.1小节),老式的COM文件为裸格式,不利于程序的加载、重定位和调度管理;而DOS/Windows的EXE文件,又有MZ、NE和PE三种(嵌套)格式,复杂且落后。所以我们的可执行文件,准备采用先进且通用ELF(Executable and Linkable Format,可执行与可链接格式)格式。 由于我至今未找到能够在Windows环境下生成ELF文件的汇编/C语言编译链接器,被迫使用Linux下的软件NASM/GCC进行汇编/C语言程序的编译、用链接软件LD(Link Editor,链接编辑器)生成ELF文件。因此,本实验将介绍(虚拟机中的)Linux操作系统的基本使用方法、编辑软件vim和gedit的初步用法、gcc和ld的基本用法,及如何编写能够交互调用的汇编和C语言程序,最后介绍ELF文件格式及实例。 1 Linux下的汇编与C混合编程 1.1 在Linux下使用汇编语言 启动VMware Player虚拟机软件和其中的Linux虚拟机Ubuntu(系统用户cs的密码为sysucs),然后进入Linux的Shell终端(可参见实验说明文档1的1.3节)。 虚拟机软件VMware Player与Linux虚拟机Ubuntu 1.用vim编写汇编源代码 VI(Visual Interface,可视界面)是Bill Joy于1976年为Unix编写的一种传统的行式文本编辑器,VIM(Vi IMproved,VI改进)是VI的增强版,由Bram Moolenaar于1991年11月发布。VI和VIM都不支持鼠标定位和操作。 为了编写汇编程序hello.asm,可用命令vi hello.asm进入vim: 在Linux的Shell终端中,用命令vi hello.asm进入vim 按i键或Insert键进入编辑模式的插入状态,键入(或复制+粘贴)如下汇编代码: [section .data] ; 数据段 strHello db Hello, world!, 0Ah ; 显示的字符串+换行符 STRLEN equ $ - strHello ; 串长 = 当前位置 – 串首地址 [section .text] ; 代码段 global _start ; 导出入口函数,供链接器识别 _start: ; 程序入口 mov edx, STRLEN ; EDX = 串长 mov ecx, strHello ; ECX = 串地址 mov ebx, 1 ; EBX = 文件描述符 mov eax, 4 ; 功能号EAX = sys_write(写) int 0x80 ; 系统调用 mov ebx, 0 ; EBX = exit_code(返回的状态值) mov eax, 1 ; 功能号EAX = sys_exit int 0x80 ; 系统调用 其中,int 80h是Unix/Linux的系统中断调用(似DOS的int 21h),功能号在32位寄存器EAX中: 1号功能为程序退出,唯一的参数是返回的退出代码,对应的C函数原型为: int sys_exit(int status); 4号功能为写文件描述符,输入参数有串长、串地址和文件描述符(file descriptor)(0=标准输入[键盘]、1=标准输出[屏幕]、2=标准错误[屏幕]),对应C函数原型为: size_t sys_write(unsigned int fd, const char *buf, size_t nbytes); 按Esc键回到命令模式,按冒号键:进入EX模式(底层命令模式),在冒号提示符后输入(写入+退出)命令wq后回车,保存编辑内容并退出vim。有时可能需要用带感叹号的命令(如:q!)强制退出。则会在你的主文件夹(对应于“/home/用户名”目录)中,创建一个名为hello.asm的文本文件(可用Linux的ls命令查看)。 在vim中键入或复制粘贴汇编代码后用wq命令保存并退出 用ls命令查看当前目录“/home/用户名”中的文件及子目录列表 2.用gedit编写源代码 除了使用传统的行式文本编辑器外,还可以使用Linux GNOME自带的(支持鼠标定位和操作的)图形界面的文本编辑器ged

文档评论(0)

170****0532 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8015033021000003

1亿VIP精品文档

相关文档