Questions tagged «assembly»

汇编语言(asm)编程问题。确保还标记您正在使用的处理器和/或指令集以及汇编器。警告:对于.NET程序集,请使用标签[.net-assembly]。对于Java ASM,请改用标记[java-bytecode-asm]。


3
从函数返回结构时可能的GCC错误
我相信我在实施O'Neill的PCG PRNG时发现了GCC中的错误。(Godbolt的Compiler Explorer上的初始代码) 相乘后oldstate通过MULTIPLIER,(存储在RDI结果),GCC不该结果添加到INCREMENT,movabs'ing INCREMENT到RDX代替,然后把它用作rand32_ret.state的返回值 一个最小的可复制示例(Compiler Explorer): #include <stdint.h> struct retstruct { uint32_t a; uint64_t b; }; struct retstruct fn(uint64_t input) { struct retstruct ret; ret.a = 0; ret.b = input * 11111111111 + 111111111111; return ret; } 生成的程序集(GCC 9.2,x86_64,-O3): fn: movabs rdx, 11111111111 # multiplier constant (doesn't fit in …
133 c  gcc  assembly  x86-64  compiler-bug 


15
快速查找C数组中是否存在值?
我有一个具有时间关键ISR的嵌入式应用程序,该应用程序需要循环访问大小为256(最好是1024,但最小为256)的数组,并检查值是否与数组内容匹配。在bool这种情况下,将A 设置为true。 该微控制器是NXP LPC4357,ARM Cortex M4内核,而编译器是GCC。我已经组合了优化级别2(速度慢3),并将函数放在RAM中而不是闪存中。我还使用了指针算术和一个for循环,该循环进行递减计数而不是递增计数(检查if i!=0的速度比检查if的速度快i<256)。总而言之,我最终需要花费12.5 µs的持续时间,因此必须将其大幅缩短以确保可行。这是我现在使用的(伪)代码: 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; } } 绝对最快的方法是什么?允许使用内联汇编。也可以使用其他“不太优雅”的技巧。

3
x86中“非临时”内存访问的含义是什么
这是一个有点低级的问题。在x86汇编中,有两个SSE指令: MOVDQA xmmi, m128 和 MOVNTDQA xmmi, m128 IA-32软件开发人员手册指出 MOVNTDQA NT代表非临时性,否则与MOVDQA相同。 我的问题是 非临时性是什么意思?
123 x86  sse  assembly 




8
`testl` eax对抗eax?
我试图了解一些汇编。 汇编如下,我对这testl一行感兴趣: 000319df 8b4508 movl 0x08(%ebp), %eax 000319e2 8b4004 movl 0x04(%eax), %eax 000319e5 85c0 testl %eax, %eax 000319e7 7407 je 0x000319f0 我想了解testl介于%eax和之间的那一点%eax。我认为这段代码的具体内容并不重要,我只是想了解自身的测试-价值不总是真实的吗?

4
Gnu汇编程序(GAS)中的CFI指令有什么作用?
有似乎是一个.CFI指令,每行后,也有广泛的这些前的品种繁多,.cfi_startproc,.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 …
118 assembly  gas 

3
为什么32位寄存器上的x86-64指令将整个64位寄存器的高位归零?
在x86-64英特尔手册之旅中,我阅读了 也许最令人惊讶的事实是诸如MOV EAX, EBX自动将RAX寄存器的高32位清零的指令。 同一来源引用的英特尔文档(手动基本体系结构中的3.4.1.1通用寄存器在64位模式下)告诉我们: 64位操作数在目标通用寄存器中生成64位结果。 32位操作数生成32位结果,并将其零扩展到目标通用寄存器中的64位结果。 8位和16位操作数生成8位或16位结果。目的通用寄存器的高56位或高48位(分别)不会被该操作修改。如果8位或16位运算的结果打算用于64位地址计算,则将寄存器显式符号扩展为完整的64位。 在x86-32和x86-64汇编中,16位指令例如 mov ax, bx 不要显示eax的高位字为零的这种“奇怪”行为。 因此:引入此行为的原因是什么?乍一看似乎是不合逻辑的(但是原因可能是我已经习惯了x86-32程序的怪癖)。

9
如何使用Visual C ++查看代码背后的程序集?
我正在阅读另一个有关两行代码的效率的问题,OP表示他查看了代码后面的汇编,并且这两行在汇编中是相同的。除了题外话,我如何查看编译程序时创建的汇编代码。 我正在使用Microsoft的Visual C ++,但我也想知道是否可以查看用Visual Basic编写的代码背后的程序集。 那么,如何查看用高级语言(如C ++和Visual Basic)编写的程序背后的汇编代码?

20
如何在旧台式计算机上构建小型操作系统?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 改善这个问题 这可能是徒劳的,因为我知道编写操作系统非常复杂(尤其是自己编写)。 我不希望构建下一个Linux或Windows。 我知道这将是可怕的,有故障的,并且无法正常工作,但这很好。 我想用Assembly,C和(某些)C ++自己编写所有内容。 这是一个未来的项目,因为我目前正忙于其他事情,没有时间,但我想现在就问一下,也许我可以获得很多答案,并且可以建立并成为这种方法的有用资源(我所看到的所有其他内容都涉及建立minix,使用现有的bootloader,在虚拟启动程序中构建它等)。 我想用显示器,键盘和鼠标设置一个较旧的台式机,然后开始在空白硬盘驱动器上工作。 我想学习如何编写自己的引导加载程序(我已经找到了很多相关的资源,但是为了完整起见,请仍然添加一些不错的资源),我自己的USB驱动程序(如果需要),CD驱动程序(如果需要) )等所有内容,从头开始。 如何将代码放入计算机?最好用软盘来做吗?大多数计算机可以通过USB记忆棒来做到吗? 我需要什么驱动程序,您可以建议任何有关构建这些驱动程序的参考吗? 在启动序列之后-那么呢?我如何进入保护模式等 我如何在没有操作系统帮助的情况下管理内存?我是否只使用我想要的地址?不需要初始化吗? 我无疑会遇到什么使我感到困惑? 如何使其成为命令行操作系统和图形操作系统? 什么是图形化的操作系统?就像,我该如何做,例如命令行,字体和顶部的图片? 在哪里可以阅读有关设置多任务环境的信息?(即,具有两个并排运行的图形化命令行)。 我将如何建立一种窗口系统?设置简单的多任务处理后,如何在屏幕上显示图形? 相信我,我知道这是一个非常复杂的项目,并且我可能永远也无法完成或编写任何有用的内容。 我还没有提到很多其他内容,如果您有任何想法,也可以随意添加。 请为每个答案输入一个“主题”,例如USB驱动程序,然后列出资源,需要注意的事项等。 另外,请不要建议构建其他操作系统或预先存在的代码。我知道我将阅读很多预先存在的代码(例如linux内核或示例资源,现有驱动程序等),但最终我想自己完成所有编写工作。我知道我应该在其他基础上发展,因此,如果我改变主意并走这条路,那么我可以阅读很多其他问题。但是,这一切都是关于从头开始做整个事情。 关于如何使其图形化的任何建议?不同的视频模式以及如何使用它们等?


6
为什么SSE标量sqrt(x)比rsqrt(x)* x慢?
我一直在Intel Core Duo上进行一些核心数学分析,在查看各种平方根方法时,我注意到了一些奇怪的事情:使用SSE标量运算,倒数平方根乘以它会更快获取sqrt,而不是使用本机sqrt操作码! 我正在用类似这样的循环进行测试: inline float TestSqrtFunction( float in ); void TestFunc() { #define ARRAYSIZE 4096 #define NUMITERS 16386 float flIn[ ARRAYSIZE ]; // filled with random numbers ( 0 .. 2^22 ) float flOut [ ARRAYSIZE ]; // filled with 0 to force fetch into L1 cache cyclecounter.Start(); for …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.