Questions tagged «assembly»

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



7
与AT&T相比,英特尔汇编语法的局限性[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案能得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 对我来说,英特尔语法更容易阅读。如果我只关注Intel语法来遍历汇编林,我会错过任何事情吗?我有什么理由要切换到AT&T(除了能够读取其他人的AT&T程序集之外)?我的第一个线索是gdb默认使用AT&T。 如果这很重要,那么我的重点仅在于与Linux / BSD和C语言有关的任何关系汇编和语法。
88 c  linux  assembly  bsd 



30
为什么要用汇编编程?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 去年关闭。 改善这个问题 我对那里所有的核心低级黑客都有疑问。我在博客中碰到了这句话。我并不真正认为消息来源很重要(如果您真的很在意,那就是Haack),因为这似乎是一种常见的说法。 例如,许多现代的3D游戏都有以C ++和Assembly编写的高性能核心引擎。 就汇编而言,这是用汇编语言编写的,因为您不希望编译器发出额外的指令或使用过多的字节,或者您使用的是无法在C中表达的更好的算法(或者在没有编译器迷惑了他们)? 我完全明白了解底层内容很重要。我只想理解为什么理解汇编后的程序。

2
什么是“ rep; 没事;” 在x86汇编中意味着什么?它与“暂停”指令相同吗?
什么rep; nop意思 与pause指示相同吗? 是否与rep nop(不含分号)相同? 简单nop指令有什么区别? 它在AMD和Intel处理器上的行为是否有所不同? (奖金)这些说明的正式文件在哪里? 这个问题的动机 在讨论另一个问题的评论后,我意识到我不知道rep; nop;x86(或x86-64)汇编的含义。而且我在网上也找不到很好的解释。 我知道这rep是一个前缀,表示“重复下一个指令cx时间”(或者至少在旧的16位x86汇编中是这样)。根据这一维基百科汇总表,似乎rep只能与使用movs,stos,cmps,lods,scas(但也许是对新的处理器去掉这个限制)。因此,我认为rep nop(没有分号)会重复一个nop操作cx时间。 但是,经过进一步的搜索,我变得更加困惑。似乎rep; nop和pause 映射到完全相同的操作码,并且pause行为与刚刚不同nop。2005年的一些旧邮件说了不同的话: “尽量不要消耗太多功率” “仅用2字节编码就相当于'nop'。” “这在英特尔上是神奇的。就像'nop,但让其他HT兄弟运行一样'” “在Intel上暂停,在Athlon上快速填充” 由于这些不同的意见,我无法理解正确的含义。 它是在Linux内核(两个正在使用的i386和x86_64的),这条评论在一起:/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */它也正在贝尔托斯使用,具有相同的注释。

3
使用gdb在指定的可执行文件之外单步执行汇编代码会导致错误“找不到当前函数的边界”
我不在gdb的目标可执行文件之外,甚至没有对应于该目标的堆栈。无论如何,我都想单步执行,以便我可以验证汇编代码中发生的事情,因为我不是x86汇编方面的专家。不幸的是,gdb拒绝执行此简单的程序集级调试。它允许我在适当的断点处设置和停止,但是一旦我尝试单步执行,gdb就会报告错误“找不到当前函数的边界”,并且EIP不会更改。 额外细节: 机器代码是由gcc asm语句生成的,我从objdump -d的输出将其复制到了正在执行的内核内存位置。我不介意使用加载程序将目标代码加载到重定位地址的简单方法,但是请记住,加载必须在内核模块中完成。 我想另一种选择是产生一个伪造的内核模块或调试信息文件以提供给gdb,使它相信该区域在程序代码内。gdb在内核可执行文件本身上运行良好。 (对于那些真正想知道的人,我是在运行时将代码插入VMware VM内的Linux内核数据空间中,然后通过gdb调试它,通过VMware Workstation的内置gdb存根对内核进行远程调试。注意,我不是在编写内核漏洞利用;我是写原型的安全研究生。) (我可以在程序集中的每条指令上设置一个断点。这可以工作,但是一段时间后会变得很费力,因为x86汇编指令的大小各不相同,并且每次重新启动时程序集的位置都会改变。)

4
为什么T *可以在寄存器中传递,但unique_ptr <T>无法传递?
我正在观看Chandler Carruth在CppCon 2019中的演讲: 没有零成本抽象 在该示例中,他举例说明了您对使用std::unique_ptr&lt;int&gt;over和会产生多少开销而感到惊讶int*。该段大约在时间点17:25开始。 您可以看一下他的示例代码对(godbolt.org)的编译结果 -可以看到,确实,编译器似乎不愿意传递unique_ptr值-实际上,底线是只是一个地址-在寄存器内,仅在直接内存中。 Carruth先生在27:00左右提出的观点之一是,C ++ ABI要求按值传递参数(某些但不是全部;也许-非基本类型?而不是在寄存器中。 我的问题: 这实际上是某些平台上的ABI要求吗?(哪个?)或者在某些情况下可能只是一些悲观? 为什么ABI这样?也就是说,如果结构/类的字段适合寄存器,甚至单个寄存器,为什么我们不能在该寄存器中传递它呢? 近年来,C ++标准委员会是否曾经讨论过这一点? PS-为了不给这个问题留下代码: 普通指针: void bar(int* ptr) noexcept; void baz(int* ptr) noexcept; void foo(int* ptr) noexcept { if (*ptr &gt; 42) { bar(ptr); *ptr = 42; } baz(ptr); } 唯一指针: using std::unique_ptr; void bar(int* ptr) noexcept; void …


1
C代码循环性能[续]
这个问题在我的问题上继续(根据Mystical的建议): C代码循环性能 继续我的问题,当我使用打包指令而不是标量指令时,使用内在函数的代码将非常相似: for(int i=0; i&lt;size; i+=16) { y1 = _mm_load_ps(output[i]); … y4 = _mm_load_ps(output[i+12]); for(k=0; k&lt;ksize; k++){ for(l=0; l&lt;ksize; l++){ w = _mm_set_ps1(weight[i+k+l]); x1 = _mm_load_ps(input[i+k+l]); y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1)); … x4 = _mm_load_ps(input[i+k+l+12]); y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4)); } } _mm_store_ps(&amp;output[i],y1); … _mm_store_ps(&amp;output[i+12],y4); } 尽管我希望它是标量版本性能的4倍,即每个周期4.1,6 = 6,4 FP ops,但该内核的测量性能约为每个周期5.6个FP操作。 考虑到权重因子的移动(感谢指出),时间表如下: 看起来时间表没有改变,尽管在操作之后还有一条额外的指令movss将标量权重值移动到XMM寄存器,然后用于shufps将该标量值复制到整个向量中。mulps考虑到从负载到浮点域的切换延迟,权重向量似乎已准备就绪,可以及时使用,因此不会引起任何额外的延迟。 …

6
if语句vs if-else语句,哪个更快?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 改善这个问题 前几天,我和一个朋友争论了这两个片段。哪个更快,为什么? value = 5; if (condition) { value = 6; } 和: if (condition) { value = 6; } else { value = 5; } 如果value是矩阵怎么办? 注意:我知道它value = condition ? 6 : 5;存在,并且我希望它会更快,但这不是一个选择。 编辑(由于问题暂时搁置,因此被工作人员要求): 请通过考虑由主流编译器(例如g ++,clang ++,vc,mingw)以优化和非优化版本生成的x86程序集或MIPS程序集来回答。 当汇编不同时,请解释为什么版本更快以及何时发布(例如“更好,因为没有分支且分支不会出现问题”)

17
堆栈如何以汇编语言工作?
我目前正在尝试了解堆栈的工作原理,因此我决定自学一些汇编语言,我正在使用这本书: http://savannah.nongnu.org/projects/pgubook/ 我正在使用Gas并在Linux Mint上进行开发。 我对某些东西感到困惑: 据我所知,堆栈只是一个数据结构。因此,我假设如果我要在汇编中进行编码,则必须自己实现堆栈。但是,似乎并非如此,因为有些命令像 pushl popl 因此,在为x86体系结构进行汇编代码编写并使用Gas语法时:堆栈只是已经实现的数据结构吗?还是实际上是在硬件级别实现的?或者是别的什么?另外,大多数其他芯片组的汇编语言是否已经实现了堆栈? 我知道这是一个愚蠢的问题,但是我对此感到非常困惑。

19
CIL nop操作码的目的是什么?
我正在经历MSIL,并注意到MSIL中有很多nop指令。 MSDN文章说,如果对操作码进行了修补,它们将不采取任何措施,并被用于填充空间。在调试版本中使用的版本比发行版本更多。 我知道在汇编语言中会使用这些类型的语句来对齐后面的指令,但是为什么在MSIL中需要MSIL nop? (编者注:可接受的答案是关于机器代码NOP的,而不是问题最初询问的MSIL / CIL NOP。)
82 assembly  bytecode  cil 

1
Go未链接我的程序集:未定义的外部函数
我试图写一些SIMD主要用于学习目的。我知道Go可以链接程序集,但是我无法使其正常工作。 这是我可以做的最简单的示例(逐元素矢量乘法): vec_amd64.s(注意:实际文件下面有一个空格行,RET因为否则会导致错误) // func mul(v1, v2 Vec4) Vec4 TEXT .mul(SB),4,$0-48 MOVUPS v1+0(FP), X0 MOVUPS v2+16(FP), X1 MULPS X1, X0 // also tried ret+32 since I've seen some places do that MOVUPS X0, toReturn+32(FP) RET vec.go package simd type Vec4 [4]float32 func (v1 Vec4) Mul(v2 Vec4) Vec4 { return Vec4{v1[0] …
82 assembly  go 

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.