Tag: 组装

asm in C“’mov’的内存引用太多了”

我看过关于同样错误的post,但我仍然得到错误: too many memory references for `mov’ junk `hCPUIDmov buffer’ after expression …这是代码(mingw编译器/ C :: B): #include iostream using namespace std; union aregister { int theint; unsigned bits[32]; }; union tonibbles { int integer; short parts[2]; }; void GetSerial() { int part1,part2,part3; aregister issupported; int buffer; __asm( “mov %eax, 01h” “CPUID” “mov buffer, edx” );//do […]

如何在C中执行旋转移位

我有一个问题如下所述:如何在没有嵌入式assembly的情况下在C中执行旋转移位。 更具体一点,如何旋转移位32位int 。 我现在在long long int类型的帮助下解决了这个问题,但我觉得它有点难看,想知道是否有更优雅的方法。 亲切的问候。

当我按下键盘上的键时,如何防止重复的字符

我试图学习如何防止键盘发送多个字符到屏幕和DOS下扫描。 我正在使用带有内联汇编的Turbo-C。 如果键盘上输入的字符是: 嗯嗯嗯嗯 在控制台上看到并由scanf处理的字符将是: 我的名字是Haim 基本输出来自C中的代码,我不允许触摸。 我必须实现eliminate_multiple_press和uneliminate_multiple_press而不触及uneliminate_multiple_press的代码。 我到目前为止写的Turbo-C代码是: #include #include #include volatile char key; volatile int i=0; void interrupt (*Int9save) (void); void interrupt kill_multiple_press() { asm{ MOV AL, 0 MOV AH,1 INT 16h PUSHF CALL DWORD PTR Int9save MOV AX,0 } asm{ JZ notSet MOV key, AL MOV AH, 04H INT 16H } notSet: […]

如何保护isr和常规函数共享的全局变量?

假设我有function 1和一个isr routine ,它们共享并更新相同的标志,它们之间没有任何锁定。 系统是单线程的。 while将是一个3臂汇编指令,这意味着它不是primefaces操作,是否可以在非isr和isr函数之间共享一个全局变量而没有任何锁定或保护? function1: while (flag == false); flag = false; 常规: do something flag=true 我不记得有一个Linux内核机制用于在可睡眠和非可睡眠上下文之间进行锁定,例如irq和kernel thread 。 感谢@artless的答案,这里有一些我不确定的问题: 有没有办法我不会错过中断? 内存障碍如何解决问题,当代码在单个cpu上运行时它是否有效? 在不同情境之间使用障碍时的预期行为是什么? 在while loop睡眠可以解决同步问题吗?

优化的2×2矩阵乘法:慢速assembly与快速SIMD

问题 我正在研究高性能矩阵乘法算法,如OpenBLAS或GotoBLAS,我正在尝试重现一些结果。 这个问题涉及矩阵乘法算法的内核。 具体来说,我正在研究计算C += AB ,其中A和B是在我的CPU的峰值速度下类型为double 2×2矩阵。 有两种方法可以做到这一点。 一种方法是使用SIMD指令。 第二种方法是使用SIMD寄存器直接在汇编代码中编码。 到目前为止我看过的是什么 所有相关的论文,课程网页,许多SO Q&As处理主题(太多无法列出),我在我的计算机上编译了OpenBLAS,查看了OpenBLAS,GotoBLAS和BLIS源代码,Agner的手册。 硬件 我的CPU是Intel i5 – 540M。 您可以在cpu-world.com上找到相关的CPUID信息。 微体系结构是Nehalem(westmere),因此理论上每循环每个核心可以计算4个双精度触发器。 我将只使用一个核心(没有OpenMP),因此,对于超线程关闭和4步Intel Turbo Boost,我应该看到( 2.533 Ghz + 4*0.133 Ghz ) * ( 4 DP flops/core/cycle ) * ( 1 core ) = 12.27 DP Gflops的峰值( 2.533 Ghz + 4*0.133 Ghz ) * ( 4 DP […]

在C中,访问我的数组索引更快或通过指针访问更快?

在C中,访问数组索引更快或通过指针访问更快? 我的意思是更快,哪一个会占用更少的时钟周期。 该数组不是常量数组。

记忆围栏如何工作?

我需要了解多核机器中的内存栅栏。 说我有这个代码 核心1 mov [_x], 1; mov r1, [_y] 核心2 mov [_y], 1; mov r2, [_x] 现在没有内存栅栏的意外结果是r1和r2在执行后都可以为0。 在我看来,为了解决这个问题,我们应该在两个代码中都放置内存栅栏,因为仅将它放在一个代码中仍然无法解决问题。 如下…… 核心1 mov [_x], 1; memory_fence; mov r1, [_y] 核心2 mov [_y], 1; memory_fence; mov r2, [_x] 我的理解是正确还是我仍然缺少某些东西? 假设架构是x86。 另外,有人能告诉我如何将内存栅栏放入C ++代码中吗?

LEAL汇编指令有什么作用?

我对它们之间的区别有点困惑 leal -4(%ebp), %eax 和 movl -4(%ebp), %eax 谁可以给我解释一下这个?

大会指针

我的教科书遇到了练习问题。 我必须填写下面显示的C代码的缺失部分: int switch3(int *p1, int *p2, int action) { int result = 0; switch(action) { case 1: // Fill in case 2: // Fill in default: // Fill in } return result; } 我遇到麻烦的原因是因为使用了指针。 我很确定我知道它们是如何工作的,但让我详细说明一下。 本书为我们提供了以下IA32程序集以及注释中的注释。 Arguments: p1 at %ebp+8, p2 at %ebp+12, action at %ebp+16 Registers: result in %edx (initialized to -1) The […]

如何获取基堆栈指针的地址

我正在将应用程序从x86移植到x64。 我正在使用Visual Studio 2009; 大多数代码是C ++,有些部分是纯C。在编译x64时,不支持__asm关键字,我们的应用程序包含内联汇编程序的一些部分。 我没有写这段代码所以我不确切知道应该做什么: int CallStackSize() { DWORD Frame; PDWORD pFrame; __asm { mov EAX, EBP mov Frame, EAX } pFrame = (PDWORD)Frame; /*… do stuff with pFrame here*/ } EBP是指向当前函数堆栈的基指针。 有没有办法在不使用内联asm的情况下获取堆栈指针? 我一直在关注微软提供的内在函数作为内联asm的替代品,但我找不到任何能给我带来帮助的东西。 有任何想法吗? 安德烈亚斯询问用pFrame做了什么。 这是完整的function: int CallStackSize(DWORD frameEBP = 0) { DWORD pc; int tmpint = 0; DWORD Frame; PDWORD pFrame, […]