Tag: 内联汇编

使用cmpxchg8b获得无符号长度的预期输出

我正在尝试编写一个简单的比较和交换内联汇编代码。 这是我的代码 #include #include #include static inline unsigned long cas(volatile unsigned long* ptr, unsigned long old, unsigned long _new) { unsigned long prev=0; asm volatile(“lock cmpxchg8b %0;” : “=m”(prev) : “m”(*ptr),”a”(old),”c”(_new) ); return prev; } int main() { unsigned long *a; unsigned long b=5,c; a=&b; c=cas(a,b,6); printf(“%lu\n”,c); return 0; } 理想情况下,此代码应打印5但是打印0.我的代码有什么问题?请帮助。

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;” […]

如何在运行时使用GCC和内联asm检测CPU体系结构类型?

我需要找到CPU的架构类型。 我没有访问/ proc / cpuinfo,因为机器正在运行syslinux。 我知道有一种方法可以使用内联ASM,但我相信我的语法不正确,因为我的变量iedx没有正确设置。 我和ASM一起苦苦挣扎,绝不是专家。 如果有人有任何提示或可以指出我正确的方向,我会非常感激。 static int is64Bit(void) { int iedx = 0; asm(“mov %eax, 0x80000001”); asm(“cpuid”); asm(“mov %0, %%eax” : : “a” (iedx)); if ((iedx) && (1 << 29)) { return 1; } return 0; }

在C中使用内联汇编进行位奇偶校验?

我正在尝试计算大量uint64的位奇偶校验 。 比特奇偶校验是指接受uint64的函数,如果设置的比特数是偶数则输出0,否则为1。 目前我正在使用以下function(@Troyseph,在这里找到): uint parity64(uint64 n){ n ^= n >> 1; n ^= n >> 2; n = (n & 0x1111111111111111) * 0x1111111111111111; return (n >> 60) & 1; } 相同的SO页面具有以下汇编例程(由@papadp提供): .code ; bool CheckParity(size_t Result) CheckParity PROC mov rax, 0 add rcx, 0 jnp jmp_over mov rax, 1 jmp_over: ret CheckParity ENDP END […]

汇编代码fsqrt和fmul指令

我正在尝试使用汇编代码在此函数中计算1.34 * sqrt(lght),但我收到的错误如下: ‘_asm’未声明(在此函数中首次使用)每个未声明的标识符仅针对预期的’;’中出现的每个函数报告一次 在'{‘之前 我一直在研究如何解决这个问题,但找不到太多的信息。 有人可以建议一种让这个工作的方法吗? 我的代码是: double hullSpeed(double lgth) { _asm { global _start fld lght; //load lght fld st(0); //duplicate lght on Top of stack fsqrt; square root of lght fld st(0); //load square result on top of stack fld 1.34; //load 1.34 on top of stack fld st(i); duplicate 1.34 on […]

何时在扩展GCC内联汇编中使用earlyclobber约束?

我知道何时使用补鞋匠列表(例如列出在程序集中修改的寄存器,以便它不被选择用作输入寄存器等),但我无法绕过早期约束条件& 。 如果列出输出,那是否已经意味着输入不能使用所选寄存器(除了匹配数字约束)? 例如: asm( “movl $1, %0;” “addl $3, %0;” “addl $4, %1;” “addl %1, %0;” : “=g”(num_out) : “g”(num_in) : ); 输出变量会不会甚至需要? 编译器应该知道为输出选择的寄存器,因此知道不要将它用于输入。

内联asm是ANSI C标准的一部分吗?

我一直认为这是因为许多IDE和语法高亮工具并没有在C中突出显示ASM,但它们总是使用C ++。 内联汇编是否是C标准(ANSII或ISO)的一部分?

x86转换为小写程序集

该程序将char指针转换为小写。 我正在使用Visual Studio 2010。 这是另一个问题,但更简单易读,更直接。 int b_search (char* token) { __asm { mov eax, 0 ; zero out the result mov edi, [token] ; move the token to search for into EDI MOV ecx, 0 LOWERCASE_TOKEN: ;lowercase the token OR [edi], 20h INC ecx CMP [edi+ecx],0 JNZ LOWERCASE_TOKEN MOV ecx, 0 在我的OR指令中,我试图将包含地址的寄存器更改为全部小写,我一直得到未处理的exception…访问冲突,没有括号什么,我没有得到错误但没有变得更低。 任何建议? 这是另一个问题的一些更大的代码的一部分,但我把它分解了,因为我只需要这个解决方案。

从c调用汇编函数

我试图从c调用汇编函数,但我不断收到错误。 .text .globl integrate .type integrate, @function integrate: push %ebp mov %esp, %ebp mov $0,%edi start_loop: cmp %edi,1024 je loop_exit mov 8(%ebp),%eax mov 12(%ebp),%ecx sub %eax,%ecx add %edi,%ecx incl %edi jmp start_loop loop_exit: movl %ebp, %esp popl %ebp ret 这是我的汇编函数,名为integrate.s的文件。 #include extern int integrate(int from,int to); void main() { printf(“%d”,integrate(1,10)); } inheritance人我的代码。 function.c:5:6: warning: return […]

如何在GCC内联汇编中使用标签?

我正在尝试学习x86-64内联汇编并决定实现这个非常简单的交换方法,只需按升序排序a和b : #include void swap(int* a, int* b) { asm(“.intel_syntax noprefix”); asm(“mov eax, DWORD PTR [rdi]”); asm(“mov ebx, DWORD PTR [rsi]”); asm(“cmp eax, ebx”); asm(“jle .L1”); asm(“mov DWORD PTR [rdi], ebx”); asm(“mov DWORD PTR [rsi], eax”); asm(“.L1:”); asm(“.att_syntax noprefix”); } int main() { int input[3]; scanf(“%d%d%d”, &input[0], &input[1], &input[2]); swap(&input[0], &input[1]); swap(&input[1], &input[2]); swap(&input[0], &input[1]); […]