Tag: 组装

在程序集中完全编写操作系统有什么好处?

MenuetOS是完全用Assembly编写的操作系统的一个例子。 在Assembly中编写它而不是像C这样的低级编程语言有什么好处吗?

从我们按下键盘上的键开始,直到它出现在您的word文档中

这个问题在我的求职面试中……我只是想看看我是否提供了所有细节……

访问C中的特定内存位置

在汇编语言中,我们有类似的说明 Movl AX, [1000] 这允许我们访问特定的内存位置。 但是在C中我们能做类似的事吗? 当然我知道使用asm()的内联汇编代码将允许你这样做。 但我想了解一些C特定技术来实现这一目标。 我尝试了以下代码并得到了分段错误 int *ptr=0xFE1DB124; 由于下面给出的代码识别出内存位置,这再次令人困惑, int var; printf(“\nThe Address is %x”,&var); 所以内存位置可用,但我仍然得到分段错误。

您知道哪些技术可以避免条件分支?

有时CPU占用大部分时间的循环经常会有一些分支预测错误(错误预测)(接近.5概率)。我在非常孤立的线程上看到了一些技术但从未列出过。 我所知道的那些已经解决了条件可以变为bool并且以某种方式使用0/1来改变的情况。 是否有其他可以避免的条件分支? 例如(伪代码) loop () { if (in[i] < C ) out[o++] = in[i++] … } 可以重写,可能会失去一些可读性,用这样的东西: loop() { out[o] = in[i] // copy anyway, just don’t increment inc = in[i] < C // increment counters? (0 or 1) o += inc i += inc } 此外,我已经看到了野外技术在某些环境中改变了&&和&条件,现在正在逃避我的思绪。 我是这个优化级别的新手,但确实感觉还有更多。

C中的局部和静态变量

编译时: // external definitions int value1 = 0; static int value2 = 0; gcc编译器生成以下程序集: .globl value1 .bss .align 4 .type value1, @object .size value1, 4 value1: .zero 4 .local value2 .comm value2,4,4 但是,当我将变量初始化为零以外的值时,例如: // external definitions int value1 = 1; static int value2 = 1; gcc编译器生成以下内容: .globl value1 .data .align 4 .type value1, @object .size […]

_malloc在assembly中到底做了什么?

public main main proc near push ebp mov ebp, esp and esp, 0FFFFFFF0h sub esp, 30h mov dword ptr [esp], 8 ; size call _malloc mov [esp+2Ch], eax mov dword ptr [esp+4], 4 mov eax, [esp+2Ch] mov [esp], eax call __start 上面的代码代表了我正在处理的大型项目的一部分。 我试图将此代码转换为C等效,但我很难理解malloc的工作原理。 我估计8个字节将是被分配的内存的大小; 但是,我不确定这条线。 mov eax, [esp+2ch] malloc对eax做了什么? 那么这是等效的C代码吗? int main(void) { int *ptr1; […]

复制BLAS矩阵乘法性能:我能匹配吗?

背景 如果您一直关注我的post,我试图复制Kazushige Goto关于方阵乘法C = AB的开创性论文中的结果。 我在这里可以找到关于这个主题的最后一篇文章。 在我的代码版本中,我遵循Goto的内存分层和打包策略,内核使用128位SSE3内在函数计算2×8的C块。 我的CPU是i5-540M,超线程关闭。 有关我的硬件的其他信息可以在另一篇文章中找到,并在下面重复。 我的硬件 我的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 flops/core/cycle ) * ( 1 […]

优化Microsoft Visual Studio编译器生成的程序集

我正在开发一个矩阵乘法项目。 我已经能够编写C代码,并且我能够使用Microsoft visual studio 2012编译器为它生成汇编代码。 编译器生成的代码如下所示。 编译器使用了SSE寄存器,这正是我想要的,但它不是最好的代码。 我想优化这段代码并用C代码内联编写,但我不理解汇编代码。 基本上汇编代码仅适用于矩阵的一个维度,下面的代码仅适用于4乘4矩阵。 我怎样才能使它对n * n矩阵大小有益。 C ++代码如下所示: #define MAX_NUM 10 #define MAX_DIM 4 int main () { float mat_a [] = {1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4.0}; float mat_b [] = {1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, […]

如何在汇编语言中使用c库函数fgets?

如标题所述,如何在汇编语言中使用c库函数fgets? 实际上,我想知道如何获取stdin的文件指针。 感谢您的回复。

比较2个数字与汇编

我有以下代码。 我想完成汇编代码,如下所示: int main(void) { int x = 10; int i=0; label1: asm (…..) // code to add here: if i>=x then jump to label2 printf(“%d\n”,i); i++; asm (…..) // code to add here: jump to label 1 label2: printf(“out\n”); } 我的机器是x86,操作系统是Ubuntu 12