Tag: 汇编

新的X86_64处理器寄存器的名称是什么?

我在哪里可以find在这个架构上assembly的新寄存器的名称? 我指的是X86中的寄存​​器,比如EAX,ESP,EBX等,但是我希望它们在64位。 我不认为它们与拆解我的C代码时是一样的,我得到r而不是e。

使用xor reg,reg优于mov reg,0吗?

在x86上有两种众所周知的方法来将整数寄存器设置为零值。 或 mov reg, 0 要么 xor reg, reg 有一种观点认为,第二个变体是更好的,因为值0没有存储在代码中,并节省了生成的机器代码的几个字节。 这绝对是好的 – 使用更less的指令caching,这有时可以允许更快的代码执行。 许多编译器产生这样的代码。 然而,异或指令和改变相同寄存器的先前指令之间存在正式的指令间依赖关系。 由于存在依赖性,后者的指令需要等到前一个指令完成,这可以减less处理器单元的负载并伤害性能。 add reg, 17 ;do something else with reg here xor reg, reg 很显然,无论初始寄存器值如何,异或的结果都是完全相同的。 但是处理器能够识别这个吗? 我在VC ++ 7中尝试了以下testing: const int Count = 10 * 1000 * 1000 * 1000; int _tmain(int argc, _TCHAR* argv[]) { int i; DWORD start = […]

“大会”与“汇编”

我已经被告知,“汇编”就是你在文件中写的东西,让你的“汇编器”把它转换成二进制代码。 但是我看到这两个词在各种作品中混合搭配。 我甚至听说你写了“汇编程序”,之后一个“汇编程序”使它可执行。 请告诉我,什么是正确的用词?

x86中的IN和OUT指令用于什么?

在阅读“理解Linux内核”一书时,我已经习惯了这些指令。 我查了参考手册。 5.1.9 I / O指令 这些指令在处理器的I / O端口和寄存器或存储器之间移动数据。 IN Read from a port OUT Write to a port INS/INSB Input string from port/Input byte string from port INS/INSW Input string from port/Input word string from port INS/INSD Input string from port/Input doubleword string from port OUTS/OUTSB Output string to port/Output byte string to port […]

如何编写x86程序集中的自修改代码

我正在为最近正在处理的业余爱好虚拟机编写一个JIT编译器。 我知道一些程序集,(我主要是一个C程序员,我可以阅读大部分程序集,但是我不明白这些操作码的含义,然后编写一些简单的程序),但是我很难理解几个例子自我修改的代码我在网上find的。 这是一个这样的例子: http : //asm.sourceforge.net/articles/smc.html 所提供的示例程序在运行时进行了大约四种不同的修改,其中没有一个被清楚地解释。 Linux内核中断被多次使用,并没有解释或详细说明。 (作者在调用中断之前把数据移到了几个寄存器中,我假设他正在传递参数,但是这些参数根本没有解释,让读者猜测)。 我正在寻找的是自修改程序代码中最简单,最直接的例子。 有些东西我可以看一下,用来理解x86程序集中的自修改代码是如何编写的,以及它是如何工作的。 是否有任何资源可以指向我,或者您可以提供哪些可以充分certificate这一点的例子? 我正在使用NASM作为我的汇编程序。 编辑:我也在Linux上运行这个代码。

LEA EAX,EAX有什么意义?

LEA EAX, [EAX] 我在用Microsoft C编译器编译的二进制文件中遇到了这个指令。 这显然不能改变EAX的价值。 那为什么呢?

你如何组装一个汇编程序?

我想制作一个简单的x86汇编程序。 我想知道是否有任何教程制作自己的汇编程序。 或者如果有一个简单的汇编程序,我可以学习。 另外,我想知道用什么工具来查看和处理程序的二进制/hex。

Mac OS X中您最喜爱的反汇编工具是什么?

我正在使用otool , nm和otool文本编辑器来分解Mach-o二进制文件。 我的工作stream程非常简单: 1.列出已有的符号。 nm -g 2.获得解密代码。 otool -vt 3.将此输出复制并粘贴到文本文件。 4.在文本编辑器中阅读和评论代码:) 我正在寻找简化在Mac OS X上使用disasm代码的工具。

在L1caching上获取Haswell的峰值带宽:只有62%

我试图在L1caching中获得全部带宽,以便在Intel处理器上使用以下function float triad(float *x, float *y, float *z, const int n) { float k = 3.14159f; for(int i=0; i<n; i++) { z[i] = x[i] + k*y[i]; } } 这是STREAM的三合一function。 使用此function的SandyBridge / IvyBridge处理器(使用与NASM的汇编)可获得95%的峰值。 但是,除非我展开循环,否则使用Haswell I只能达到峰值的62%。 如果我展开16次,我得到92%。 我不明白这一点。 我决定使用NASM在汇编中编写我的function。 assembly中的主循环看起来像这样。 .L2: vmovaps ymm1, [rdi+rax] vfmadd231ps ymm1, ymm2, [rsi+rax] vmovaps [rdx+rax], ymm1 add rax, 32 jne .L2 在例子12.7-12.11的Agner […]

用gdb怎么看堆栈的内容?

我是gdb的新手,所以我有一些问题。 我怎么看待栈的内容? 例如:查看寄存器的内容,我键入info registers 。 对于堆栈应该是什么 我如何看到$0x4(%esp) ? 当我inputprint /d $0x4(%esp) gdb给出错误。 平台:Linux的GDB