当前位置: 首页 > news >正文

风铃建站模板趴比库的网站是谁建设的

风铃建站模板,趴比库的网站是谁建设的,怎样建设数字中国,西安专业做网站的LINUX下的汇编入门 ATT风格 汇编 和GCC风格汇编 汇编代码的调试 前面写了三篇,是自我摸索三篇,摸着石头过河,有些或许是错误的细节,不必在意! 今天我们直接用GCC编译C语言代码,且在C语言里面内嵌ATT风格的汇编! 前三篇大家了解即可,我们重点放在内嵌汇编里,简单快…LINUX下的汇编入门 ATT风格 汇编 和GCC风格汇编 汇编代码的调试 前面写了三篇,是自我摸索三篇,摸着石头过河,有些或许是错误的细节,不必在意!  今天我们直接用GCC编译C语言代码,且在C语言里面内嵌ATT风格的汇编! 前三篇大家了解即可,我们重点放在内嵌汇编里,简单快捷舒服! GCC支持在C/C代码中嵌入汇编代码这些汇编代码被称作GCC Inline ASM——GCC内联汇编。 这是一个非常有用的功能有利于我们将一些C/C语法无法表达的指令直接潜入C/C代码中另外也允许我们直接写C/C代码中使用汇编编写简洁高效的代码。其实为了装逼和护城河! gcc 编译器支持 2 种形式的内联 asm 代码 基本 asm 格式不支持操作数 扩展 asm 格式支持操作数 1. 语法规则 asm [volatile] (汇编指令) 所有指令必须用双引号包裹起来 超过一条指令必须用\n分隔符进行分割为了排版一般会加上\t 多条汇编指令可以写在一行也可以写在多行 关键字 asm 可以使用 asm 来替换 volatile 是可选的编译器有可能对汇编代码进行优化使用 volatile 关键字之后告诉编译器不要优化手写的内联汇编代码。 基本内联汇编的格式是 __asm__ __volatile__(Instruction List); 可选风格 有比较多种,不过测试了下 就下面代码的风格支持得好, 每行汇编命令 要加冒号和\N\T 确实麻烦. 不过可以使用软件前后追加特定符号就行了. 下面是基本格式 不支持操作数,它必须使用全局变量,这限制太麻烦了 #include stdio.hint a  1; int b  2; int c;int main() {asm volatile (movl a, %eax\n\taddl b, %eax\n\tmovl %eax, c);printf(c  %d \n, c);return 0; }其实汇编内嵌 相当于调用个C函数而已,不过这C函数是汇编函数而已 #include stdio.hint main() {int data1  1;int data2  2;int data3;asm volatile(movl %%ebx, %%eax\n\taddl %%ecx, %%eax: a(data3) : b(data1),c(data2) );/*asm [volatile] (汇编指令\n\t : 输出操作数列表 : 输入操作数列表 : 改动的寄存器)*/printf(data3  %d \n, data3);return 0; } 这里必须使用扩展ASM格式,才能不使用全局变量当作参数传入汇编函数里 所以汇编命令 寄存器要多个%号 movl %%ebx,%%eax 把EBX的值覆盖进EAX里. 所有汇编命令结束后 最后个小挂号前 开始定义我们的函数参数 第一个冒开始是 输出参数   :a(data3) 第二个冒号开始是 输入参数 有多个参数用逗号分隔 第三个冒号是不要优化寄存器列表 其中  :a(data3) 的 data3 是C的变量 用小挂号保护起来, 前面的A 叫做修饰符  对输出寄存器或内存地址提供额外的说明包括下面4个修饰符 被修饰的操作数可以读取可以写入 被修饰的操作数只能写入 %被修饰的操作数可以和下一个操作数互换 在内联函数完成之前可以删除或者重新使用被修饰的操作数 其中A 使用寄存器的别名 a 表示只能写A的寄出器(EAX)  通俗讲下面的叫约束 a: 使用 eax/ax/al 寄存器 b: 使用 ebx/bx/bl 寄存器 c: 使用 ecx/cx/cl 寄存器 d: 使用 edx/dx/dl 寄存器 r: 使用任何可用的通用寄存器 m: 使用变量的内存位置 b(data1)表示 data1变量的值复制到B寄出器里 在内联汇编代码中没有声明“改动的寄存器”列表也就是说可以省略掉(前面的冒号也不需要) 使用占位符来代替寄存器名称 如果操作数有很多那么在内联汇编代码中去写每个寄存器的名称就显得很不方便。占位符有点类似于批处理脚本中利用 2...来引用输入参数一样内联汇编代码中的占位符从输出操作数列表中的寄存器开始从 0 编号一直编号到输入操作数列表中的所有寄存器。   #include stdio.h int main() {int data1  1;int data2  2;int data3;asm(        movl %1, %%eax\n\taddl %2, %0: r(data3) : r(data1),r(data2) );printf(data3  %d \n, data3);return 0; } %0 是输入参数  依次是 两个输入参数 %1 %2 内联汇编的C语言 正常编译就好了 [rootdsmartLINUX_ASM]$gcc main_add.c -o main.add.exe [rootdsmartLINUX_ASM]$./main.add.exe  data3  3 我们可以查看下GCC 汇编的代码 [rootdsmartLINUX_ASM]$gcc -S main_add.c -o main_add.asm[rootdsmartLINUX_ASM]$vim main_add.asm 下面是我们GCC把MAIN_ADD.C全部翻译成了汇编代码,而我们重点的内嵌汇编用蓝色注解#APP----#NOAPP 范围内 .file   main_add.c.section        .rodata .LC0:.string data3  %d \n.text.globl  main.type   main, function main: .LFB0:.cfi_startprocpushq   %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq    %rsp, %rbp.cfi_def_cfa_register 6subq    $16, %rspmovl    $1, -4(%rbp)movl    $2, -8(%rbp)movl    -4(%rbp), %eaxmovl    -8(%rbp), %edx #APP # 9 main_add.c 1movl %eax, %eaxaddl %edx, %eax# 0  2 #NO_APPmovl    %eax, -12(%rbp)movl    -12(%rbp), %eaxmovl    %eax, %esimovl    $.LC0, %edimovl    $0, %eaxcall    printfmovl    $0, %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc .LFE0:.size   main, .-main.ident  GCC: (GNU) 5.5.0    .section        .note.GNU-stack,,progbits 里面这段代码不是%1了,被具体替换成了寄出器名. 这段是C语言调用汇编函数进行参数压栈操作,分别把参数1,2压入栈底 movl $1, -4(%rbp) movl $2, -8(%rbp) movl -4(%rbp), %eax movl -8(%rbp), %edx rsp : 栈指针寄存器指向栈顶 rbp : 栈基址寄存器指向栈底 返回参数: movl %eax, -12(%rbp) movl -12(%rbp), %eax 把结果 压入栈底 -12位置,然后出栈 把RBP栈的值 返回给EAX 好像这有点多余 下面准备调用PRINTF函数edi : 函数参数 rsi/esi : 函数参数 下面我们进行O3优化下看 [rootdsmartLINUX_ASM]$gcc main_add.c -S -O3 -o main_add.asm 代码确实少了些 .file main_add.c .section .rodata.str1.1,aMS,progbits,1.LC0: .string data3 %d \n .section .text.unlikely,ax,progbits.LCOLDB1: .section .text.startup,ax,progbits.LHOTB1: .p2align 4,,15 .globl main .type main, functionmain:.LFB11: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 movl $2, %esi movl $1, %eax#APP# 9 main_add.c 1 movl %eax, %eax addl %esi, %esi # 0 2#NO_APP movl $.LC0, %edi xorl %eax, %eax call printf xorl %eax, %eax addq $8, %rsp .cfi_def_cfa_offset 8 ret .cfi_endproc.LFE11: .size main, .-main .section .text.unlikely.LCOLDE1: .section .text.startup.LHOTE1: .ident GCC: (GNU) 5.5.0        .section        .note.GNU-stack,,progbits 结果优化的不像人样了,volatile 也无法禁止优化内嵌汇编!
http://www.hkea.cn/news/14556489/

相关文章:

  • 百度给企业做网站吗成都设计院招聘
  • 开平建设局网站seo网站标题
  • 宁波市有哪些网站建设公司全网营销课程
  • jquery代码做的网站安徽注册公司网上申请入口
  • 湖南门户网站设计公司网站别人做的收到方正侵权
  • 如何做网站图标淘宝网站怎样做
  • 网站流量与广告费app官网登录入口
  • 做网站 徐州做网页和网站一样吗
  • 河北网站建设seo优化营销制作设计站长工具中文
  • 营销型网站 易网拓大连比较好的网站公司吗
  • 深圳网站设计公司费用是wordpress 服务器权限
  • 网站建设入门基础怎么做网站宣传
  • 关于网站开发的论文文献网络公司注册资金最低标准
  • 外贸模版网站地方网站源码
  • 蛋糕网站模版近期十大热点新闻
  • 有什么免费的网站东戴河网站建设
  • 网站建设栏目规划今天的新闻摘抄
  • 公司网站建设推合同国外便宜域名注册商
  • 泉州网站平台建设公司微网站建设使用程序
  • 免费网站建设朋友交流wordpress安全登录插件下载失败
  • 交通银行网站开发如何用代码制作网站
  • 济南网站推广网站开发的认知
  • 佛山网站建设推荐佛山网络优化推广公司
  • 什么是电子商务网站建设的基本要求怎么制作网站平台电话
  • 网站设计公司网站设计如何保护网站域名
  • 建设开源社区网站什么意思网站开发财务
  • 做暧免费网站论坛网站开发开题报告
  • 一个网站 多个域名个人网站制作流程
  • 网站管理公司排名上海网站制作价格
  • 网站建设明薇通网络不错网页显示站点不安全