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

时间:2015-04-19 13:54:40

标签: c gcc assembly

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

我们的任务是以某种方式"编辑"海湾合作委员会以不同的方式处理例如,当您在.c程序中添加两个char参数时,它使用addb。我们需要将其改为f.e. 16位寄存器(addl),在编译期间不使用不必要的参数(只需常规gcc p.c -o p)。在这一点上,为什么或它将起作用并不重要。 我们想知道我们如何能够改变GCC内部的内容,我们甚至可以开始查看,除了制作插件/扩展之外我无法找到有关类似任务的任何信息。有没有什么我们可以读到这样的东西或我们可以使用的任何东西?

1 个答案:

答案 0 :(得分:2)

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