Tag: assembly

混合C和汇编文件

我想使用g ++在我的C ++程序中使用裸函数 。 不幸的是,与VC ++不同,g ++不支持裸函数,管理它的唯一方法是在单独的文件中编写自己的汇编代码并与C ++文件链接。 我试图找到一些很好的x86教程来混合汇编和C / C ++文件,但找不到任何好的。 如果您知道任何问题,请告诉我。 请注意,除了在C或程序集中使用它们之外,我不是要求内联汇编而是链接C和汇编文件以及在汇编中声明C的外部变量的方法,反之亦然,以及使用Makefile链接C和asm文件的方法。

使用xchg时我们需要mfence吗?

我有一个基于xchg的assembly和测试assembly锁。 我的问题是: 使用xchg指令时是否需要使用内存防护( mfence , sfence或lfence )? 编辑: 64位平台:采用Intel nehalem

CFI指令意味着什么? (还有一些问题)

好的,这将是一个很长的问题。 我试图理解“缓冲区溢出”是如何工作的。 我正在阅读通过aleph1 粉碎堆栈以获得乐趣和利润 ,并且刚刚获得了以下代码的反汇编: void function(int a, int b, int c) { char buffer1[5]; char buffer2[10]; } void main() { function(1,2,3); } 使用GCC的-S标志的disameembly给了我: .file “example1.c” .text .globl function .type function, @function function: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $48, %rsp movl %edi, -36(%rbp) movl %esi, […]

printf如何在内部工作?

我很好奇printf如何在Linux内部工作。 我不明白它如何将数据写入STDOUT 。 在对内部进行了一些搜索之后,我下载了glibc并查看了源代码: __printf (const char *format, …) { va_list arg; int done; va_start (arg, format); done = vfprintf (stdout, format, arg); va_end (arg); return done; } 找到这个之后,我深入研究了vfprintf函数 – 但该文件大约有2500行不熟悉的C代码。 我正在寻找10,000英尺的解释,如何printf与计算机的内存和输出一起工作,以在屏幕上显示字符。 如果我是汇编代码,我需要做些什么才能完成相同的任务? 它依赖于操作系统吗?

切换机箱组件级别代码

我在cygwin windows上编写C语言。 在完成了一些C编程并熟悉语言后,我想深入了解编译器为我编写的代码做了些什么。 所以我写下了一个包含switch case语句的代码块,并使用以下方法将它们转换为汇编: gcc -S foo.c 这是C源: switch(i) { case 1: { printf(“Case 1\n”); break; } case 2: { printf(“Case 2\n”); break; } case 3: { printf(“Case 3\n”); break; } case 4: { printf(“Case 4\n”); break; } case 5: { printf(“Case 5\n”); break; } case 6: { printf(“Case 6\n”); break; } case 7: […]

在C中使用标签

我只需要一种方法来加载标签的地址,例如MyLabel:例如’src.asm’到例如’src.c’中的变量。 (这些文件将链接在一起)我使用gcc和nasm来组装这些文件。 如何加载标签地址?

如何用最少的指令乘以两个四元数?

经过一番思考后,我想出了以下代码,用于使用SSE乘以两个四元数: #include /* SSE3 intrinsics */ /* multiplication of two quaternions (x, y, z, w) x (a, b, c, d) */ __m128 _mm_cross4_ps(__m128 xyzw, __m128 abcd) { /* The product of two quaternions is: */ /* (X,Y,Z,W) = (xd+yc-zb+wa, -xc+yd+za+wb, xb-ya+zd+wc, -xa-yb-zc+wd) */ __m128 wzyx = _mm_shuffle_ps(xyzw, xyzw, _MM_SHUFFLE(0,1,2,3)); __m128 baba = _mm_shuffle_ps(abcd, abcd, _MM_SHUFFLE(0,1,0,1)); […]

逆向工程c程序

如果分发了这个二进制文件,则每个c程序都转换为机器代码。 由于计算机的指令集众所周知,是否可以取回C原始程序?

NASM汇编数学逻辑

我有一个Linux终端程序集的程序,它应该通过一系列数学操作,将最终值比较为20,然后使用if逻辑,报告或=关系。 代码是: segment .data out_less db “Z is less than 20.”, 10, 0 out_greater db “Z is greater than 20.”, 10, 0 out_equal db “Z is equal to 20.”, 10, 0 segment .bss segment .text global main extern printf main: mov eax, 10 mov ebx, 12 mov ecx, eax add ecx, ebx ;set c (ecx […]

x86汇编:INC和DEC指令和溢出标志

在x86汇编中,当有符号整数上的add或sub操作溢出时,溢出标志置位;当无符号整数上的操作溢出时,置载标志置位。 但是,当涉及到inc和dec指令时,情况似乎有些不同。 根据该网站 , inc指令根本不影响进位标志。 但是我找不到有关inc和dec如何影响溢出标志的任何信息,如果有的话。 发生整数溢出时,是否设置inc或dec设置溢出标志? 对于有符号整数和无符号整数,这种行为是否相同? ============================= 编辑 ==================== ========= 好的,基本上这里的共识是,在设置标志方面,INC和DEC应该与ADD和SUB的行为相同,但进位标志除外。 这也是英特尔手册中的内容。 问题是,当涉及到无符号整数时,我实际上无法在实践中重现这种行为。 请考虑以下汇编代码(使用GCC内联汇编以便更轻松地打印结果。) int8_t ovf = 0; __asm__ ( “movb $-128, %%bh;” “decb %%bh;” “seto %b0;” : “=g”(ovf) : : “%bh” ); printf(“Overflow flag: %d\n”, ovf); 这里我们递减一个带符号的8位值-128。 由于-128是可能的最小值,溢出是不可避免的。 正如预期的那样,打印出: Overflow flag: 1 但是当我们使用无符号值执行相同操作时,行为并不像我预期的那样: int8_t ovf = 0; __asm__ ( “movb $255, %%bh;” […]