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

标签 c gcc assembly

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

我们的任务是以某种方式“编辑”GCC 以区别对待某些操作。例如,当您在 .c 程序中添加两个 char 参数时,它使用 addb。我们需要将其更改为 f.e。 16 位寄存器 (addl),在编译期间不使用不必要的参数(只是常规的 gcc p.c -o p)。在这一点上,它为什么会起作用并不重要。 我们想知道我们如何改变 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),具体取决于您想要什么,您可能需要使结果成为 short 或实际上获得输出 16 位 8086 代码的编译器版本。

关于c - 在 GCC 中编译时在 C 中编辑操作的 ASM 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29730778/

相关文章:

在文本段中创建具有给定大小的 C 函数

assembly - 汇编中的常量

c - 全局声明的变量是外部变量还是静态变量?

指向整数的 char 指针可以测试字节顺序,对吧?

shm_open : DSO Missing From Command Line 上的 C++ Boost 库 undefined reference

c++ - 在回溯期间检索 sigcontext

linux - GDB - 汇编程序返回/bin/sh : 0: Can't open �

Linux,如何反汇编系统调用

c - linux内核中潜在的内存泄漏?

c - 用gets()读char*报 "Core Dumped"错误(C语言)