Linux-Kernel-011学习.docx


文档分类:IT计算机 | 页数:约27页 举报非法文档有奖
1/27
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/27
文档列表 文档介绍
Linux-Kernel-011学1寄存器引用寄存器引用要在寄存器号前加%例如:mov%eax,%ebx2操作数顺序 操作数排列是从源(左)到目的的(右)例如:mov%eax(源),%ebx(目的)3常数/立即数的格式 使用立即数。要在数前面加$,例如:mov$4,%ebx(变量前加$则表示该变量数值对应的地址);符号常数直接引用,如movvalue,%ebx,引用符号地址在符号齐前加$,如mov$value,%ebx4操作数长度 操作数长度用加在指令后面的符号表示,b=byte(8bit)w=word(16bit)l=long(32bit),如movw%ax,%bx5跳转 在AT&T汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上'*'作为前缀,而在Intel格式中则不需要。6远跳转 远程转移指令和远程子调用指令的操作码,在AT&T汇编格式中为"ljump"和"lcall",而在Intel汇编格式中则为"jmpfar"和"callfar",AT&T格式Intel格式ljmp$section,$offset$offset jmpfarsection:offsetlcall$sectioncallfarsection:offset7远程返回指令AT&T格式Intel格式lret$stack_adjust retfarstack_adjust8内存操作数的寻址方式AT&T格式Intel格式section:disp(base,index,scale) section:[base+index*scale+disp]计算方法是:base+index(索引)*scale(比例因子)+disp(偏移地址)例子:AT&T格式Intel格式movl-4(%ebp),%eaxmovlarray(,%eax,4),%moveax,[ebp-4]moveax,[eax*4+array]eaxmovwarray(%ebx,%eax,4),%cxmovb$4,%fs:(%eax) movcx,[ebx+4*eax+array]movfs:eax,:_asm_("asmstatements":outputs:intput:registers-modified);这四个字段的含义是:asmstatements-是汇编语句表达式,AT&T的结构,每新行都是分开的。outputs-修饰符一定要用引号引起来,用逗号分隔,输出的寄存器inputs-修饰符一定要用引号引起来,用逗号分隔,输入的寄存器registers-modified-名字用逗号分隔,汇编代码会修改的寄存器outputs,inputs,register-modified都是可选参数,以冒号隔开,且一次以0~9编号,如outputs的寄存器是0号,inputs寄存器是1号,往后依次类推。outputs是汇编语句执行完后输出到的寄存器,inputs是输入到某个寄存器。例子1:_asm_("pushl%%eax\n\t""movl$0,%%eax\n\t""popl%%eax");例子2:{registerchar_res;\asm("push%%fs\n\t""movw%%ax,%%fs\n\t""movb%%fs:%2,%%al\n\t""pop%%fs":"=a"(_res):"0"(seg),"m"(*(addr)));\_res;}movb%%fs:%2,%%al\n\t一句中是把以fs为段地址,以后面的第二号寄存器即后面的seg中的值为偏移地址所对应的值装入al。"=a"(_res):"0"(seg),"m"(*(addr)))一句中,"=a"(_res)表示把a寄存器中的内容给_res,"0"(seg)表示把seg中的内容给0所对应的寄存器,而0即表示使用和前一个寄存器相同的寄存器,这里即使用a寄存器,也就是说把seg中的内容个a寄存器。需要解释以下的是,a,b,c,d分别表示寄存器eax,ebx,ecx,edxS,D分别表示寄存器esi,edir表示任意寄存器0(数字0,不是o!)表示使用上一个寄存器10HelloWorld!既然所有程序设计语言的第一个例子都是在屏幕上打印一个字符串"HelloWorld!",那我们也以这种方式来开始介绍Linux下的汇编语言程序设计。在Linux操作系统中,你有很多办法可以实现在屏幕上显示一个字符串,但最简洁的方式是使用Linux内核提供的系统调用。使用这种方法最大的好处是可以直接和操作系统的内核进行通讯,不需要链接诸如libc这样的函数库,也不需要使用ELF解释器,因而代码尺寸小且执行速度快。Linux是一个运行在保护模式下的32位操作系统,采用flatmemory模式

Linux-Kernel-011学习 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数27
  • 收藏数0 收藏
  • 顶次数0
  • 上传人读书百遍
  • 文件大小993 KB
  • 时间2019-08-31
最近更新