Tag: 汇编

这个callstack是如何工作的?

我试图深入了解编程语言的低级操作是如何工作的,特别是他们如何与OS / CPU进行交互。 我可能在堆栈溢出的每个堆栈/堆相关的线程中都读过每个答案,它们都很精彩。 但是还有一件事我还没完全理解。 在伪代码中考虑这个function,这往往是有效的锈代码;-) fn foo() { let a = 1; let b = 2; let c = 3; let d = 4; // line X doSomething(a, b); doAnotherThing(c, d); } 这就是我认为堆栈看起来像X行: Stack a +————-+ | 1 | b +————-+ | 2 | c +————-+ | 3 | d +————-+ | 4 | […]

我怎样才能看到C ++程序的汇编代码?

我怎样才能看到C ++程序的汇编代码? 什么是stream行的工具来做到这一点?

如何让Windows像Linux一样快速编译C ++?

我知道这不是一个编程问题,而是相关的。 我在一个相当大的跨平台项目上工作 。 在Windows上,我使用VC ++ 2008.在Linux上,我使用gcc。 项目中有大约4万个文件。 在编译和链接相同的项目时,Windows的速度比Linux慢10倍到40倍。 我该如何解决这个问题? 在Linux上进行单个更改增量构build20秒,在Windows上进行> 3分钟。 为什么? 我甚至可以在Linux中安装“黄金”链接器,把时间缩短到7秒。 同样的,git在Linux上的速度是Windows的10倍到40倍。 在git的情况下,可能git不是以最佳方式使用Windows,而是使用VC ++? 你可能会认为微软希望自己的开发人员尽可能富有成效,而编译速度会更快。 也许他们试图鼓励开发人员进入C#? 作为简单的testing,find一个有很多子文件夹的文件夹,并做一个简单的 dir /s > c:\list.txt 在Windows上。 做两次,第二次运行时,它从caching运行。 将文件复制到Linux,并执行等同的2次运行和第二次运行。 ls -R > /tmp/list.txt 我有两个工作站完全相同的规格。 惠普Z600s 12gig ram,8核3.0ghz。 在具有〜400k文件的文件夹中,Windows需要40秒,Linux需要<1秒。 有没有我可以设置加快Windows的registry设置? 是什么赋予了? 一些稍微相关的链接,与编译时间有关,不一定是I / O。 显然,在Windows 10(不是在Windows 7)中存在一个问题,即closures一个进程会导致全局locking 。 当编译多个核心,因此多个进程,这个问题发生。 /analyse选项可能会对perf性能产生负面影响,因为它会加载Web浏览器 。 (不相关,但很好知道)

内联汇编语言比本机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 edx,x push edx mov […]

编译器如何编译自己?

我正在网站http://coffeescript.org/上研究CoffeeScript,它有文本 CoffeeScript编译器本身是用CoffeeScript编写的 编译器如何编译自己,或者这个语句是什么意思?

为什么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 = mantissa >> exponent; […]

为什么Java打开连续的整数看起来运行速度更快,增加案例?

我正在研究一些需要高度优化的Java代码,因为它将在我的主程序逻辑中的许多地方被调用的热门函数中运行。 该代码的一部分涉及将doublevariables乘以10得到任意的非负int exponent s。 一个快速的方法(编辑:但不是最快的,见下面的更新2)获得乘数的值是switch exponent : double multiplyByPowerOfTen(final double d, final int exponent) { switch (exponent) { case 0: return d; case 1: return d*10; case 2: return d*100; // … same pattern case 9: return d*1000000000; case 10: return d*10000000000L; // … same pattern with long literals case 18: return d*1000000000000000000L; default: throw […]

将机器代码翻译成LLVM IR(将X86_64.X86.ARM反汇编/重组成LLVM位代码)

我想将X86_64,x86,ARM可执行文件翻译成LLVM IR(反汇编)。 你build议什么解决scheme?

如何使用“x / i $ pc”反汇编GDB中的16位x86引导扇区代码? 它被视为32位

例如,用BIOS打印到屏幕main.asm的引导扇区: org 0x7c00 bits 16 cli mov ax, 0x0E61 int 0x10 hlt times 510 – ($-$$) db 0 dw 0xaa55 然后: nasm -o main.img main.asm qemu-system-i386 -hda main.img -S -s & gdb -ex 'target remote localhost:1234' \ -ex 'break *0x7c00' \ -ex 'continue' \ -ex 'x/3i $pc' 我得到: 0x7c00: cli 0x7c01: mov $0x10cd0e61,%eax 0x7c06: hlt […]

execve shellcode写入分段错误

我正在研究execve shellcode, 操作系统:Linux bt 2.6.39.4 root @ bt:〜/ exploit#cat gshell.s .globl _start _start: nop jmp MyString shell: popl %esi xorl %eax,%eax movl %al,9(%esi) movl %esi,10(%esi) movl %eax,14(%esi) movb $11,%al movl %esi, %ebx leal 0xa(%esi),%ecx leal 0xe(%esi),%edx int $0x80 movl $1,%eax movl $0,%ebx int $0x80 MyString: call shell shellvar: .ascii "/bin/bashADDDDCCCC" root @ bt:〜/ exploit#as -gstabs […]