Tag: assembly

GAS:.cfi_def_cfa_offset的解释

我想要解释一下GCC生成的汇编中的.cfi_def_cfa_offset指令所使用的值。 我隐约知道.cfi指令涉及调用框架和堆栈展开,但是我想要更详细地解释为什么,例如,在GCC输出的程序集中使用值16和8来编译下面的C程序在我的64位Ubuntu机器上。 C程序: #include <stdio.h> int main(int argc, char** argv) { printf("%d", 0); return 0; } 我在源文件test.c上调用了GCC,如下所示: gcc -S -O3 test.c 我知道-O3支持非标准优化,但为了简洁,我想限制生成的程序集的大小。 生成的程序集: .file "test.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "%d" .text .p2align 4,,15 .globl main .type main, @function main: .LFB22: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 xorl %edx, %edx movl $.LC0, %esi movl $1, %edi […]

程序集绑定redirect和代码分析

我在Visual Studio 2010的Mvc 3.0.0.0项目中使用DotNetOpenAuth(它引用System.Web.Mvc版本1.0.0.0)。 我正在使用程序集绑定redirect,如下所示: <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> 一切工作正常,除了代码分析,给了我以下错误: – CA0001:读取模块X时遇到以下错误:无法parsing程序集引用:System.Web.Mvc,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35。 和 CA0058:找不到引用的程序集“System.Web.Mvc,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”。 这个程序集是分析所需要的,并被引用:X. 有没有办法让代码分析工具尊重程序集绑定redirect?

我应该如何开始编写设备驱动程序?

我想学习如何编写设备驱动程序,因为我认为这将是有趣的。 我使用Mac OS X Macbook,但是我也有一台Ubuntu机器(在Mac Min上运行)。 我对C很熟悉,现在正在阅读这本书 。 我在网上find了一些链接,例如Mac开发中心 。 我这样做是因为它会很有趣。 我认为,由于我写的软件,看到硬件运行会有真正的满足感。 我想我想要的是一些提示或build议和指导,有没有人知道没有驱动程序的设备列表,或者我可以写一个已经支持的东西的驱动程序(宁愿前者,所以我实际上提供价值)。 什么是一个好的开始使用的设备? 我咬的比我嚼的还多? 我并不害怕低级别的编程或汇编,也不需要花费大量的精力。 我真的很想挑战!

什么是注册%eiz?

在下面使用objdump转储的汇编代码中: lea 0x0(%esi,%eiz,1),%esi 什么是注册%eiz ? 前面的代码是什么意思?

ARM中的SP(堆栈)和LR是什么?

我一遍又一遍地阅读定义,我仍然不明白ARM中的SP和LR是什么? 我了解PC(它显示下一个指令的地址),SP和LR可能是相似的,但我只是不明白它是什么。 你可以帮我吗? 编辑:如果你可以用例子来解释,那将是非常棒的。 编辑:终于搞清楚什么是LR,仍然没有得到什么SP的。

什么是学习Assembly的最佳方式? 具体来说,对于有dynamic语言经验的人来说

我一直在使用Python已经有相当长的一段时间了,我非常喜欢它的易用性和灵活性,但是我真的想更接近我正在开发的一些math的硬件。 我也对如此接近硬件很感兴趣,绝对没有什么能阻止你使用它的一切。 我已经研究过对大会的介绍,对我来说,他们的工作比他们应该做得更快。 他们直接跳进登记册和行动,却没有解释他们到底是什么,为什么他们很重要。 我很想看到Assembly的深入介绍,以确保您在进行任何types的编程之前了解这些概念。

nop操作码的目的是什么?

我正在通过MSIL,并注意到有很多nop指令。 MSDN文章说,他们不采取任何行动,并用于填补空间,如果操作码被修补。 它们在debugging版本中比在发布版本中用得更多。 我知道在汇编语言中使用这些types的语句来确保操作码符合字边界,但是为什么在MSIL中需要它?

Gnu汇编程序(GAS)中的CFI指令是什么?

在每一行之后似乎都有一个.CFI指令,而且这些.cfi_startproc , .cfi_endproc , .cfi_endproc等也有很多.cfi_endproc 。 .file "temp.c" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 movq %rsp, %rbp .cfi_offset 6, -16 .cfi_def_cfa_register 6 movl $0, %eax leave ret .cfi_endproc .LFE0: .size main, .-main .globl func .type func, @function func: .LFB1: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 movq %rsp, %rbp .cfi_offset […]

如果语句与if-else语句,哪个更快?

有一天我和一个朋友争论了这两个片段。 哪个更快,为什么? value = 5; if (condition) { value = 6; } 和: if (condition) { value = 6; } else { value = 5; } 如果value是一个matrix呢? 注意:我知道这个value = condition ? 6 : 5; value = condition ? 6 : 5; 存在,我期望它更快,但它不是一个选项。 编辑 (由于问题暂时搁置,工作人员要求): 请考虑由主stream编译器(如g ++,clang ++,vc,mingw )在优化和非优化版本或MIPS汇编中生成的x86 汇编 。 当大会不同时,解释为什么一个版本更快,何时( 例如“更好,因为没有分支和分支有下列问题blahblah” )

快速find一个值是否存在于C数组中?

我有一个embedded式应用程序,其中包含一个对时间要求严格的ISR,需要遍历256个数组(最好是1024,但最less为256),并检查一个值是否与数组内容匹配。 一个bool将被设置为true是这样的。 MCU是恩​​智浦LPC4357,ARM Cortex M4内核,编译器是GCC。 我已经组合了优化级别2(3慢),并将其放入RAM而不是闪存。 我也使用指针算术和for循环,而不是向下计数(检查i!=0是否快于检查i<256 )。 总而言之,我最终需要12.5us的时间,这个时间必须大大缩短才行。 这是我现在使用的(伪)代码: uint32_t i; uint32_t *array_ptr = &theArray[0]; uint32_t compareVal = 0x1234ABCD; bool validFlag = false; for (i=256; i!=0; i–) { if (compareVal == *array_ptr++) { validFlag = true; break; } } 什么是绝对最快的方法来做到这一点? 使用内联汇编是允许的。 其他“不太优雅的”技巧也是允许的。