在GCC中编译时在C中编辑操作的ASM结果

在GCC中编译时在C中编辑操作的ASM结果,c,gcc,assembly,C,Gcc,Assembly,我和我的朋友有一个计算机架构项目,我们真的不知道如何去做。我希望你至少能给我们指出正确的方向,让我们知道该找什么。由于我们的教授并不擅长解释我们真正需要做的事情,而且主题也相当模糊,我们将从头开始 我们的任务是以某种方式“编辑”GCC,以不同的方式处理某些操作。例如,当您在.c程序中添加两个char参数时,它使用addb。我们需要将其更改为f.e.16位寄存器(addl),而无需在编译过程中使用不必要的参数(只是常规的gcc p.c-OP)。在这一点上,它为什么或者会起作用并不重要。 我们想知道

我和我的朋友有一个计算机架构项目,我们真的不知道如何去做。我希望你至少能给我们指出正确的方向,让我们知道该找什么。由于我们的教授并不擅长解释我们真正需要做的事情,而且主题也相当模糊,我们将从头开始

我们的任务是以某种方式“编辑”GCC,以不同的方式处理某些操作。例如,当您在.c程序中添加两个char参数时,它使用addb。我们需要将其更改为f.e.16位寄存器(addl),而无需在编译过程中使用不必要的参数(只是常规的gcc p.c-OP)。在这一点上,它为什么或者会起作用并不重要。
我们想知道如何在GCC内部进行更改,我们甚至可以开始寻找,因为除了制作插件/扩展之外,我找不到任何关于类似任务的信息。有什么我们可以读到的或者我们可以使用的吗?

在C中,“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
),具体取决于您想要的内容。您可能需要将结果设置为
,或者实际获得输出16位8086代码的编译器版本

首先想到的是正确修改GCC源代码并重新编译它。您尝试过这样做吗?
addl
将使用32位寄存器。好像你误解了一些事情。请给出一个详细的问题描述。@SamProtsenko这也是我想到的第一件事,但对于我们所看到的情况来说,它非常复杂,我们不知道从哪里开始。@fuzzxl的意思是addw,我的错。你能提供一些关于你的问题的详细信息吗?到目前为止,它的规格还不明确。