x86寄存器列表

合集下载

汇编语言基于x86处理器

汇编语言基于x86处理器

汇编语言基于x86处理器
汇编语言是一种低级编程语言,用于与计算机硬件直接交互。

基于x86处理器的汇编语言主要用于编写针对x86架构的计算机程序。

x86处理器是一种广泛使用的处理器架构,包括Intel和AMD 等厂商生产的多个处理器系列。

在x86汇编语言中,程序员使用特定的指令集来操作寄存器、内存和其他硬件设备,实现计算机指令的精确控制和数据处理。

以下是一些基于x86处理器的汇编语言的特点和要点:
寄存器:x86处理器提供了多个通用寄存器,如AX、BX、CX、DX等,以及专用寄存器如指令指针寄存器IP、堆栈指针寄存器SP等。

程序员可以使用这些寄存器来存储数据、进行计算和操作。

指令集:x86汇编语言提供了广泛的指令集,包括数据传输、算术运算、逻辑运算、条件分支、循环控制等。

程序员可以使用这些指令来实现各种操作和算法。

内存访问:x86汇编语言可以直接访问内存,读取和写入数据。

程序员需要了解内存地址和数据类型的操作方式,以正确地操作内存中的数据。

栈操作:x86汇编语言中的栈用于存储局部变量、函数调用和
返回地址等信息。

程序员可以使用栈指针寄存器来管理栈,并使用相关指令进行入栈和出栈操作。

中断处理:x86处理器支持中断和异常处理机制。

程序员可以编写中断处理程序,以响应硬件中断或软件触发的异常情况。

编写基于x86处理器的汇编语言程序需要对x86架构的指令集和寄存器使用有深入的理解,以及对计算机硬件和操作系统的了解。

熟练掌握汇编语言的编写技巧和调试工具对于开发和调优x86汇编语言程序非常重要。

x86的控制寄存器CR0,CR1,CR2,CR3

x86的控制寄存器CR0,CR1,CR2,CR3

x86的控制寄存器CR0,CR1,CR2,CR3状态和控制寄存器组除了EFLAGS、EIP ,还有四个32位的控制寄存器,它们是CR0,CR1,CR2和CR3。

这⼏个寄存器中保存全局性和任务⽆关的机器状态。

CR0中包含了6个预定义标志,0位是保护允许位PE(Protedted Enable),⽤于启动保护模式,如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运⾏。

1位是监控协处理位MP(Moniter coprocessor),它与第3位⼀起决定:当TS=1时操作码WAIT是否产⽣⼀个“协处理器不能使⽤”的出错信号。

第3位是任务转换位(Task Switch),当⼀个任务转换完成之后,⾃动将它置1。

随着TS=1,就不能使⽤协处理器。

CR0的第2位是模拟协处理器位 EM (Emulate coprocessor),如果EM=1,则不能使⽤协处理器,如果EM=0,则允许使⽤协处理器。

第4位是微处理器的扩展类型位ET(Processor Extension Type),其内保存着处理器扩展类型的信息,如果ET=0,则标识系统使⽤的是287协处理器,如果 ET=1,则表⽰系统使⽤的是387浮点协处理器。

CR0的第31位是分页允许位(Paging Enable),它表⽰芯⽚上的分页部件是否允许⼯作。

CR1是未定义的控制寄存器,供将来的处理器使⽤。

CR2是页故障线性地址寄存器,保存最后⼀次出现页故障的全32位线性地址。

CR3是页⽬录基址寄存器,保存页⽬录表的物理地址,页⽬录表总是放在以4K字节为单位的存储器边界上,因此,它的地址的低12位总为0,不起作⽤,即使写上内容,也不会被理会。

这⼏个寄存器是与分页机制密切相关的,因此,在进程管理及虚拟内存管理中会涉及到这⼏个寄存器,读者要记住CR0、CR2及CR3这三个寄存器的内容控制寄存器(CR0~CR3)⽤于控制和确定处理器的操作模式以及当前执⾏任务的特性,如图4-3所⽰。

汇编语言寄存器详解

汇编语言寄存器详解

汇编语言寄存器详解汇编语言是一种底层程序设计语言,与高级语言相比,汇编语言更接近于计算机硬件层面。

在汇编语言中,寄存器是一种非常重要的概念,它们用于存储数据和指令,以及进行计算和操作。

在本文中,我们将详细介绍汇编语言中常用的寄存器及其作用。

1. 通用寄存器通用寄存器是汇编语言中最基本的寄存器,它们可以用于存储数据、指针和地址等信息。

在x86架构中,通用寄存器有8个,分别为:AX,BX,CX,DX,SI,DI,BP和SP。

其中,AX,BX,CX和DX是16位寄存器,也就是说它们可以存储16位的数据。

SI和DI是用于存储指针和地址的寄存器,BP和SP 则是用于存储栈指针的寄存器。

2. 段寄存器在汇编语言中,除了通用寄存器以外,还有一种特殊的寄存器,叫做段寄存器。

段寄存器用于存储内存中某个段的起始地址,它们可以帮助程序员在内存中定位某个数据或指令。

在x86架构中,有4个段寄存器,分别为:CS,DS,SS和ES。

其中,CS用于存储代码段的地址,DS用于存储数据段的地址,SS用于存储堆栈段的地址,ES则可以用作附加段寄存器。

3. 标志寄存器标志寄存器是一种特殊的寄存器,它们用于存储程序运行中的各种状态信息。

在x86架构中,有一个标志寄存器,叫做FLAGS寄存器,它包含了各种标志位,用于表示程序运行中的各种状态信息。

其中,比较常用的标志位有:ZF(零标志位),CF(进位标志位),OF(溢出标志位)等。

这些标志位可以帮助程序员判断程序运行中的各种状态,从而进行相应的处理。

总的来说,寄存器是汇编语言中非常重要的概念,程序员需要熟练掌握各种寄存器的作用和用法,才能够编写出高效、正确的汇编程序。

X86寄存器组织结构_图文(精)

X86寄存器组织结构_图文(精)

3.3 8086/8088CPU的寄存器组织 3.3 8086/8088CPU的寄存器组织控制标志用来控制CPU的操作特征(运行状态) DF(Direction Flag 方向控制标志。

STD;DF=1 可由指令置1/清0 CLD;DF=0 在进行字符串操作时,CPU每执行一条串操作指令,对源或(与目的操作数的地址会自动进行一次调整,其调整准则为 DF= 0,自动递增。

1,自动递减。

3.3 8086/8088CPU的寄存器组织 3.3 8086/8088CPU的寄存器组织 IF(Interrupt Enable Flag 外部可屏蔽中断允许标志。

可由指令置1/清0: STI;IF=1,CPU处于开中断状态。

CLI;IF=0,CPU处于关中断状态。

当IF= 1时,CPU能响应外部可屏蔽中断请求; 0时,CPU不能响应外部可屏蔽中断请求。

IF对外部非可屏蔽中断请求以及CPU内部的中断不起作用.
3.3 8086/8088CPU的寄存器组织 3.3 8086/8088CPU的寄存器组织 TF(Trap Flag 陷井标志。

没有专门的置1/清0指令。

当TF=1时,CPU每执行完一条指令便自动产生一个内部中断(类型为1,转去执行一个中断服务程序,用户可以借助中断服务程序来检查每条指令执行的情况,称为单步工作方式,常用于程序的调试。

X86-64寄存器和栈帧

X86-64寄存器和栈帧

寄存器简介
先明确一点,本文关注的是通用寄存器(后简称寄存器)。既然是通用的,使用并没有限制;后面介 绍寄存器使用规则或者惯例,只是GCC(G++)遵守的规则。因为我们想对GCC编译的C(C++)程序进行分 析,所以了解这些规则就很有帮助。 在体系结构教科书中,寄存器通常被说成寄存器文件,其实就是CPU上的一块存储区域,不过更喜欢使 用标识符来表示,而不是地址而已。 X86-64中,所有寄存器都是64位,相对32位的x86来说,标识符发生了变化,比如:从原来的%ebp变成 了%rbp。为了向后兼容性,%ebp依然可以使用,不过指向了%rbp的低32位。
Pushl %rip //保存下一条指令(第41行的代码地址)的地址,用于函数返回继续执行 Jmp foo //跳转到函数foo
Foo函数第19行的指令ret 相当于:
popl %rip //恢复指令指针寄存器
栈帧的建立和撤销
还是上一个例子,看看栈帧如何建立和撤销 说题外话,以”点”做为前缀的指令都是用来指导汇编器的命令。无意于程序理解,统统忽视之,比 如第31行。 栈帧中,最重要的是帧指针%ebp和栈指针%esp,有了这两个指针,我们就可以刻画一个完整的栈帧 函数main的第30~32行,描述了如何保存上一个栈帧的帧指针,并设置当前的指针。 第49行的leave指令相当于: Movq %rbp %rsp //撤销栈空间,回滚%rsp Popq %rbp //恢复上一个栈帧的%rbp 同一件事情会有很多的做法,GCC会综合考虑,并作出选择。选择leave指令,极有可能因为该指令需 要存储空间少,需要时钟周期也少。 你会发现,在所有的函数中,几乎都是同样的套路, 我们通过gdb观察一下进入foo函数之前main的栈帧,进入foo函数的栈帧,退出foo的栈帧情况

x86传参数

x86传参数

x86传参数
在x86体系结构中,函数参数传递通常使用堆栈(stack)来完成。

下面是一些关于x86传递参数的常见规则:
1.寄存器传递:
-前6个整型参数可以通过寄存器传递。

这些寄存器是:`eax`、`ebx`、`ecx`、`edx`、`esi`和`edi`。

-浮点参数通常使用`xmm0`、`xmm1`等寄存器。

2.堆栈传递:
-当参数数量超过寄存器限制时,额外的参数通过堆栈传递。

-参数是从右往左依次推入堆栈,调用函数时的顺序与声明函数时的参数顺序一致。

3.返回值:
-整型返回值通常通过`eax`寄存器返回。

-浮点返回值通常通过`xmm0`寄存器返回。

4.堆栈帧:
-在函数调用时,调用者将返回地址和参数推入堆栈,创建一个堆栈帧。

-被调用的函数使用堆栈上的数据,并在返回时清理堆栈。

5.堆栈对齐:
-堆栈通常需要按照特定的字节对齐方式进行操作,以确保访问存储器的效率。

这些规则是一般性的,具体的实现可能会因编译器、操作系统和调用约定的不同而有所差异。

在阅读特定的汇编代码时,需要查看相关的文档和约定以了解确切的传递规则。

X86中的浮点栈结构

X86中的浮点栈结构

X86中的浮点栈结构在介绍X86浮点栈结构之前,先说明一下X87,X87是IA_32体系结构中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器,使用 X87指令,X86指令集和X87指令集统称为X86指令集。

可以简单的理解X87是一个浮点协处理器,是X86的浮点处理单元。

X86的浮点单元(X87 FPU)用作浮点数据处理,必然要使用寄存器,而且这个寄存器必然要同整点的不同。

那么,在FPU中是怎么设计这些浮点寄存器呢?实际上,X86的FPU中包含一个浮点寄存器栈,它包含了8个80位的可以直接进行浮点运算的寄存器,浮点数以双精度格式存储在这些寄存器中,无论是单精度、双精度还是整数等,被load到这些个寄存器中后,都会转化为双精度。

FPU 指令在使用这些寄存器的时候,是以一种“栈”的方式来使用,叫做“浮点寄存器栈”,其结构如下图所示:这个栈由8个可以直接进行浮点运算的寄存器组成,按照顺序编号为0-7。

CPU在处理浮点运算的时候,将这些寄存器作为一个栈来使用。

它是一个向下扩展的循环栈。

我们知道,整点运算有个FLAG状态寄存器,同样,浮点运算部件中也有个浮点状态寄存器FFLAG,处理器利用浮点状态寄存器中的bit11- bit13三个bit来标记这个栈的栈顶位置(用top指针表示)。

下面介绍下这个浮点栈的工作原理:1.当程序向寄存器栈中装入数据的时候,top指针的值减1,然后将数据压入top指针指向的浮点寄存器中。

2.当top值为0的时候,下一次压栈则将数据压入7号浮点寄存器中,top指针被设置成7(也就是说浮点栈是一个循环栈)。

3.当需要将堆栈中的数据保存到内存中的时候(FST指令),则进行退栈操作。

退栈操作与压栈类似,top指针增加1,若退栈前top值为7,则退栈后top为0(对于X87寄存器来说,一个load操作相当于push,一个store操作相当于pop)。

上述这些操作由硬件来完成,对用户是透明的,用户无须关心压栈和出栈操作以及top值这些细节,FPU提供了FLD,FST等访存指令和FADD等浮点运算指令以及其他一些辅助指令来操作浮点寄存器(可参考IA_32指令集手册)。

第4章 INTEL80X86系列微处理器习题参考答案

第4章 INTEL80X86系列微处理器习题参考答案

第4章Intel80X86系列微处理器习题解答4.1 8086/8088内部寄存器有哪些?哪些属于通用寄存器?哪些用于存放段地址?标志寄存器的含义是什么?答:8086/8088内部有14个16位的寄存器。

8个通用寄存器AX、BX、CX、DX、SP、BP、SI、DI。

4个16位的段寄存器CS、DS、SS、ES,用于存放段地址。

标志寄存器FLAGS用于存放指令执行结果的特征和CPU 工作方式,其内容通常称为处理器状态字PSW。

4.2 对于8086/8088CPU,确定以下运算的结果与标志位。

(1)5439H+456AH (2)2345H+5219H (3)54E3H-27A0H(4)3881H+3597H (5)5432H-6543H (6)9876H+1234H略。

4.3 8086/8088为什么要对存储器采用分段管理?一个段最多包含多少存储单元?答:8086/8088内部与地址有关的寄存器都是16位的,只能处理16位地址,对内存的直接寻址范围最大只能达64KB。

为了实现对1MB单元的寻址,8086/8088系统采用了存储器分段技术。

一个段最多包含64K 个存储单元。

4.4 8086/8088CPU内部共有多少个段?分别称为什么段?段地址存放在哪些寄存器中?答:8086/8088 CPU内部共有4个段。

分别称为代码段、数据段、堆栈段和附加段。

段地址存放在4个16位的段寄存器,CS代码段寄存器、DS数据段寄存器、SS堆栈段寄存器、ES附加段寄存器中。

4.5 简述物理地址、逻辑地址、段基地址和偏移量的含义及其相互关系。

答:物理地址:信息在存储器中实际存放的地址,它是CPU访问存储器时实际输出的地址。

逻辑地址:编程时所使用的地址,由段基地址和偏移量两部分构成。

段基地址(段地址或段基址):段的起始地址的高16位。

偏移量(偏移地址):所访问的存储单元距段的起始地址之间的字节距离。

给定段基地址和偏移量,就可以在存储器中寻址所访问的存储单元。

80386的寄存器组成

80386的寄存器组成

80386共提供7种类型的32位寄存器,如下:1.通用寄存器(EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI)2.段寄存器(CS、SS、DS、ES、FS、GS)3.指令指针寄存器和标志寄存器(EIP、EFLAGS)4.系统表寄存器(GDTR、IDTR、LDTR、TR)5.控制寄存器(CR0、CR1、CR2、CR3、CR4)6.调试寄存器(DR0、DR1、DR2、DR3、DR4、DR5、DR6、DR7)7.测试寄存器(TR6、TR7)其中后三类寄存器是80386以后的CPU才有的,以前的CPU完全没有。

下图是前四类寄存器的大致示意图:本文只对这些寄存器做一个大致的介绍,其中有些特殊且有较大意义的寄存器,会另文介绍。

一、通用寄存器一组八个通用寄存器是对8086/80286通用寄存器的32位扩展,其用法与在8086/80286中相似,支持8位、16位、32位操作,进行32位操作是,寄存器名称前面冠以“E”。

这八个寄存器的名称如下:EAX(累加器)、EBX(基址)、ECX(计数)、EDX(数据)、ESP(栈指针)、EBP(基址指针)、ESI(源变址)、EDI(目的变址)。

二、段寄存器80386比8086/80286增加了两个段寄存器FS、GS。

除CS支持代码段,SS支持堆栈段外,程序员可以利用其它的所有段寄存器支持数据段。

每个段寄存器对应这一个64位高速缓存器(有些资料中说有96位,但值使用其中的64位),这在8086中是没有的(在80286中为48位),它的具体作用将另文介绍。

三、指令指针寄存器和标志寄存器指令寄存器EIP是对8086/80286指令指针寄存器的32位扩展,它包含着待执行指令的32位偏移量,该值总是相对CS所代表的段基址而言的。

标志寄存器也是对8086/80286标志寄存器的32位扩展,其定义如下(这张图截自Intel关于IA32架构的最新文档):其中OF、DF、IF、TF、SF、ZF、AF、PF和CF在8086中就已经存在,请参考相关资料。

HDWX86寄存器详解-40页精选文档

HDWX86寄存器详解-40页精选文档

寄存器目录[隐藏]寄存器定义寄存器用途数据寄存器寄存器分类英文名称:Register[编辑本段]寄存器定义寄存器是中央处理器内的组成部份。

寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。

在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。

在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。

寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。

寄存器通常都是以他们可以保存的位元数量来估量,举例来说,一个“8 位元寄存器”或“32 位元寄存器”。

寄存器现在都以寄存器档案的方式来实作,但是他们也可能使用单独的正反器、高速的核心内存、薄膜内存以及在数种机器上的其他方式来实作出来。

寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。

更适当的是称他们为“架构寄存器”。

例如,x86 指令及定义八个 32 位元寄存器的集合,但一个实作x86 指令集的 CPU 可以包含比八个更多的寄存器。

寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。

[编辑本段]寄存器用途1.可将寄存器内的数据执行算术及逻辑运算;2.存于寄存器内的地址可用来指向内存的某个位置,即寻址;3.可以用来读写数据到电脑的周边设备。

[编辑本段]数据寄存器8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器、(2)指令指针、(3)标志寄存器和(4)段寄存器等4类。

(1)通用寄存器有8个, 又可以分成2组,一组是数据寄存器(4个),另一组是指针寄存器及变址寄存器(4个).数据寄存器分为:AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.BH&BL=BX(base):基址寄存器,常用于地址索引;CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.DH&DL=DX(data):数据寄存器,常用于数据传递。

80X86寄存器及存储器结构介绍

80X86寄存器及存储器结构介绍

二、段寄存器


CS:代码段寄存器
SS:堆栈段寄存器 DS:数据段寄存器 ES:附加段寄存器 IP:指令指针寄存器 与CS一起指向程序中下一条要执行的指令 FLAG:标志寄存器
三、控制寄存器


16位的寄存器,其中9个位是标志位,代表了系统运行 的状态。
80X86寄存器
湖南大器,也称栈顶指针。与堆栈段寄存器SS一起 寻址栈顶单元。 BP:基址指示器。常与SS一起寻址堆栈中的非栈顶单元。

3、变址寄存器

SI:源变址寄存器 DI:目的变址寄存器
它们常用于串操作,当然也可存放数据。
80X86寄存器
湖南大学 赵欢 hzhao@ 3


8088存储器结构
湖南大学
赵欢 hzhao@
7

DF、IF、TF不受算逻指令影响,有专门的方式置/复位;
DF:方向标志 DF=1,串操作为自动地址减量方式 =0,串操作为自动地址增量方式 IF:中断标志 IF=1,开中断;IF=0,关中断 TF:追踪标志 DF=1,CPU为单步执行方式;DF=0,CPU为连续执行方式
湖南大学 赵欢 hzhao@ 5
80X86寄存器

8088有20根地址线,8根数据线。 基本内存配置 具有:220=1M个内存单元 每个单元:8 bits

与地址有关的寄存器CS、SS、DS、ES、IP、SP
BX、BP、SI、DI均是16位的。

16位的寻址能力如何访问1MB的空间?
8088存储器结构
湖南大学 赵欢 hzhao@ 6

FLAG寄存器的各个位
15 12 11 10 9 IF 8 7 6 ZF 5 4 AF 3 2 PF 1 0 CF OF DF TF SF

X86架构基础知识介绍

X86架构基础知识介绍

X86架构基础知识介绍X86架构是一种广泛应用于个人计算机和服务器的指令集架构。

它最初由英特尔公司于1978年推出,并成为个人计算机的主要架构之一、随着时间的推移,X86架构不断发展和演进,目前主要由英特尔和AMD等公司推动。

X86架构支持多种数据类型,包括整数、浮点数和向量数据等。

整数操作可处理不同大小的整数,如8位、16位、32位和64位。

浮点数操作支持单精度和双精度浮点数,以及一些高级浮点操作,如开根号和三角函数等。

向量数据操作允许同时处理多个数据,以提高计算效率。

X86架构采用一种被称为寄存器的特殊存储器件来存储和处理数据。

寄存器是内置在处理器中的高速存储器,可暂时存储和操作数据。

X86架构有多个通用寄存器和特殊寄存器,每个寄存器都有特定的用途和功能。

通用寄存器用于常规数据操作,如存储变量和计算中间结果等。

特殊寄存器用于保存程序状态和控制处理器行为。

X86架构还支持存储器层次结构,其中数据可以在不同层次的存储器之间移动。

处理器内部有多级高速缓存存储器,用于暂时存储数据和指令,以提高访问速度。

此外,X86架构还支持外部存储器,如随机存取存储器(RAM)和硬盘驱动器等,用于长期存储和备份数据。

X86架构的软件生态系统非常丰富,有大量的操作系统、开发工具和应用程序可供选择。

常见的操作系统包括Windows、Linux和macOS等,它们都提供对X86架构的良好支持。

开发工具包括编译器、调试器和性能分析工具等,开发者可以使用这些工具来创建和优化X86架构的软件。

应用程序涵盖了各个领域,包括办公软件、娱乐软件和科学计算等。

近年来,X86架构在能效和性能方面取得了很大进步。

先进的制造工艺和设计技术使得处理器能够提供更高的性能,并在较低的功耗下工作。

同时,X86架构还提供了一些高级功能,如虚拟化和安全保护等,以满足不同应用场景的需求。

总之,X86架构是一种广泛应用于个人计算机和服务器的指令集架构,它提供了一组丰富的指令集和寄存器,支持多种数据类型和存储器层次结构。

x86汇编指令整理

x86汇编指令整理

x86汇编指令整理1,寻址⽅式1,⽴即数寻址MOV AX, 0102H ;AX←0102H2、寄存器寻址⽅式指令中指明某个寄存器其内容即为操作数,寄存器在CPU内,不⽤总线周期,执⾏速度快。

8位寄存器r8:AH、AL、BH、BL、CH、CL、DH、DL16位寄存器r16:AX、BX、CX、DX、SI、DI、BP、SP4个段寄存器seg:CS、DS、SS、ESMOV AX, BX ;AX←BX3,直接寻址⽅式指令中直接给出操作数所在内存单元的有效地址(EA即偏移地址)默认的段地址在DS段寄存器,若在其它段可使⽤段超越前缀改变。

⽤⽅括号包含有效地址,表达存储单元的内容直接地址也可⽤标号代表,⽅括号可省略。

MOV AX, [2000H] ;AX←DS:[2000H]MOV AX, ES: [2000H] ;AX←ES:[2000H]4、寄存器间接寻址⽅式指令中给出的寄存器的内容包含操作数的有效地址。

间接寻址中使⽤的寄存器名要⽤⽅括号括起来1、基址寻址⽤BX或BP作间接寻址寄存器如:MOV AX,[BX] ;隐含在DS段MOV AX,[BP] ;隐含在SS段2、变址寻址⽤SI或DI作间接寻址寄存器如:MOV CL, [SI]MOV AX, [DI]单独使⽤SI或DI时,隐含在DS段中在串操作时,SI隐含在DS段中,DI隐含在ES段中。

3、相对基址寻址指令中给出基址寄存器及位移量,⼆者之和为操作数的有效地址。

位移量可以是8位或16位。

有效地址=BX/BP+8/16位位移量4、相对变址寻址指令中给出变址寄存器及位移量,⼆者之和为操作数的有效地址。

有效地址=SI/DI+8/16位位移量段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可⽤段超越前缀改变MOV AX, [SI+06H] ;AX←DS:[SI+06H]MOV AX, 06H[SI] ;AX←DS:[SI+06H]5、基址变址寻址⽅式有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:有效地址=BX/BP+SI/DI段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可⽤段超越前缀改变 MOV AX, [BX+SI] ;AX←DS:[BX+SI]MOV AX, [BX][SI] ;AX←DS:[BX+SI]6、相对基址变址寻址⽅式有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与⼀个8位或16位位移量之和:有效地址=BX/BP+SI/DI+8/16位位移量段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可⽤段超越前缀改变 MOV AX, [BX+DI+6] ;AX←DS:[BX+DI+6]MOV AX, 6[BX+DI] MOV AX, 6[BX][DI]各种寻址⽅式综合举例设BX=1200H DI=10A0H 位移量=2BC0HDS=2400H 求各种寻址⽅式下的有效地址和物理地址。

x86设备的寄存器传递

x86设备的寄存器传递

x86设备的寄存器传递
x86设备的寄存器传递是指在x86架构的计算机中,程序通过寄存器来传递参数和返回值的过程。

x86架构中共有8个通用寄存器,分别为eax、ebx、ecx、edx、esi、edi、ebp和esp。

其中eax、ebx、ecx和edx通常用于传递函数参数和返回值,而esi和edi则通常用于指向数据区的指针。

ebp通常用于指向栈底,esp则用于指向栈顶。

在调用函数时,程序会将参数依次存储到eax、ebx、ecx和edx 中。

如果参数超过了4个,则会将其余的参数存储到栈中。

函数返回时,返回值通常存储在eax中。

如果返回值为一个结构体或一个较大的数据类型,则通常需要使用指向该数据结构的指针来传递返回值。

在使用寄存器传递参数时,需要注意寄存器的用途和值的类型。

例如,eax通常用于传递整型或指针,而xmm0-xmm7则通常用于传递浮点型参数。

同时,需要考虑寄存器的保存和恢复。

在调用函数时,程序需要保存调用者保存的寄存器,以便在函数返回时能够正确恢复它们的值。

总之,x86设备的寄存器传递是一种高效的参数传递方式,但也需要注意其使用方法和注意事项。

- 1 -。

x86中内存管理寄存器(GDTR、LDTR、IDTR和TR)

x86中内存管理寄存器(GDTR、LDTR、IDTR和TR)

x86中内存管理寄存器收藏一、内存管理寄存器处理器提供了4个内存管理寄存器(GDTR、LDTR、IDTR和TR),用于指定内存分段管理所用系统表的基地址,如图4-2所示。

处理器为这些寄存器的加载和保存提供了特定的指令。

有关系统表的作用请参见4.2节"保护模式内存管理"中的详细说明。

(点击查看大图)图4-2 内存管理寄存器GDTR、LDTR、IDTR和TR都是段基址寄存器,这些段中含有分段机制的重要信息表。

GDTR、IDTR和LDTR用于寻址存放描述符表的段。

TR用于寻址一个特殊的任务状态段(Task State Segment,TSS)。

TSS中包含着当前执行任务的重要信息。

(1)全局描述符表寄存器GDTRGDTR寄存器中用于存放全局描述符表GDT的32位的线性基地址和16位的表限长值。

基地址指定GDT表中字节0在线性地址空间中的地址,表长度指明GDT表的字节长度值。

指令LGDT和SGDT分别用于加载和保存GDTR寄存器的内容。

在机器刚加电或处理器复位后,基地址被默认地设置为0,而长度值被设置成0xFFFF。

在保护模式初始化过程中必须给GDTR加载一个新值。

(2)中断描述符表寄存器IDTR与GDTR的作用类似,IDTR寄存器用于存放中断描述符表IDT的32位线性基地址和16位表长度值。

指令LIDT和SIDT分别用于加载和保存IDTR寄存器的内容。

在机器刚加电或处理器复位后,基地址被默认地设置为0,而长度值被设置成0xFFFF。

(3)局部描述符表寄存器LDTRLDTR寄存器中用于存放局部描述符表LDT的32位线性基地址、16位段限长和描述符属性值。

指令LLDT和SLDT分别用于加载和保存LDTR寄存器的段描述符部分。

包含LDT表的段必须在GDT表中有一个段描述符项。

当使用LLDT指令把含有LDT表段的选择符加载进LDTR时,LDT段描述符的段基地址、段限长度以及描述符属性会被自动地加载到LDTR中。

x86处理器中的CS与IP寄存器

x86处理器中的CS与IP寄存器

x86处理器中的CS与IP寄存器(2012-08-09 14:34:07)2.10 CS和IP(1)CS和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址。

CS为代码段寄存器,IP为指令指针寄存器,从名称上我们可以看出它们和指令的关系。

在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU 将从内存M*16+N单元开始,读取一条指令并执行。

也可以这样表述:8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。

图2.10展示了8086CPU读取、执行指令的工作原理(图中只包括了和所要说明的问题密切相关的部件,图中数字都为十六进制)。

图2.10说明如下。

(1) 8086CPU当前状态:CS中的内容为2000H,IP中的内容为0000H;(2) 内存20000H~20009H单元存放着可执行的机器码;(3) 内存20000H~20009H单元中存放的机器码对应的汇编指令如下。

地址:20000H~20002H,内容:B8 23 01,长度:3Byte,对应汇编指令:mov ax,0123H地址:20003H~20005H,内容:BB 03 00,长度:3Byte,对应汇编指令:mov bx,0003H地址:20006H~20007H,内容:89 D8,长度:2Byte,对应汇编指令:mov ax,bx地址:20008H~20009H,内容:01 D8,长度:2Byte,对应汇编指令:add ax,bx下面的一组图(图2.11~图2.19),以图2.10描述的情况为初始状态,展示了8086CPU读取、执行一条指令的过程。

注意每幅图中发生的变化(下面对8086CPU 的描述,是在逻辑结构、宏观过程的层面上进行的,目的是使读者对CPU工作原理有一个清晰、直观的认识,为汇编语言的学习打下基础。

其中隐蔽了CPU 的物理结构以及具体的工作细节)。

64位汇编语言简介

64位汇编语言简介

x86-64位汇编语言简介一、x86-64的寄存器x86-64较x86-32多了8个通用寄存器,而且,每个通用寄存器都是64位宽,它们是:rax,rbx,rcx,rdx,rsi,rdi,rsp,rbpr8,r9,r10,r11,r12,r13,r14,r15同时,x86-64全面支持x86-32和x86-16的通用寄存器:eax,ax,al,ah,ebx,bx,bl,bh,....而且,还对传统的edi,esi做了改进:edi ,32位di,16位dil ,8位,在传统的x86机器中,di是不可按照8位来访问的,但在x86-64下可以。

同样esi也可以按照8位来访问。

一个很特别的寄存器rip,相当于x86-32的eip.在x86-32是不可直接访问的,如mov eax,eip是错的,但在x86-64位下却可以,如mov,rax,qword ptr [rip+100]是对的。

而且,它除了是个程序计数器外,也是个“数据基地址”,有此可见,它现在是身兼两职!为什么在x86-64位下要用rip做访问数据的基地址呢?因为,在x86-64下,DS,ES,CS,SS都没有实际意义了,也就是说,它们不再参与地址计算,只是为了兼容x86-32。

FS,GS还是参与地址计算,它们两个和x86-32的意义相同。

二、x86-64的汇编x86-64的汇编和x86-32的没有多大的区别。

添加了新寄存器和指令。

写64位汇编代码时,可以用8、16、32、64位寄存器,如:push rdisub rsp, 48 ;mov r10, rcx; Line 36mov rdi, rdxxor eax, eaxmov ecx, 512rep stosb; Line 43movsxd r8, DWORD PTR [r10+16]mov QWORD PTR [rsp+32], rdxmov r9, QWORD PTR [r10+648]mov rdx, QWORD PTR [r10+52]mov rcx, QWORD PTR [r10+44]call fs_read_disk; Line 47mov ecx, 1cmp eax, ecxcmovne ecx, eaxmov eax, ecx; Line 52add rsp, 48pop rdiret 0再如:$L1818:; Line 2398mov al, BYTE PTR [rdx+rbx]cmp al, 32jne SHORT $L1819mov BYTE PTR [rdx+rbx], 0$L1819:add r8d, 1movsxd rdx, r8dxor eax, eaxmov rcx, r12mov rdi, rbxrepne scasbnot rcxsub rcx, 1cmp rdx, rcxjb SHORT $L1818但,有点值得注意,当操作传统的32位寄存器时,那么,整个64位寄存器都会受到影响,如:mov eax,0ah那么,rax也等于000000000000000ah再如:mov rcx,0aaaaaaaaaaaaaaaah(此时ecx等于0aaaaaaaah)mov ecx,0ddddddddh(此时,rcx等于00000000ddddddddh,高32位受到了影响).规则:Example 1: 64-bit Add:Before:RAX =0002_0001_8000_2201RBX =0002_0002_0123_3301ADD RBX,RAX ;48 is a REX prefix for size.Result:RBX = 0004_0003_8123_5502Example 2: 32-bit Add:Before:RAX = 0002_0001_8000_2201RBX = 0002_0002_0123_3301ADD EBX,EAX ;32-bit addResult:RBX = 0000_0000_8123_5502(32-bit result is zero extended)Example 3: 16-bit Add:Before:RAX = 0002_0001_8000_2201RBX = 0002_0002_0123_3301ADD BX,AX ;66 is 16-bit size overrideResult:RBX = 0002_0002_0123_5502(bits 63:16 are preserved)Example 4: 8-bit Add:Before:RAX = 0002_0001_8000_2201RBX = 0002_0002_0123_3301ADD BL,AL ;8-bit addResult:RBX = 0002_0002_0123_3302(bits 63:08 are preserved)三、指令集变化小结:当然,这里说的都是最基本的东西,是针对通用寄存器言的。

X86常见的寄存器

X86常见的寄存器

X86常见的寄存器:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)数据寄存器4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。

程序员可利用数据寄存器的这种”可分可合”的特性,灵活地处理字/字节的信息。

寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。

累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;寄存器BX称为基地址寄存器(Base Register)。

它可作为存储器指针来使用;寄存器CX称为计数寄存器(Count Register)。

在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器DX称为数据寄存器(Data Register)。

在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。

EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。

EBX是"基地址"(base)寄存器, 在内存寻址时存放基地址。

ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。

EDX则总是被用来放整数除法产生的余数。

EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。

x86-64指令集

x86-64指令集

x86-64指令集X86寄存器x86寄存器分类:8个通⽤寄存器:EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP1个标志寄存器:EFLAGS6个段寄存器:CS、DS、ES、FS、GS、SS5个控制寄存器:CR0、CR1、CR2、CR3、CR48个调试寄存器:DR0、DR1、DR2、DR3、DR4、DR5、DR6、DR74个系统地址寄存器:GDTR、IDTR、LDTR、TR其他寄存器:EIP、TSC等。

指令详解movsb movsw movsd 这三个指令,都是数据传送指令,都是从源地址[RSI]向⽬的地址[RDI]传送数据。

16位模式下:源地址是DS:SI,⽬的地址是ES:DI32位模式下:源地址是DS:ESI,⽬的地址是ES:EDI注意:在传送完成之后,SI和DI(或者ESI和EDI)会增加或者减⼩。

当DF=0 时,表⽰正向传送,传送之后SI和DI(或者ESI和EDI)的值会增加;当DF=1 时,表⽰反向传送,传送之后SI和DI(或者ESI和EDI)的值会减⼩;他们的区别是:MOVSB:传送⼀个字节,之后SI和DI(或者ESI和EDI)加/减1MOVSW:传送⼀个字,之后SI和DI(或者ESI和EDI)加/减2MOVSD:传送⼀个双字,之后SI和DI(或者ESI和EDI)加/减4单纯的movsb/ movsw/ movsd只能执⾏⼀次,如果希望处理器⾃动地反复执⾏,可以加上指令前缀rep;在寄存器CX(16位模式)或者ECX(32位模式)中设置传送的次数。

当CX/ECX不等于0时,则执⾏movsb/ movsw/ movsd,执⾏后,CX/ECX的值减⼀,直到减为0为⽌。

Bochs调试sreg 显⽰段寄存器信息初始化此时是暂停在BIOS中。

⽽我们的代码是从0x7C00位置开始的,所以先要在那⾥设⼀个断点,然后继续运⾏到断点:break 0x7c00continue(0) Breakpoint 1, 0x00007c00 in ?? ()Next at t=4967728(0) [0x00007c00] 0000:7c00 (unk. ctxt): mov ax, 0x07c0 ; b8c007开启trace-reg on后, 再执⾏单步调试的时候都会显⽰寄存器的当前状态了接下来可以⽤命令help来查看调试系统的各种基本命令,这⾥给出了⼀些常⽤的命令执⾏控制指令指令含义c/cont/continue连续执⾏s/step/stepi [count]执⾏count条指令,默认为1条,会跟进到函数和中断调⽤的内部p/n/next [count]执⾏count条指令,默认为1条,但跳过函数和中断调⽤Ctrl+C停⽌执⾏,并回到命令⾏提⽰符下q/quit/exit退出调试和执⾏断点设置命令指令含义vb/vbreak seg:offset在虚拟地址上设置指令断点,其中seg和offset可以是以0x开始的⼗六进制数,或⼗进制,或者是以0开头的⼋进制数lb/lbreak addr在线性地址上设置断点,addr同上⾯的seg和offsetb/break/pb/pbreak addr在物理地址上设置断点info break显⽰当前所有断点的信息d/del/delete n删除⼀个断点内存操作指令指令含义x /nuf addr检查位于线性地址addr处的内存内容xp /nuf addr检查位于物理地址addr处的内存内容其中参数n、u、f分别表⽰:n为要显⽰内存单元的计数值,默认为1u表⽰单元⼤⼩,默认值为wb(bytes) 1字节h(halfwords) 2字节w(words) 4字节g(giantwords) 8字节f为显⽰格式,默认为xx(hex)显⽰为⼗六进制数d(decimal)显⽰为⼗进制数u(unsigned)显⽰为⽆符号⼗进制数o(octal)显⽰为⼋进制数t(binary)显⽰为⼆进制数c(char)显⽰为对应的字符信息显⽰和CPU寄存器操作命令指令含义r/reg/regs/registers列表显⽰CPU寄存器及其内容set $reg=val修改某寄存器的内容。

x86-1-32位x86处理器编程架构

x86-1-32位x86处理器编程架构

x86-1-32位x86处理器编程架构x86(32位)-1-32位x86 处理器编程架构Intel 32 位处理器架构简称IA-32(Intel Architecture,32-bit)x86是指intel的86系列的CPU统称,⽐如说8086就是x86⾥⾯中的⼀款CPU。

IA-32,X86-32是指intel的32位CPU架构。

x86系列的处理器架构是从8086发展来的,是基于8086 的,具有延续性和兼容性。

所以x86系列的CPU都可以和8086CPU进⾏类⽐。

1.1 基本执⾏环境:1.1.1 地址空间:32 位的处理器有32根地址线,数据线的数量是32 根或者64根。

因此,它可以访问2的32次⽅(4GB)的内存地址空间,每次可以读写连续的4 字节或者8 字节,这称为双字(Double Word)或者4 字(Quad Word)访问。

1.1.2 寄存器:32位x86 CPU总共包含了8个通⽤寄存器,6个16位段寄存器,⼀个状态处理器EFLAGS和⼀个指令指针寄存器。

1.1.2.1 通⽤寄存器在16位CPU内,有8个通⽤寄存器AX、BX、CX、DX、SI、DI、 BP 和SP,其中,前4个还可以拆分成两个独⽴的8 位寄存器来⽤,即AH、AL、BH、BL、CH、CL、DH 和DL。

32 位处理器在16位处理器的基础上,扩展了这8 个通⽤寄存器的长度,使之达到32位。

其中这个32位相对于16位扩展的寄存器就在16位寄存器的名字上加了⼀个E,这个E就是Extend中⽂扩展的意思。

32 位通⽤寄存器的⾼16 位是不可独⽴使⽤的,但低16 位保持同16 位处理器的兼容性。

在任何时候它们都可以像在16位CPU⾥⼀样使⽤。

32位CPU是兼容16位CPU的,所以照样可以在32 位处理器上运⾏16 位处理器上的软件。

1.1.2.2 指令指针寄存器为了⽣成32 位物理地址,32 位处理器将IP寄存器扩展到了32 位,即EIP。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
类型
名称
二进制码
寄存器说明
多功能寄存器
AL
0
累加寄存器低八位
AH
100
累加寄存器低八位
AX
0
16位累加寄存器
EAX
0
32位累加寄存器
BL
11
基址寄存器低八位
BH
111
基址寄存器低八位
BX
11
16位基址寄存器
EBX
11
32位基址寄存器
CL
1
计数寄存器低八位
CH
101
计数寄存器低八位
CX
1
16位计数寄存器
111
32位目标变址寄存器
SI
110
16位源变址寄存器
ESI
110
32位源变址寄存器
专用寄存器
IP
*
16位指令指针寄存器
EIP
*
32位指令指针寄存器
FLAGS
*
16位标志寄存器
EFLAGS
*
32位标志寄存器
段寄存器
CS
1
代码段寄存器
DS
11
数据段寄存器
ES
0
附加段寄存器
SS
10
堆栈段寄存器
FS
100
任务寄存器七
浮点寄存器
ST0
0
浮点寄存器零
ST1
1
浮点寄存器一
ST2
10
浮点寄存器二
ST3
11
浮点寄存器三
ST4
100
浮点寄存器四
ST5
101
浮点寄存器五
ST6
110
浮点寄存器六
ST7
111
浮点寄存器七
多媒体寄存器
MM0
0
媒体寄存器零
MM1
1
媒体寄存器一
MM2
10
媒体寄存器二
MM3
11
媒体寄存器三
MM4
ECX
1
32位计数寄存器
DL
10
数据寄存器低八位
DH
110
数据寄存器低八位
DX
10
16位数据寄存器
EDX
10
32位数据寄存器
指针寄存器
SP
100
16位堆栈指针寄存器
ESP
100
32位堆栈指针寄存器
BP
101
16位基址指针寄存器
EBP
101
32位基址指针寄存器
变址寄存器
DI
111
16位目标变址寄存器
EDI
标志段寄存器
GS
101
全局段寄存器
控制寄存器
CR0
0
控制寄存器零
CR1*
1
控制寄存器一
CR2
10
控制寄存器二
CR3
11
控制寄存器三
CR4
100
控制寄存器四
CR5*
101
控制寄存器五
CR6*
110
控制寄存器六
CR7*
111
控制寄存器七
调试寄存器
DR0
0
调试寄存器零
DR1
1
调试寄存器一
DR2
10
调试寄存器二
100
媒体寄存器四
MM5
101
媒体寄存器五
MM6
110
媒体寄存器六
MM7
111
媒体寄存器七
单指令流、多数据流寄存器
XMM0
0
单指令流、多数据流寄存器零
XMM1
1
单指令流、多数据流寄存器一
XMM2
10
单指令流、多数据流寄存器二
XMM3
11
单指令流、多数据流寄存器三
XMM4
100
单指令流、多数据流寄存器四
XMM5
101
单指令流、多数据流寄存器五
XMM6
110
单指令流、多数据流寄存器六
XMM7
111
单指令流、多数据流寄存器七
注:英文名称有星号"*"的表示作为保留域,实际并没有使用,二进制码有星号"*"表示无需二进制数表示
DR3
11
调试寄存器三
DR4*
100
调试寄存器四
DR5*
101
调试寄存器五
DR6
110
调试寄存器六
DR7
111
调试寄存器七
任务寄存器
TR0
0
任务寄存器零
TR1
1
任务寄存器一
TR2
10
任务寄存器二
TR3
11
任务寄存器三
TR4
100
任务寄存器四
TR5Leabharlann 101任务寄存器五TR6
110
任务寄存器六
TR7
111
相关文档
最新文档