- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用GNU作为针对基于ARM Cortex-M3的微控制器(缩略图2指令集)的汇编程序。
在某些示例代码中,我发现诸如.size
,.section
和.type
之类的指令,据我所知是ELF指令。举个例子:
.section .text.Reset_Handler
.weak Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
bl main
b Infinite_Loop
.size Reset_Handler, .-Reset_Handler
.type
指令设置符号的类型-通常设置为%object(意味着数据?)或%function。我不知道这有什么区别。它并不总是包含在内,因此我不确定何时需要使用它。
.thumb_func
指令。从我阅读的内容来看,它可能等同于:
.thumb
.type Symbol_Name, %function
.size
应该设置与符号关联的大小。当需要时,我不知道。这是默认计算得出的,但可以用此伪指令覆盖吗?如果是这样-您什么时候要覆盖?
.section
较容易找到文档,我想我对它的用途有一个很清楚的了解,但是我仍然不确定用法。以我的理解,它会在不同的ELF部分之间切换(对于代码,使用
text
,对于可写数据使用
data
,对于未初始化的数据使用
bss
,对于常量使用
rodata
,等等),并在需要时定义新的。我猜您会根据是否定义代码,数据,未初始化的数据等在这些之间切换。但是,为什么要像上面的示例那样为函数创建一个子节?
最佳答案
多年来,我一直在为arm / thumb编程,很多汇编器,而那里的许多指令却很少。
正如另一个响应者所指出的,.thumb_func非常重要。
例如
.globl _开始
_开始:
b重置
重启:
。臂
.globl一
之一:
加r0,r0,#1
bx lr
。拇指
.globl二
二:
加r0,r0,#2
bx lr
.thumb_func
.globl三
三:
加r0,r0,#3
bx lr
.word二
.word三
.arm或曾经是.code32或.code 32之类的东西告诉它这是arm代码,而不是拇指代码,对于您的cortex-m3,您不需要使用。
同样,.thumb曾经是.code 16或可能仍然有效,相同的处理使下面的代码无法使用。
如果您使用的标签不是您需要从其他文件或间接分支到的全局标签,则不需要.thumb_func。但是为了正确计算到这些全局标签之一的分支地址(lsbit是thumb为1,arm为0),您需要将其标记为thumb或arm标签,而thumb_func这样做,否则必须在分支添加更多代码之前将该位置1,并且不能从C调用该标签。
00000000 <_开始>:
0:eaffffff b 4 <一个>
00000004 <一个>:
4:e2800001加r0,r0,#1
8:e12fff1e bx lr
0000000c <两个>:
c:3002将r0,#2
e:4770 bx lr
00000010 <三>:
10:3003加r0,#3
12:4770 bx lr
14:0000000c andeq r0,r0,ip
18:00000011 andeq r0,r0,r1,lsl r0
直到.thumb为止,汇编器都是所需的arm代码。
根据需要,两个和三个标签/功能都是拇指代码,但是两个标签的地址为偶数,而三个标签的地址为奇数。
最新的代码源工具用于汇编,链接和转储以上示例。
现在对于一切都是thumb(/ thumb2)的cortex-m3来说,thumb_func可能并不那么重要,它可能仅适用于命令行开关(非常容易进行实验以找出答案)。这是一个好习惯,以防万一您从仅拇指的处理器转移到普通的手臂/拇指核心。
汇编程序通常喜欢添加所有这些指令以及使事物看起来/感觉更像高级语言的其他方式。我只是说您不必使用它们,我为arm切换了汇编程序,并为许多不同的处理器使用了许多不同的汇编程序,并且宁愿少即是多的方法,这意味着着重于汇编本身,并使用尽可能少的工具特定项。我通常是例外,但不是规则,因此您可以通过查看编译器输出生成的指令来找出更常用的指令(并通过文档进行验证)。
unsigned int一个(unsigned int x)
{
return(x + 1);
}
.arch armv5te
.fpu softvfp
.eabi_attribute 20,1
.eabi_attribute 21,1
.eabi_attribute 23,3
.eabi_attribute 24,1
.eabi_attribute 25,1
.eabi_attribute 26,2
.eabi_attribute 30,2
.eabi_attribute 18,4
.file“ bob.c”
。文本
.align 2
.global一
。类型一,%功能
之一:
.fnstart
.LFB0:
@ args = 0,假装= 0,框架= 0
@ frame_needed = 0,uses_anonymous_args = 0
@链接寄存器保存消除。
加r0,r0,#1
bx lr
.fnend
.size一,.- one
.ident“ GCC:(Sourcery G ++ Lite 2010.09-50)4.5.1”
.section .note.GNU-stack,“”,%progbits
当将arm和thumb汇编程序或数据与汇编器混合使用时,我确实使用.align,您希望此类平台的汇编程序知道一些明显的信息,例如Thumb指令位于半字边界上,而arm指令则位于字边界上。这些工具并不总是那么聪明。洒.aligns不会受伤
.text是默认值,因此有点多余,但不会造成伤害。 .text和.data是标准属性(不是特定于arm的),如果您要在目标上针对rom和ram的组合进行编译(取决于您对链接脚本的处理方式),那么.text将适用于所有内容。
.size显然是该指令的函数大小。汇编器无法自行解决此问题,因此,如果此函数的大小对您的代码,链接程序脚本,调试器,加载器很重要,那么无论什么情况都需要正确处理,否则就不必费心了。无论如何,函数是一个高级概念,汇编器实际上并不需要函数,而无需声明其大小。而且C编译器当然不在乎,它只是在寻找要分支的标签,而对于arm系列,则是拇指代码或分支的arm代码。
如果您在较长的代码段上不喜欢即时数(ldr rx,= 0x12345678),可能会发现.pool指令(有一个更新的等效项)很有用。有时候,您有时告诉他们,这些工具并不总是足够聪明,无法将这些数据放在无条件分支之后。我认真地说一句懒惰,做标签总是很痛苦的。.word一直都在做,我相信arm和gcc工具都允许该快捷方式,所以我会像其他人一样使用它。
还要注意,llvm向binutils输出一个或多个附加的.eabi_attribute或两个,该代码源的版本/ mods支持该附加.eabi_attribute,但gnu发布的binutils不支持(也许尚未)。两种可行的解决方案是,修改llvm的asm打印功能,使其不编写eabi_attributes或至少不带注释(@)的形式,或者从代码源获取binutils源/ mod,并以这种方式构建binutils。代码源往往倾向于引导gnu(例如,支持thumb2),或者可能会向后移植新功能,因此我认为这些llvm属性不久就会出现在主线binutils中。通过修剪llvm编译代码中的eabi_attributes,我没有遭受任何不良影响。
这是上面相同功能的llvm输出,显然这是我修改以注释掉eabi_attributes的llc。
.syntax统一
@ .eabi_attribute 20,1
@ .eabi_attribute 21,1
@ .eabi_attribute 23,3
@ .eabi_attribute 24,1
@ .eabi_attribute 25,1
@ .eabi_attribute 44,1
.file“ bob.bc”
。文本
.globl一
.align 2
类型一,%功能
一一
@ BB#0:@%entry
加r0,r0,#1
bx lr
.Ltmp0:
.size一,.Ltmp0-一
如果您想真正了解elf专用指令(如果有)的作用,则elf文件格式有充分的文档记录,并且非常容易解析。这些指令中的许多指令对链接器的帮助最大。例如.thumb_func,.text,.data。
关于assembly - GAS ELF何时需要使用.type,.thumb,.size和.section指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4423211/
我正在使用松露部署合约,当我将气体限制指定为我想要用于交易的气体时,我总是会收到超出气体限制的错误。为什么会出现这种情况? 编辑我想做的是将加密小猫 KittyCore.sol 合约部署到我的本地开发
我正在获取不属于自己的代币的 ERC721 转移。有什么帮助吗? 未处理的拒绝(错误):无法估计气体;交易可能会失败或可能需要手动 gas 限制(error={"code":-32603,"messa
我正在使用 Mogsdad here 发布的增强工作流程脚本. 我已经设法解决了一些问题,但目前我遇到的一个问题是本节中出现的错误 - // Record approval or rejection
我让这个函数循环遍历所有工作表,如果工作表未隐藏,则将工作表名称添加到数组 out 中。 function sheetnames() { var sheets = SpreadsheetApp.g
在我的 html 代码中,我调用一个脚本来编辑 Google 表单,然后加载该表单。我的问题是,网页在脚本更新完成之前加载。 google.script.run.c
我需要构建iOS的OpenBLAS库。我选择构建它的 0.3.6 版本。我相信这是该库最新的稳定版本。 您可以在此处找到该库的版本 - https://github.com/xianyi/OpenBL
我正在使用 ganache 创建 10 个以太坊账户。我想将以太坊从一个账户转移到一个智能合约。我通过编写以下两个可靠的智能合约来做到这一点; pragma solidity >=0.4.0 {
我的脚本有时有效,有时会出错。运行调试显示我的 array.sort 可能是问题所在。这是错误: We're sorry, a server error occurred. Please wait a
我目前正在为我工作的公司的分支机构构建一个 Google 网站。作为该网站的一部分,我们有一个托管 Web 应用程序的页面,该应用程序在访问时会获取当前用户的 ID,并使用 JavaScript
Google Apps 脚本支持 Triggers ,那个通行证Events触发功能。不幸的是,开发环境将允许您在不传递参数的情况下测试函数,因此您不能以这种方式模拟事件。如果您尝试,您会收到如下错误
除非我使用 .toLocaleDateString() 方法,否则下面的函数返回的日期比应有的日期少一天。我做错了什么或者这是一个缺陷? function myDate() { var s
嗨,我有以下汇编代码, .export __ls__11NSDOM_EncapFf .text __ls__11NSDOM_EncapFf: /* first load the symbolic co
我试图在不同的侧边栏中调用另一个侧边栏,以在谷歌文档中创建一种选项卡式界面。我不知道如何调用在当前侧边栏的 html 文件中显示新侧边栏的服务器端函数。 这是我的 html 侧边栏按钮布局...(不起
我刚刚开始使用 GAS,所以如果这是一个明显的问题,我将不胜感激任何见解并道歉。我正在尝试实现一个日期选择器,以便用户可以选择一些日期而不是输入它们。我使用此问题中的代码来执行此操作: Returni
Google Apps 脚本支持 Triggers ,即通过Events来触发功能。不幸的是,开发环境将允许您测试没有参数传递的函数,因此您无法以这种方式模拟事件。如果您尝试,您会收到如下错误: Re
我想显示来自 GAS 的数据并自动显示电子表格中每个单元格的数据。我尝试了“appendRow”,但出现错误(超过 2000000 个单元格)。如果我可以“appendRow”,请告诉我。 现在,我尝
GAS 初学者遇到了从 Google Apps 脚本循环中检索所有条件匹配值的问题。 我的电子表格中的一列有日期。条件运算符if (formattedCheckInDate == formattedT
我需要将函数传递的值(例如 20.35)添加到每个选定的单元格。我有一个巨大的列表,下面的函数超时,最多可以运行 6 分钟而无法将添加的结果添加到单元格 如何实现一种解决方法,以便每次在完成计算后立即
似乎有很多关于此的问题,但没有一个完全符合我的需求。 我使用的是 GAS,它不接受正则表达式lookbehind。 我有下面的正则表达式,它应该匹配第五个字符后的 :00。因此忽略前 5 个字符,无论
我有一个 Google App Script Code 代码,要求用户通过 html 自定义对话框输入一些值。对话框中的按钮触发 .gs 文件中的一个函数,我想等待该触发的函数返回,然后再继续其余代码
我是一名优秀的程序员,十分优秀!