Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 是否有支持用户定义重新定位的对象文件格式?_Assembly_Linker_Object Files - Fatal编程技术网

Assembly 是否有支持用户定义重新定位的对象文件格式?

Assembly 是否有支持用户定义重新定位的对象文件格式?,assembly,linker,object-files,Assembly,Linker,Object Files,我目前正在研究一个模拟的CPU(实际上并不存在),并且没有针对这种CPU类型的工具 我们的想法是编写一个汇编器,它只输出包含.byte行的“汇编”文件,这样我就可以使用“x86 binutils”工具链来创建可执行文件(my as->x86 as->ld->objcopy) 例如: input.s: instx r1, 0x12 insty r2, 0x34 instz r3, 0x5678 output.s: .byte 0xa1, 0x12 # in

我目前正在研究一个模拟的CPU(实际上并不存在),并且没有针对这种CPU类型的工具

我们的想法是编写一个汇编器,它只输出包含
.byte
行的“汇编”文件,这样我就可以使用“x86 binutils”工具链来创建可执行文件(
my as
->
x86 as
->
ld
->
objcopy

例如:

input.s:
   instx r1, 0x12
   insty r2, 0x34
   instz r3, 0x5678

output.s:
   .byte 0xa1, 0x12         # instx r1, 0x12
   .byte 0xb2, 0x34         # insty r2, 0x34
   .byte 0xc3, 0x56, 0x78   # instz r3, 0x5678
我的问题是搬迁。例如:

input.s:
    instxy r4, symbol

output.s:
    .byte 0xd4, (((symbol&0xF000)>>8)|((symbol&0xF0000)>>16))
。。。但“符号”是在另一个对象文件或标签中定义的符号,其地址在链接时间之前是未知的

似乎有:非标准搬迁;所以至少我不是第一个需要这个功能的人

所以我的问题是,GNUBINUTILS工具链(或一个附加的GNU工具)是否已经提供了定义“用户定义”重定位类型的简单方法

可能还有其他对象文件格式支持此功能

我已经知道如何实现一个附加工具,将此功能添加到现有的“binutils”工具链中,但我希望避免在已经实现此功能时花费时间实现一个新工具

编辑


由于似乎这样的功能还不存在,我实现了我的解决方案并在上发布了它-只是为了防止其他人需要这样的功能。

如果使用ELF,您可以通过自定义重新定位来定义自己的机器类型。但是,您必须修补libbfd以支持新的体系结构。我认为不存在这种支持,尤其是在x86中。是否已有支持单独的hi/lo字节地址的体系结构?e、 g.AVR?我知道一些非x86格式支持对32位地址的高/低部分进行重定位,例如MIPS
lui$1、%hi(symbol)
/
ori$1、%1、%lo(symbol)
。如果这很重要,您需要如何定制?我是否遗漏了什么,或者该表达式只是
(symbol>>8)&0xFF00
,即符号的高位字节,填充字节为零。为什么要分别编写这两个半字节?@PeterCordes这两个半字节只是一个奇怪的重新定位类型的例子,其他任何CPU都不支持。我目前使用的CPU每个地址使用16位(因此sizeof(uint16)=1),对于某些指令,必须提取地址的6位……但按照您编写的方式,一个字节的两半最终都在一起,因此您编写的表达式简化为
(symbol>>8)&0xFF00
,或
(symbol&0xFF000)>>8
。我在问你是不是想写一些更棘手的东西,比如一个小口交换(或者如果我在简化时犯了一个错误)@PeterCordes也许我做错了什么。但我想展示一个重定位,其中值0xABCDE以0xBA结束(因此高位和低位甚至颠倒)。PowerPC VLE指令集就是已经存在这种重新定位的一个例子。