Tag: 指令

OpenMP指令如何由编译器处理

我想知道编译器如何处理OpenMP指令,比如gcc? 例如,在此代码中 int main(int argc, char *argv[]) { #pragma omp parallel printf(“Hello, world.\n”); return 0; } gcc的预处理器是否通过将OpenMP指令替换为其他代码来修改C代​​码? 在预处理之后和组装之前的代码是什么? 感谢致敬!

如何按指令读取二进制可执行文件?

有没有办法以编程方式从x86架构上的二进制可执行文件中读取给定数量的指令? 如果我有一个简单的C程序hello.c的二进制文件: #include int main(){ printf(“Hello world\n”); return 0; } 在使用gcc编译之后,反汇编函数main如下所示: 000000000000063a : 63a: 55 push %rbp 63b: 48 89 e5 mov %rsp,%rbp 63e: 48 8d 3d 9f 00 00 00 lea 0x9f(%rip),%rdi # 6e4 645: e8 c6 fe ff ff callq 510 64a: b8 00 00 00 00 mov $0x0,%eax 64f: 5d pop %rbp […]

模拟jg指令(datalab的isGreater)

我正在做CSAPP的datalab,即isGreaterfunction。 这是描述 isGreater – if x > y then return 1, else return 0 Example: isGreater(4,5) = 0, isGreater(5,4) = 1 Legal ops: ! ~ & ^ | + <> Max ops: 24 Rating: 3 x和y都是int类型。 所以我考虑模拟jg指令来实现它。这是我的代码 int isGreater(int x, int y) { int yComplement = ~y + 1; int minusResult = x + yComplement; […]

有没有办法检查宏是否已定义,并且它同时等于某个值

我经常使用类似对象的预处理器宏作为C代码中的布尔标志来打开和关闭代码段。 例如 #define DEBUG_PRINT 1 然后像使用它一样 #if(DEBUG_PRINT == 1) printf(“%s”, “Testing”); #endif 但是,如果包含#define的头文件忘记包含在源代码中,则会出现问题。 由于未声明宏,因此预处理器将其视为等于0,并且#if语句永远不会运行。 当忘记包含头文件时,可能发生非预期的,不守规矩的行为。 理想情况下,我希望能够检查宏是否已定义,并在一行中检查它是否等于某个值。 如果未定义,则预处理器会抛出错误(或警告)。 我正在寻找以下内容: #if-def-and-true-else-throw-error(DEBUG_PRINT) … #endif 它就像#ifdef和#if的组合,如果它不存在,则使用#error 。 我已经探索了一些途径,但是,预处理器指令不能在#define块中使用,据我所知,如果在内部使用宏时没有定义宏,则没有预处理器选项来抛出错误/警告#if语句。

BITWISE AND操作如何在C程序中占用比ARITHMETIC ADDITION操作更多的CPU时钟?

我想测试按位运算是否真的比算术运算更快。 我以为他们是。 我写了一个小的C程序来测试这个假设,令我惊讶的是,加法平均比按位AND运算少。 这对我来说是令人惊讶的,我无法理解为什么会这样。 根据我所知的附加,来自较低有效位的进位应该被携带到下一位,因为结果也取决于进位。 对我来说,逻辑运算符比加法更慢是没有意义的。 我的鳕鱼在下面: #include #include int main() { int x=10; int y=25; int z=x+y; printf(“Sum of x+y = %i”, z); time_t start = clock(); for(int i=0;i<100000;i++)z=x+y; time_t stop = clock(); printf("\n\nArithmetic instructions take: %d",stop-start); start = clock(); for(int i=0;i<100000;i++)z=x&y; stop = clock(); printf("\n\nLogic instructions take: %d",stop-start); } 一些结果: Arithmetic instructions take: […]

x86指令缓存是如何同步的?

我喜欢这个例子,所以我在c中写了一些自修改代码… #include #include // linux int main(void) { unsigned char *c = mmap(NULL, 7, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE| MAP_ANONYMOUS, -1, 0); // get executable memory c[0] = 0b11000111; // mov (x86_64), immediate mode, full-sized (32 bits) c[1] = 0b11000000; // to register rax (000) which holds the return value // according to linux x86_64 calling convention c[6] […]