- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有各种开源汇编程序,例如 gas , nasm , 和 yasm .它们有不同的pseudo-ops
和macro
语法。对于许多开源项目,汇编程序经过预处理以替换常量和平台条件。
假设您可以使用所有当前的 attributes
和 #pragmas
,gcc
对创建汇编程序有什么限制,不包括翻译性能(编译/汇编到二进制时间)?
我说的不是inline-assembly .
#define MOV(RA,RB) (OXFEB10000UL | RA << 16 | RB)
#define ADD(RA,RB) (OXFEB20000UL | RA << 16 | RB)
#define RET (OXFEB7ABCDUL)
unsigned long add4[] __attribute(section(".text")) =
{
ADD(R0,R1),
ADD(R2,R3),
MOV(R1,R2),
ADD(R0,R1),
RET()
};
我相信使用指针算法可以模拟.
和其他标签
。也许这是一个 XY problem ;我试图理解为什么有这么多汇编程序。似乎一切都可以由预处理器完成,而汇编程序确实是程序员的偏好;或者我缺少技术限制。
我想这可能与“你可以用汇编器做一些你不能用 shell code 做的事”有关。 '.
编辑:我已将其从C 重新标记为编译器。我对汇编程序的技术细节很感兴趣。它只是一个 1-1
翻译和发射重定位(正如编译器所做的那样)还是有更多?我的意思不是让人们像我上面概述的那样编写汇编程序。我试图了解汇编程序在做什么。我不相信有适合汇编程序的龙书。当然,预处理器不能自己创建一个binary
,需要额外的机器;它只翻译文本。
最佳答案
我认为 XY Problem是错误的描述。问题更多的是“需要概念A来评估概念B”。
概念 A:什么是汇编程序?
参见:Assemblers and Loader , 大卫所罗门。 [一些智慧之珠,一些陈旧的琐事]
I very quickly discovered the lack of literature in this field. In strict contrast to compilers, for which a wide range of literature exists, very little has ever been written on assemblers and loaders.
一个汇编器包括,
汇编程序通常是一个 1-1
翻译。但是,通常会存在多种分支和调用变体;通常称为长 和短 版本。使用的操作码将取决于到目的地的距离;需要一个两遍编译器来优化前向分支。Harold 提到
概念 B:使用“C”预处理器作为汇编器。
最好的“C”预处理器可以模拟的是 1-pass 汇编器。一大类CPU/指令可以这样编码;尽管宏可能很麻烦。不会有列表 或外部参照,但大多数人不会错过这些功能。此外,由于预处理器的限制,语法会很奇怪。处理地址修正将很困难,因为标签要么通过使用指针或手工编码来重新使用“C”符号表#define
用于标签偏移量。这将此方法限制为除 basic block 之外的任何内容。 .
YUV/RGB 转换或 MP3 解码等大型汇编程序不太可能以这种方式使用。
多架构代码很常见。例如,ARM wifi 芯片可能会将其代码作为固件嵌入到 Linux 内核中。这种技术可能在这里很有用。但是,针对不同的体系结构使用单独的编译器/汇编器,然后使用 objcopy
嵌入它们要明智得多。
这可能是最有用的。事实上,许多工具,例如链接器和加载器都具有高级功能,可以在运行时修补代码。它还可以用于在运行时有条件地更改例程;函数指针几乎一样快,也更容易理解,更不用说缓存一致性问题了。
另请参阅:Gold Blog , Ian Lance Taylor。 [尽管他使用<templates>
]
关于c - 使用 `GCCs` 预处理器作为汇编程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15465958/
我必须在操作后写入寄存器的目的地和值。 斜体字的字段是我写的。粗体字段(如说明)由我的教授编写。 我曾尝试填写所有字段,但不确定答案。 如果你能告诉我哪里出了问题,我会很高兴,谢谢! :) 最佳答案
bios 中断函数 21h (ah = 1h) 应该从标准输入中读取一个字符并回显它。 我的阅读功能: mov ah, 1h int 21h 所以,如果我按下一个键,它会意识到这一点,
是否有 actionscript 3 的汇编器?类似于 Flasm,但用于 AS3(flasm 是 AS2)。我想将 AS3 程序集编译为独立的 SWF,或将其注入(inject)现有的 SWF。 我
我的汇编代码在调用 xbegin 时引发非法指令。 有什么问题吗? 这是我的代码。 主.c if ( rtm_begin() == 0 ) { //do something. } rtm.S
有人可以用英语解释什么是汇编程序中的相对跳转吗? 最佳答案 它是一个 OP 代码,其操作数将导致执行跳转到相对于当前地址的地址。操作数的值是 偏移 . 假设相对跳转指令保存在地址 0x0005 中,操
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我正在尝试学习 Assembly,并将其用于 64 位。我想用 C 语言编译内联汇编程序,但每次都会出错。 #include int main() { __asm__ ( "mov %rdx, 10
我编写了一个 SIC 汇编程序,除了 I/O 方面外,一切似乎都运行良好。 我已经将目标代码加载到内存中(将 char 格式转换为机器表示形式),但是当我调用 SICRun();执行代码时,我收到一条
我正在学习汇编程序(Nasm、Linux、Ubuntu 16.4、x86_64)并在使用 sys_time 调用时出现问题 (mov eax, 13)。 section .bss time:
在汇编器中: .globl _test _test: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax pushl %eax call printf popl
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在阅读杰夫的精彩著作 assembly step by step ,我在第 8 章中展示了一个汇编程序示例,该程序以这种方式从用户那里获取文件: SECTION .bss ;
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 1年前关闭。 锁定。这个问题及其答案是loc
我有一个简短的问题。我正在使用 MARS 汇编程序(在 MIPS 指令集中编程)并且我有两个 MIPS 文件。一个文件包含我要运行的主要方法,它调用另一个文件中的函数。我的函数前面有 .globl 指
我必须回答以下关于 6502 汇编语言的问题: “在堆栈上,有以下值(顶部元素在前):0x01, 0x02, 0x03, 0x04, 0x05, 0x06地址 0xc000 是指令 jsr 0xABC
我实际上是在学习汇编,我用的是 Gas,但问题是: 1) 我只知道 Intel 语法,我在一个页面上看到使用 intel 语法的 Gas 在某些情况下优化得不是很好。这是正确的还是我错了?我说的是这个
在汇编程序中,我可以使用 MUL 命令并获得 64 位结果 EAX:EDX,我怎样才能在 C 中做同样的事情? http://siyobik.info/index.php?module=x86&id=
作为编译器项目的一部分,我必须为 x86 编写 GNU 汇编程序代码来比较浮点值。我试图找到有关如何在线执行此操作的资源,据我所知,它是这样工作的: 假设我要比较的两个值是浮点堆栈上的唯一值,那么 f
我有一个用 2 个不同的编译器编译的程序: GCC 3.4.4 PowerPC 交叉编译器 GCC 4.8.1 MinGW 编译器 在程序中,我使用了汇编程序指令 .weak 。文档说: 使具有弱绑定
我写了一个简单的 ASM 程序,但 sys_write 没有给出任何输出。我想我对指向 %ecx 的指针犯了一个错误,并且 sys_write 无法访问该字符串 - 但到目前为止我还没有发现我的错误。
我是一名优秀的程序员,十分优秀!