X86指令集
文章平均质量分 90
介绍X86指令、汇编相关内容
百里杨
码农想飞~~
展开
-
指令手册术语缩写
本文属于《[X86指令基础系列教程]原创 2023-11-07 11:16:14 · 524 阅读 · 0 评论 -
X64(64位)汇编指令与机器码转换原理
REX.W说明需要REX前缀,REX格式为0100WRXB,W表示操作数宽度,W=1表示64位,X位默认为0,因此REX=01001001=49h。REX.W说明需要REX前缀,REX格式为0100WRXB,W表示操作数宽度,W=1表示64位,X位默认为0,因此REX=01001001=49h。REX.W说明需要REX前缀,REX格式为0100WRXB,W表示操作数宽度,W=1表示64位,X位默认为0,因此REX=01001001=49h。第二步,以寄存器操作数,反推ModRM.reg与REX.R。原创 2023-11-01 18:11:12 · 4701 阅读 · 1 评论 -
X64指令基本格式
X64指令与X86指令兼容,因此不再对X86指令结构重复描述,主要以讲解X64上新特性为主。原创 2023-11-01 18:08:17 · 1677 阅读 · 0 评论 -
X86(32位)汇编指令与机器码转换原理
本文属于《》之一,欢迎查看其它文章。在X86 32位架构下,指令格式定义中,新增了SIB字节。SIB(Scale, Index, Base)字节的意义是用于指定一种复杂的寻址方式(按比例变址寻址),在中已经介绍过了。原创 2023-10-27 18:15:48 · 1600 阅读 · 0 评论 -
VS搭建32位和64位汇编开发环境
在菜单中,“调试”->“窗口”->“内存”/“反汇编”/“寄存器”菜单项,可以在调试时,打开对应的窗口。原创 2023-10-26 21:12:00 · 3458 阅读 · 1 评论 -
8086(16位)汇编指令与机器码转换原理
在上一节,我们讲了X86指令基本格式。在8086架构下,是不存在SIB字节的,因此,我们重点关注ModR/M。原创 2023-10-26 11:18:56 · 3916 阅读 · 1 评论 -
CPU寄存器与寻址方式
在SIB寻址中,地址计算分为三个部分:基址、索引和比例因子。- 基址(base),包含一个或多个寄存器,用于指定基址。在指令中,可以使用一个或多个寄存器来作为基址。这些寄存器可以是通用寄存器(如RAX、RBX等)或系统寄存器(如CR3等)。- 索引(index),包含一个或多个寄存器,用于指定在基址上的偏移量。在指令中,可以使用一个或多个寄存器来作为索引。这些寄存器可以是通用寄存器(如RCX、RDX等)或系统寄存器(如RSI、RDI等)。- 比例因子(scale),是一个常数,用于指定比例因子。原创 2023-10-23 20:06:11 · 1740 阅读 · 0 评论 -
将数据、代码、栈放入不同的段
我们在源程序中为这3个段起了具有含义的名称,用来放数据的段我们将其命名为“data” ,用来放代码的段我们将其命名为"code” ,用作栈空间的段命名为“stack”。总之,CPU 到底如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对CS:IP、SS:SP、DS等寄存器的设置来决定的。定义多个段的方法这点,我们从程序中可明显地看出,定义一个段的方法和前面所讲的定义代码段的方法没有区别,只是对于不同的段,要有不同的段名。原创 2023-10-19 14:03:17 · 218 阅读 · 0 评论 -
[BX]和Loop指令
我们定义的描述性的符号: "()”,为了描述上的简洁,在以后的课程中,我们将使用一个描述性的符号 **“()”来表示一个寄存器或一个内存单元中的内容**。比如:(ax)表示ax中的内容、(al)表示al中的内容原创 2023-10-18 16:39:53 · 251 阅读 · 0 评论 -
内存访问与栈
在x86程序执行时,内存会被分段,每个段(segment)都有其特定的用途。以下是常见的几个段: - **代码段(Code Segment)**:代码段,也被称为文本段,是存储程序代码的地方。这通常包括二进制指令,也就是CPU执行的机器代码。 - **数据段(Data Segment)**:数据段是用于存储程序中定义的数据的位置,包括变量、数组等。这些数据在编译时被确定并存储在可执行文件或DLL中。当程序运行时,这些数据被加载到内存中,并分配给对应的内存地址。 - **堆(Heap)**:堆是动态分原创 2023-10-16 17:31:07 · 255 阅读 · 0 评论 -
DOSBox和MASM搭建16位8086汇编开发环境
link会将obj文件的一个个段拿出来,按照程序员规定的组合方式进行段组合,确定是否要合并或则颠倒一些顺序,然后生成exe文件。在D:/masm32目录下,有一个汇编文件hw.asm,该段代码,主要实现打印一行“hello world!这时候你就会发现,D:/masm32文件夹下,多了两个新文件:hw.obj和hw.exe。选择工作目录,路径中不要有中文,路径越简单越好,我们这里选择D盘。C:,表示进入C盘,也就是进入D:/masm32目录。因此,将masm32文件夹拷贝到D:/目录下。原创 2023-10-12 14:40:38 · 2367 阅读 · 0 评论 -
8086CPU指令执行的基本过程
我们说8086CPU的上一代CPU(8080、8085)等是8位机,而8086是16位机,也可以说8086 是16位结构的CPU。8086CPU 的所有寄存器都是 16 位的,可以存放两个字节。AX、BX、CX、DX 这 4个寄存器通常用来存放一般性的数据,被称为通用寄存器。原创 2023-10-11 11:21:44 · 1900 阅读 · 0 评论 -
X86指令集基础系列教程
1、《X86指令基本格式》2、《xxx》持续更新中…原创 2023-10-08 17:11:14 · 946 阅读 · 0 评论 -
X86指令基本格式
机器码是CPU可以识别,并执行的二进制数据。通常使用高级语言,如C/C++编写的代码,经过编译之后,生成的可执行文件中,就包含了机器码,可以被CPU执行。如果你熟悉X86机器码,具体的定义,那么你可以在文件中,徒手直接编写机器码,这样也可以被CPU执行,只不过难度很大,没有我们使用高级语言编写,然后编译为机器码,来的简单。机器码,是我们通俗的叫法。在X86架构下,机器码就是指一条一条的X86指令,这些指令的集合,就叫做X86指令集。原创 2023-10-08 16:59:23 · 2598 阅读 · 0 评论 -
汇编语法
1、通用寄存器EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP, 它 们 的低 16 位就是 8086 的AX,BX,CX,DX,SI,DI,SP,BP,它们的含义如下:EAX:累加器 EBX:基址寄存器(Base) ECX:计数器 EDX:数据寄存器(Data) ESI:源地址指针寄存器(Source)EDI:目原创 2013-09-11 13:56:12 · 964 阅读 · 0 评论 -
使用SSE指令集来优化程序
SSE和SSE2的指令系统非常相似,SSE2比SSE多的仅是少量的额外浮点处理功能、64位浮点数运算支持和64位整数运算支持。 SSE为什么会比传统的浮点运算更快呢?因为它使用了128位的存储单元,这对于32位的浮点数来讲,是可以存下4个的,也就是说,SSE中的所有计算都是一次性针对4个浮点数来完成的。虽然SSE从理论上来讲要比传统的浮点运算会快,但是所受的限制也很多,首先,虽然它执行一次相当于四次,会比传统的浮点运算执行4次的速度要快,但是它执行一次的速度却并没有想象中的那...转载 2020-08-24 15:19:24 · 3904 阅读 · 0 评论 -
辅助汇编学习记录1
1.OD中ctrl+f9:运行到返回,就是运行到当前断点所在的函数末尾"retn xxx"处,若xxx=10,那么10等于10进制的16,就是说这个函数有4个参数,一个参数默认是占4字节,所以就是retn 10。 2.调试程序时,在OD内部小窗口左上角会显示当前断点所在的函数层,是在系统领空还是某个应用程序领空。 3.call前出现lea edx,dword ptr ss:[e...原创 2018-11-26 00:43:45 · 370 阅读 · 0 评论 -
反汇编笔记
1.OD中ctrl+f9:运行到返回,就是运行到当前断点所在的函数末尾"retn xxx"处,若xxx=10,那么10等于10进制的16,就是说这个函数有4个参数,一个参数默认是占4字节,所以就是retn 10。2.调试程序时,在OD内部小窗口左上角会显示当前断点所在的函数层,是在系统领空还是某个应用程序领空。3.call前出现lea edx,dword ptr ss:[ebp原创 2013-09-11 14:11:42 · 1575 阅读 · 0 评论 -
内存带宽测试与AVX指令集读写内存
一、内存理论带宽的计算内存带宽计算公式:带宽=内存核心频率×内存总线位数×倍增系数。 先容我从DDR的技术说起,DDR采用时钟脉冲上升、下降沿各传一次数据,1个时钟信号可以传输2倍于SDRAM的数据,所以又称为双倍速率SDRAM。它的倍增系数就是2。 DDR2仍然采用时钟脉冲上升、下降支各传一次数据的技术(不是传2次),但是一次预读4bit数据,是DDR一次预读2bit的2倍,因此,它的倍增系数是2X2=4。 DDR3作为DDR2的升级版,最重要的改变是一次预读8bit,...原创 2020-08-25 18:50:10 · 2286 阅读 · 0 评论 -
用大白话带你理解CPU指令集
指令集与机器码无论处于上层的软件多么的高级, 想要在CPU执行, 就必须被翻译成"机器码", 翻译这个工作由编译器来执行. 编译器在这个过程中, 要经过"编译", "汇编", "链接"几个步骤, 最后生成"可执行文件". 可执行文件中保存的是二进制机器码. 这串机器码可以直接被CPU读取和执行.软件意义上, "指令集"实际上是一个规范, 规范汇编的文件格式.以下为一条x86汇编代码:mov word ptr es:[eax + ecx * 8 + 0x11223344], 0x12345678转载 2020-08-24 12:03:21 · 12803 阅读 · 0 评论 -
辅助汇编学习记录2
通用寄存器EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP, 它 们 的低 16 位就是 8086 的AX,BX,CX,DX,SI,DI,SP,BP,它们的含义如下: EAX:累加器 EBX:基址寄存器(Base) ECX:计数器 EDX:数据寄存器(Data) ESI:源地址指针寄存器(Source) EDI:目的地...原创 2018-11-26 00:47:36 · 584 阅读 · 0 评论 -
RDTSC指令介绍与使用
一、了解RDTSC指令rdtsc指令, 该指令返回CPU自启动以来的时钟周期数;该时钟周期数,即处理器的时间戳。在CPU通电启动后,首先会重置EDX和EAX,在每个时钟周期上升或下降沿到来时,会自动累计周期数,并被记录到EDX和EAX寄存器中,EDX是高位,EAX是低位。rdtsc指令就是从该寄存器中进行获取的。周期和频率的关系公式:T(周期)=1/f(频率)如CPU频率f为1GHz,则其时钟周期T=1/1GHz秒,意味着每隔T秒,CPU完成一个最基本的动作,并在寄存器中,对周期数加1。故,假设原创 2020-09-22 18:43:04 · 16400 阅读 · 0 评论 -
程序员可以做点什么
嗯,还好继续翻译完这个系列,原文链接:http://lwn.net/Articles/255364/6 程序员可以做点什么在前面的章节介绍之后,很明显程序员有很多机会来影响一个程序的性能,不管是正面的还是负面的。这里只讨论和内存相关的操作。我们会完整的讨论这些方方面面,从最底层物理内存存取和L1缓存开始,直到操作系统功能对内存处理的影响为止。6.1 绕过缓存当数据产生后但没有(立即)被再次使用,那么内存写操作会首先读入完整的缓存行并修改缓存数据对性能是有害的。这个操作刷新的缓存数据可能.转载 2020-09-13 11:45:10 · 470 阅读 · 0 评论 -
在C/C++代码中使用SSE等指令集的指令(5)SSE进行加法运算简单的性能测试
下面是一个简单的测试SSE指令性能的程序,可以看到明显的性能提升。(说明:程序中的timing.h使用的是http://blog.csdn.net/gengshenghong/article/details/6973086中介绍的时间间隔获取方法)#define WIN#include "timing.h"#include <intrin.h>#include <stdlib.h>#include <math.h>#define N 4*100.转载 2020-09-13 11:35:46 · 488 阅读 · 0 评论 -
在C/C++代码中使用SSE等指令集的指令(4)SSE指令集Intrinsic函数使用
在http://blog.csdn.net/gengshenghong/article/details/7008682里面列举了一些手册,其中Intel Intrinsic Guide可以查询到所有的Intrinsic函数、对应的汇编指令以及如何使用等,所以,接下来就不全部进行分析,以下只分析其中一部分,从而了解如何在C/C++代码中使用这些高级指令集的基本方法,至于更多的指令的使用,查询手册就很容易理解了。说明:下面用到的指令可能只涉及到SSE指令集,而不是SSE系列(SSE、SSE2、SSE3、SS转载 2020-09-13 11:34:51 · 1272 阅读 · 0 评论 -
在C/C++代码中使用SSE等指令集的指令(3)SSE指令集基础
相关参考:http://edu.gamfe.com/tutor/d/11820.htmlhttp://blog.163.com/chenqneu@126/blog/static/45738484200781392836677/http://dev.gameres.com/Program/Other/SSEjianjie.htmhttp://www.vckbase.com/document/viewdoc/?id=322scalar packed(1)Summary:前面了解到了可转载 2020-09-13 11:33:10 · 650 阅读 · 0 评论 -
在C/C++代码中使用SSE等指令集的指令(2)参考手册
http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/index.htm#intref_cls/common/intref_bk_sse.htmhttp://www.tommesani.com/Docs.htmlIntel架构开发人员手册:里面有很多和架构、指令集、优化等相关的手册文档http://www.intel.com/content/www/us/en.转载 2020-09-13 11:31:55 · 194 阅读 · 0 评论 -
在C/C++代码中使用SSE等指令集的指令(1)介绍
我们知道,在C/C++代码中,可以插入汇编代码提高性能。现在的指令集有了很多的高级指令,如果我们希望使用这些高级指令来实现一些高效的算法,就可以在代码中嵌入汇编,使用SSE等高级指令,这是可行的,但是如果对汇编不太熟悉,不愿意使用汇编的人来说,其实也是可以的,这就是Compiler Intrinsics(http://msdn.microsoft.com/zh-cn/site/26td21ds)。PS:下面的内容以Windows平台为主,对于Linux下,也有类似的方法。(1)什么是Intrinsi转载 2020-09-13 11:29:35 · 982 阅读 · 0 评论 -
CPU指令集介绍
(1)什么是指令集参考:http://product.pconline.com.cn/itbk/bjbzj/notebook/1109/2522116.html所谓指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。而指令集的先进与否,也关系到CPU的性能发挥,它也是CPU性能体现的一个重要标志。通俗的理解,指令集就是CPU能认识的语言,指令集运行于一定的微架构之上,不同的微架构可以支持相同的指令集,比如In转载 2020-09-13 11:21:49 · 12015 阅读 · 0 评论