- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[C语言内嵌汇编语法简介
简要介绍关键字__asm__:必须的; __volatile__:非必须的格式__asm__ __volatile__ (“instruction list” : output: input : clobber/modify);上述除了四个部分都可以缺省,当后面三个部分没有的时候退化成基本内联汇编,否则为GCC内联汇编各个操作数含义Instruction list:所有的内联操作定义Output:所有的输出变量Input:所有的输入变量Clobber/modify:对于可能被修改部分的声明每个操作数的集合Instruction list:各种intel和ATT汇编操作命令Output:输出操作数的变量名和所使用模式和寄存器/内存Input:输入操作数的变量名和所使用模式和寄存器/内存Clobber/modify:对寄存器或者内存可能改变的提醒声明语法寄存器引用Eg. %eax, %ebx操作数的顺序从做到右,eg. “movl %eax(源操作数), %ebx(目的操作数)”立即数前面加上$,eg. “movl $0x04, %ebx” 或者 para=0x04 movl $para, %ebx,将立即数04h装入寄存器ebx符号常数(直接引用)Eg. value: .long0x12a3f2de movl value, %ebx (将常数0x12a3f2dez装入寄存器ebx)Eg. “movl $value, %ebx”(将value的地址装入寄存器ebx)操作数的长度指令最后一个符号的含义:b,w,l,分别代表:byte,word,long,如果没有指定操作数长度,则按照目标操作数的长度来设置符号扩展和零扩展指令(ATT与Intel汇编指令中的不同部分)需要指定源操作数和目的操作数的长度ATT中的格式:movs(符号扩展)和movz(零扩展)Intel中的格式:movsx(符号扩展)和movzx(零扩展)Eg. movsbl意味着movs (from)byte (to)long; movsbl %al, %edx (Intel类似)Eg. movsbw意味着movs (from)byte (to)word movsbw %al, %dx (Intel类似)其他的还有:cbw, cwde, cwd, cdq等(intel的),cbtw, cwtl, cwtd, cltd等(ATT)调用和跳转指令段内调用和跳转:call, ret, jmp段间调用和跳转:lcall, lret, ljmp段间调用和跳转指令格式:”lcall/ljmp $section, $offset”段间返回指令为:”lret $stack-adjust”前缀字符串重复操作(rep, repne)指定被操作的段(cs,ds,ss,es,fs,gs)进行总线枷锁(lock)指定地址和操作的大小(data16, addr16)在ATT汇编语法中,前缀通常被单独放在一行,后面不跟任何操作数,例如,对于重复scas指令,其写法为:repnescas操作码的意义和用法:在ATT语法中,只需要按照section:memory-operand的格式就指定了相应的段前缀Eg.lcall %cs:realmode_switch“lock”是为了保证指令执行期间禁止一切中断,其作用于指令:ADD,ADC等内存引用Intel语法的间接内存引用格式为:section:[base+index*scale+displacement]ATT语法中对应形式为:section:displacement(base, index, scale)Base和index是任意的32-bit base和index寄存器Scale取值为:1,2,4,8,默认值为1Section可以指定任意的寄存器作为段前缀,默认的段寄存器在不同的情况下不一样(如果在指令中指定了默认的段前缀,编译器在目标代码中不会产生此段前缀代码)Eg.-4(%ebp): base=%ebp, displacement=-4, section没有指定,由于base=%ebp,所以默认的section=%ss,index,scale没有指定,则index为0其他指令参看《c和汇编混编语法》GCC内联汇编基本内联汇编(只有instruction list,没有input/output/clobber)Eg.__asm__ (“movl %esp, %eax”);Eg.__asm__ (“movl $1, %eax xor %ebx, %ebx int $0x80”);Eg. __asm__(“movl $1, %eax\r\t” “xor %ebx, %ebx\r\t” “int $0x80”);基本格式:__asm__ __volat
文档评论(0)