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

怎么用自己电脑做网站服务器做网站域名费一般多少钱

怎么用自己电脑做网站服务器,做网站域名费一般多少钱,住房和城乡建设厅门户网站,好看的中文网站设计想好好熟悉一下llvm开发一个新后端都要干什么#xff0c;于是参考了老师的系列文章#xff1a; LLVM 后端实践笔记 代码在这里#xff08;还没来得及准备#xff0c;先用网盘暂存一下#xff09;#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?… 想好好熟悉一下llvm开发一个新后端都要干什么于是参考了老师的系列文章 LLVM 后端实践笔记 代码在这里还没来得及准备先用网盘暂存一下 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?pwdvd6s 提取码: vd6s  一、第一节 汇编器 独立汇编器可以理解为依赖于 LLVM 后端提供的接口实现的一个独立软件因为 LLVM 和 gcc 在这个地方的实现逻辑不一样。 在 gcc 中编译器和汇编器是两个独立的工具编译器也就是 cc只能生成汇编代码而汇编器 as才用来将汇编代码翻译为二进制目标代码gcc 驱动软件 gcc 将这些工具按顺序驱动起来还包括预处理器、链接器等最终实现从 C 语言到二进制目标代码的功能。但是这样的设计有个缺点每个工具都需要先对输入文件做 parse然后再输出时写入文件反复多次的磁盘读写一定程度影响了编译的效率。 而在 LLVM 中编译器后端本身就可以将中间代码对应 gcc 中 cc 的中间表示翻译成二进制目标文件而不需要发射汇编代码到文件中再重新 parse 汇编文件。当然它也可以通过配置命令行参数指定将中间代码翻译成汇编代码方便展示底层程序逻辑。 但我们目前已经实现的这些功能却无法支持输入汇编代码输出二进制目标文件虽然通常情况下已经不再需要手工编写汇编代码但在特殊情况下比如引导程序、调试特殊功能、需要优化性能等场合下还是需要编写汇编代码所以一个汇编器依然是很重要的。 显然我们之前的章节已经把和指令相关的汇编表示都在 TableGen 中实现了这一节中最核心的就是实现一个汇编器的 parser并将其注册到 LLVM 后端框架中并使能汇编功能。并且汇编器的核心功能在 LLVM 中也已经实现了原理其实就是一个语法制导的翻译我们要做的只是重写其中部分和后端架构相关的接口。 我还实现了一个额外的特性。当我们仅使用汇编器时编译器占用的寄存器 $sw就可以被释放出来当做普通寄存器用了所以我们重新定义一下 GPROut 这个寄存器类别并将 Cpu0.td 拆分成两份将它拆分为 Cpu0Asm.td 和 Cpu0Other.td前者会在调用汇编器时被使用到而后者保持和之前一样的设计。 因为 $sw 寄存器是编译器用来记录状态的如果只编写汇编代码我们认为程序员有义务去维护这个寄存器中的值什么时候是有效的进而程序员就可以在认为这个寄存器中值无效时把它当做普通寄存器来使用。我们的标量寄存器有很多多这样一个寄存器的意义并不是很大这里依然这么做其实是想展示一下 TableGen 机制的灵活性。 在 Cpu0 的后端代码路径下新建一个子目录 AsmParser在这个路径下新建 Cpu0AsmParser.cpp 用来实现绝大多数功能。 1.1 修改前的效果 llvm-mc -triplecpu0 -filetypeobj test.s -o test.o 提示我们当前的汇编器不支持cpu0架构。llvm-mc是llvm的汇编器能够将汇编文件.s编成目标文件.o。 1.2 修改 1.2.1 AsmParser/Cpu0AsmParser.cpp 作为一个独立的功能模块使能它的 DEBUG 信息名称为 cpu0-asm-parser声明一些新的 class Cpu0AsmParser 作为核心类用来处理所有汇编 parser 的工作我们稍后介绍Cpu0AssemblerOptions 这个类用来做汇编器参数的管理Cpu0Operand 类用来解析指令操作数因为指令操作数可能有各种不同的类型所以将这部分单独抽出来实现。 Cpu0AsmParser 类继承了基类 MCTargetAsmParser并重写了部分接口而有关于汇编 parser 的详细逻辑可以参考 AsmParser.cpp 中的实现。两个比较重要的重写函数ParseInstruction() 和MatchAndEmitInstruction()。汇编器在做 parser 时要先做 Parse然后再对符合语法规范的指令做指令匹配前者的关键函数就是ParseInstruction()后者的关键函数就是MatchAndEmitInstruction()。 在 ParseInstruction() 中根据传入的词法记号解析指令助记符存入 Operands 容器中然后在后边依次解析每个操作数也存入 Operands 中。对于不满足语法规范的输入比如操作数之间缺逗号等这种问题直接报错并退出。在解析操作数时调用了 ParseOperand() 接口这也是一个很重要的接口专用来解析操作数我们也重写了这个接口以适应我们的类型尤其是地址运算符。ParseInstruction() 执行完毕后会返回到 AsmParser.cpp 中的 parseStatement 方法中并在做一些分析后再调用到 MatchAndEmitInstruction() 方法。 在 MatchAndEmitInstruction() 函数中将 Operands 容器对象传入。首先调用 MatchInstructionImpl 函数这个函数是 TableGen 参考我们的指令 td 文件生成的 Cpu0GenAsmMatcher.inc 文件自动生成的。匹配之后如果成功了还需要做额外的处理如果这个是伪指令需要汇编器展开这种指令我们设计了几条在之后会提到这种指令需要调用 expandInstruction() 函数来展开后者根据对应指令调用对应的展开函数如果不是伪指令就调用 EmitInstruction() 接口来发射编码这个函数与我们前边章节设计指令输出的接口是同一个也就是说在汇编 parser 之后的代码是复用了之前的代码。匹配如果失败了则做简单处理并返回这里我们只实现了几种简单的情况如果你的后端有一些 TableGen 支持不了的指令形式也可以在这里做额外的处理不过还是尽量去依赖 TableGen 的匹配表为好。 在 ParseOperand() 函数中将前边 parse 出来的 Operands 容器对象传入。首先调用 MatchOperandParserImpl() 函数来 parse 操作数这个函数也是 Cpu0GenAsmMatcher.inc 文件中定义好的。如果这个函数 parse 成功就返回 否则继续在下边完成一些自定义的 parse 动作在一个 switch 分支中根据词法 token 的类型来分别处理。其中对于 Token可能是一个寄存器调用 tryParseRegisterOperand() 函数来处理如果没有解析成功则按照标识符处理对于标识符、加减运算符和数字等 Token 的情况统一调用 parseExpression() 来处理对于百分号 Token表示可能是一个重定位信息比如 %hi($r1)则调用 parseRelocOperand() 函数来处理。 其他函数就不一一说明了其中包括很多在 parse 操作数时不同的操作数下的特殊处理还有伪指令的展开动作重定位操作数的格式解析以及生成重定位表达式寄存器、立即数的 parse还有汇编宏指令的解析比如 .macro, .cpload 这一类。 在最后这些代码都实现完毕后需要调用 RegisterMCAsmParser 接口将汇编 parser 注册到 LLVM 中这个步骤写入到 LLVMInitializeCpu0AsmParser() 函数中。 1.2.2 Cpu0RegisterInfoGPROutForAsm.td 在这个文件中我们定义的 GPROut 类别是支持完整的 CPURegs 的。 1.2.3 Cpu0RegisterInfoGPROutForOther.td 在这个文件中我们定义的 GPROut 类别不包含 $sw 寄存器。 1.2.4 Cpu0Asm.td 由 Cpu0.td 拆分出来的文件和 Cpu0Other.td 对应。 1.2.5 Cpu0Other.td 由 Cpu0.td 拆分出来的文件和 Cpu0Asm.td 对应。 1.2.6 Cpu0.td 删掉 Target.td、Cpu0RegisterInfo.td 文件的包含。添加汇编器 parser 在 td 中的定义并注册到 Cpu0 的属性中。这些都是常规操作。 1.2.7 Cpu0InstrFormats.td 增加针对伪指令的描述性 class继承自 Cpu0Pseudo 类。 1.2.8 Cpu0InstrInfo.td 增加 Operand 操作数 class 中 ParserMatchClass 和 ParserMethod 属性的描述只有这样td 中的操作数才会支持汇编 parse。 定义伪指令 LoadImm32Reg, LoadAddr32Reg, LoadAddr32Imm这几个指令会在 Cpu0AsmParser.cpp 中实现对应的展开函数 expandLoadImm(), expandLoadAddressImm 和 expandLoadAddressReg这些函数统一放到 expandInstruction() 中管理后者在 MatchAndEmitInstruction() 函数中被调用。 1.2.9 Cpu0RegisterInfo.td 将 GPROut 的定义移动到 Cpu0RegisterInfoGPROutForAsm.td 和 Cpu0RegisterInfoGPROutForOther.td 中。 1.3 修改后效果 用上述命令能正确生成.o文件我们还可以使用之前适配的反汇编器进行反汇编查看。
http://www.hkea.cn/news/14496524/

相关文章:

  • asp与php做网站哪个好类似源码之家的网站
  • 用云做网站网站制作费用及后期运营
  • 佛山网站建设培训django做的网站模板
  • 网站模拟效果营销和销售的区别
  • 网站的设计页面插件功能wordpress
  • 广州企业网站找哪里建工网首页
  • 网站设计和建设自考题公司网站建设计划
  • 网站建设CEO微信公众号排版app
  • 厦门网站建设114帮人做任务的网站
  • 潍坊制作网站的公司天元建设集团有限公司租赁公司
  • 如何将自己做的网站变成中文网站建设和微站建设的区别
  • 网站做支付功能服装类电子商务网站建设报告
  • 网站建设合同书-详细版怎么做网页设计稿
  • 建设银行龙卡信用卡在境外网站支付建设营销型网站哪家好
  • 网站备案流程和规则郑州医院排名第一妇科
  • 英语网站 php源码购物网站哪个最好
  • 网站打不开是什么原因plc培训机构哪家最好
  • 电子商务网站建设的盈利模式优酷网站建设有何特点
  • 潍坊网站建设 世纪环球16楼上海到北京的火车
  • 惠州网站建设翻译罗店网站建设
  • 室内装饰网站模板昆明做网站建设的公司排名
  • 大型门户网站建设哪专业亦庄建设局网站
  • 资讯门户网站 dede在阿里巴巴上做网站需要什么
  • AD这个软件做网站用得着吗wordpress如何修改顶部栏
  • 电子商务网站和普通网站的区别网站建设什么代码最简单
  • 网站界面设计起着决定性作用免费主页空间申请网站
  • 洛阳建设企业网站织梦网站安装出现404 not found
  • 吉安做网站公司网站怎么重建
  • 数码印花图案设计网站网页设计和网站开发有什么区别
  • 住房城乡建设部官网站有网络但是网页打不开