我和我的朋友有一个计算机架构项目,我们真的不知道如何实现它。我希望您至少能为我们指出正确的方向,以便我们知道要寻找什么。由于我们的教授并不擅长解释我们真正需要做什么,而且主题相当模糊,我们将从头开始。
我们的任务是以某种方式"编辑"GCC,以区别对待某些操作。例如,当您在 .c 程序中添加两个 char 参数时,它使用 addb。我们需要将其更改为 f.e. 16 位寄存器(addl),在编译过程中不使用不必要的参数(只是常规的 gcc p.c -o p)。在这一点上,它为什么或会起作用并不重要。我们想知道我们如何在 GCC 中更改某些内容,我们甚至可以开始寻找,因为除了制作插件/扩展之外,我找不到有关类似任务的任何信息。我们能读到什么关于这样的东西或我们可以使用的东西吗?
中,"char"变量通常作为整数加在一起,因此 C 编译器已经使用 addl
。除非它可以看到使用更小或更快的表单对结果没有影响。
例如这个 C 代码
unsigned char a, b, c;
int i;
void func1(void) { a = b + c; }
void func2(void) { i = b + c; }
为 GCC 提供此汇编程序。
.file "xq.c"
.text
.p2align 4,,15
.globl func1
.type func1, @function
func1:
movzbl c, %eax
addb b, %al
movb %al, a
ret
.size func1, .-func1
.p2align 4,,15
.globl func2
.type func2, @function
func2:
movzbl b, %edx
movzbl c, %eax
addl %edx, %eax
movl %eax, i
ret
.size func2, .-func2
.comm i,4,4
.comm c,1,4
.comm b,1,4
.comm a,1,4
.ident "GCC: (Debian 4.7.2-5) 4.7.2"
.section .note.GNU-stack,"",@progbits
请注意,第一个函数使用 addb
但第二个函数使用 addl
因为在存储结果时,结果的高位将在第一个函数中被丢弃。
此版本的 GCC 正在生成 i686 代码,因此整数是 32 位 ( addl
),具体取决于您想要的内容,您可能需要使结果成为short
或实际获得输出 16 位 8086 代码的编译器版本。