汇编语⾔---寄存器
基础知识
计算机的硬件分成五⼤组成部件:运算器、控制器、存储器、输⼊设备和输出设备。其中,运算器和控制器是计算机的核⼼,合称中央处理单元CPU(Central Processing Unit)或处理机、处理器(Processor);CPU内部还有⼀些⾼速存储单元,被称为寄存器(Register)。输⼊设备和输出设备往往统称为外部设备(Peripheral),简称外设或I/O设备。在微型计算机中,CPU被称为微处理器(Microprocessor)。
对汇编语⾔程序员来说,计算机系统的结构如图所⽰。它主要由中央处理单元、存储器和输⼊输出设备组成,各部分之间通过系统总线连接。
寄存器英语单词查询
对于编程来说,主要的编程对象就是CPU内部的寄存器。寄存器是处理器内部的⾼速存储单元,⽤于暂时存放程序执⾏过程中的代码和数据,分为透明寄存器(对应⽤⼈员不可⻅、不能编程直接控制)、可编程(Programmable)寄存器(具有引⽤名称、供编程使⽤)、通⽤寄存器(General-Purpo Regist
er)和专⽤寄存器。 应⽤程序主要使⽤通⽤寄存器和专⽤寄存器。通⽤寄存器具有多种⽤途,数量较多、使⽤频度较⾼,专⽤寄存器各⾃只⽤于特定⽬的。
通⽤寄存器
splitterIA32-CPU共有8个32位通⽤寄存器:EAX∕EBX∕ECX∕EDX∕ESI∕EDI∕EBP∕ESP,它们分别是原有8个16位寄存器的扩展,每⼀个32位的通⽤寄存器的低半部分是⼀个16位寄存器:AX/BX/CX/DX/DI/DI/SP/BP,⽽16位寄存器AX/BX/CX/DX⼜分别分为⾼低两个8位寄存器:AH/AL,BH/BL,CH/CL,DH/DL。因此,汇编程序中可以直接操作32位寄存器中的8位,16位和全32位。存取16位寄存器时,相应的32位寄存器的⾼16位不受影响;存取8位寄存器时,相应的16∕32位寄存器的其他位也不受影响。
16位8⾼位8低位
AX AH AL
BX BH BL
CX CH CL
DX DH DL
在进⾏数据传送或运算时,要注意指令的两个操作对象的位数应当是⼀致的
⼀个8位寄存器所能存储的数据范围是0 ~ 2^8-1。
通⽤寄存器都可以保存数据、暂存运算结果,32位/16位的通⽤寄存器也可以存放存储器地址。另外,这些通⽤寄存器还在某些指令中具有特殊⽤途:
EAX——称为累加器,使⽤频度最⾼,⽤于在算术、逻辑运算中保存操作数或中间运算结果,保
存与外设交换的信息。
EBX——称为基址寄存器,常⽤于存放存储器地址,⼀般是指向DS段中数据的指针。
ECX——称为计数器,在循环指令和串操作指令中⽤作隐含计数器。
EDX——I∕O端⼝的指针;常⽤于外设寻址时提供端⼝地址。
ESI——源变址寄存器,串操作的源操作数指针(DS段)。
EDI——⽬的变址寄存器,串操作的⽬的操作数指针(ES段);在串指令中,ESI与DS连⽤、EDI与ES连⽤,分别寻址数据段和附加段;同时,在串指令中,ESI和EDI还都具有⾃动增量或减量的功能。
EBP——为基址指针寄存器,表⽰堆栈段中的基地址。
ESP——为堆栈指针寄存器,指⽰栈顶的偏移地址。
16位结构CPU具有下⾯⼏⽅⾯的结构特性。
运算器⼀次最多可以处理16位的数据;
寄存器的最⼤宽度为16位;
寄存器和运算器之间的通路为16位。
专⽤寄存器
专⽤寄存器包括指令指针寄存器,标志寄存器和段寄存器。标志(Flag)⽤于反映指令执⾏结果或控制指令执⾏形式。32位Intel 80x86 CPU中各种常⽤的标志形成了⼀个32位的标志寄存器EFLAGS,也被称为程序状态字寄存器PSW。标志寄存器中的各种标志分成了两类:6个状态标志,3个控制标志和其他的处理器控制标志。32位指令指针寄存器EIP⽤来指⽰代码段中指令的偏移地址,它与代码段寄存器CS 连⽤,以确定下⼀条指令的物理地址。分⽀、调⽤等操作时执⾏控制转移指令修改,引起程序转移到指定的指
令执⾏出现中断或异常时被处理器赋值⽽相应改变。
段(Segment)是⽤于安排相关代码或数据的⼀个主存区域,汇编程序中存在3种类型的段,它们是代码段、数据段和堆栈段。段寄存器表明某个段在主存中的位置。IA-32 CPU有6个16位的段寄存器:CS∕SS∕DS∕ES/FS∕GS。段寄存器指⽰段基地址,各种寻址⽅式确定段内偏移地址。CS为代码段寄存器,DS为数据段寄存器,ES为附加段寄存器,SS为堆栈段寄存器。FS和GS⼀般⽤作数据段寄存器。
我们可以将⼀段内存定义为⼀个段,⽤⼀个段地址指⽰段,⽤偏移地址访问段内的单元,可以⽤分段的⽅式来管理内存。
⽤⼀个段存放数据,将它定义为“数据段”;
intelligent⽤⼀个段存放代码,将它定义为“代码段”;
⽤⼀个段当作栈,将它定义为“栈段”。
注意:
⼀个段的起始地址⼀定是16的倍数;
偏移地址为16位,变化范围为0-FFFFH,所以⼀个段的长度最⼤为64KB。
CPU可以⽤不同的段地址和偏移地址形成同⼀个物理地址。
段寄存器:8086CPU有4个段寄存器:CS、DS、SS、ES,提供内存单元的段地址。
CS和IP
CS为代码段寄存器,IP为指令指针寄存器,
correct用法CPU将CS、IP中的内容当作指令的段地址和偏移地址,⽤它们合成指令的物理地址,
CPU将CS:IP指向的内容当作指令执⾏。(即PC)
8086CPU的⼯作过程简要描述
从CS:IP指向的内存单元读取指令,读取的指令进⼊指令缓冲器;
IP=IP+所读取指令的长度,从⽽指向下⼀条指令;
执⾏指令。转到步骤1,重复这个过程。
在8086CPU加电启动或复位后(即CPU刚开始⼯作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动
时,FFFF0H单元中的指令是8086PC机开机后执⾏的第⼀条指令。
8086CPU提供转移指令修改CS、IP的内容。
jmp 段地址:偏移地址:⽤指令中给出的段地址修改CS,偏移地址修改IP。如:jmp 2AE3:3
jmp 某⼀合法寄存器:仅修改IP的内容。如:jmp ax。在含义上好似:mov IP,ax
8086CPU不⽀持将数据直接送⼊段寄存器的操作,这属于8086CPU硬件设计
DS 和 [address]
DS寄存器:通常⽤来存放要访问数据的段地址
harry potter and the deathly hallows[address]表⽰⼀个偏移地址为address的内存单元,段地址默认放在ds中
通过数据段段地址和偏移地址即可定位内存单元。
mov bx, 1000H ;8086CPU不⽀持将数据直接送⼊段寄存器的操作
mov ds, bx ;ds存放数据段地址
mov [0], al ;将al数据(1字节)存到1000H段的0偏移地址处,即10000H
mov ax, [2] ;将数据段偏移地址2处的⼀个字(8086为2字节)存放到ax寄存器
大学英语演讲稿
add cx, [4] ;将偏移地址4处的⼀个字数据加上cx寄存器数据放到cx寄存器
sub dx, [6] ;dx寄存器数据减去数据段偏移地址6处的字数据存到dx
SS 和 SP
在基于8086CPU编程的时候,可以将⼀段内存当作栈来使⽤。
amountof栈段寄存器SS,存放段地址,SP寄存器存放偏移地址,任意时刻,SS:SP指向栈顶元素
8086CPU中,⼊栈时,栈顶从⾼地址向低地址⽅向增长。
push ax表⽰将寄存器ax中的数据送⼊栈中,由两步完成。
1、SP=SP-2,SS:SP指向当前栈顶前⾯的单元,以当前栈顶前⾯的单元为新的栈顶;
2、将ax中的内容送⼊SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
pop ax表⽰从栈顶取出数据送⼊ax,由以下两步完成。
将SS:SP指向的内存单元处的数据送⼊ax中;
世界语言分布图
SP=SP+2,SS:SP指向当前栈顶下⾯的单元,以当前栈顶下⾯的单元为新的栈顶。
将10000H~1000FH这段空间当作栈,初始状态栈是空的;
设置AX=001AH,BX=001BH;
将AX、BX中的数据⼊栈;
然后将AX、BX清零;
从栈中恢复AX、BX原来的内容。
mov ax, 1000H
mov ss, ax
mov sp, 0010H ;初始化栈顶
mov ax, 001AH世界和平英文
mov bx, 001BH
push ax
push bx ;ax、bx⼊栈
sub ax, ax ;将ax清零,也可以⽤mov ax,0,
;sub ax,ax的机器码为2个字节,
;mov ax,0的机器码为3个字节。
sub bx, bx
pop bx ;从栈中恢复ax、bx原来的数据
pop ax ;
存储模型
物理存储器以字节为基本存储单位,每个存储单元被分配⼀个唯⼀的地址,这个地址就是物理地址。物理地址空间从0开始顺序编排,直到处理器⽀持的最⼤存储单元。
8086处理器⽀持1MB存储器:00000H~FFFFFH
IA-32处理器⽀持4GB存储器:00000000H~FFFFFFFFH
操作系统利⽤存储管理单元进⾏存储管理,程序并不直接寻址物理存储器,IA-32处理器提供3种存储模型,⽤于程序访问存储器。
IA-32处理器有三种操作模式:实模式,保护模式和虚拟8086模式;⽽它的存储器管理模型也有三种:实地址模型,平展模型和分段模型。
在实模式和虚拟8086模式下,IA-32 CPU⽤于寻址内存空间的地址线是20位,所以内存的寻址空间是1MB,地址从00000H-FFFFFH。处理器在1MB空间中只能执⾏⼀个程序,此时存储器管理模型只能采⽤实地址模型,该模型与16位CPU的存储器管理模型兼容。保护模式下,有32条地址线寻址内存,处理器可以同时执⾏多个程序,并且为每个程序分配4GB的内存空间;此时存储器既可以使⽤分段模型、分⻚管理,⼜可以使⽤段⻚式管理,还可以使⽤平展模型。
平展存储模型(Flat Memory Model)
►存储器是⼀个连续的4GB线性地址空间
段式存储模型(Segmented Memory Model)
►存储器由⼀组独⽴的地址空间组成:段(Segment)
►每个段都可以达到4GB
实地址存储模型(Real-address Memory Model)
►8086处理器的存储模型(最⼤1MB)
►段式存储模型的特例(段最⼤64KB)
逻辑地址
逻辑地址是在处理器内部、程序员编程时采⽤的地址,某个存储单元可以有多个逻辑地址,但只有⼀个唯⼀的物理地址。逻辑地址=段基地址∶偏移地址
段基地址=在主存中的起始地址
偏移地址=距离段基地址的位移量
逻辑地址=相对地址
物理地址=绝对地址
代码段、数据段和堆栈段每个段基地址分别存储在对应的段寄存器中。
程序员编程时采⽤逻辑地址
操作系统利⽤存储管理单元MMU
►将逻辑地址映射为线性地址(虚拟地址)
深圳新东方英语学校
处理器使⽤物理地址访问主存储器芯⽚