单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第二章 32位PC汇编程序设计环境,2.1 32位可编程寄存器体系,32位CPU包含有通用寄存器、段寄存器、标志寄存器EFLAGS、指令指针寄存器EIP、算术逻辑单元(ALU)及控制部件等。,图2.1 CPU与编程相关的寄存器,2.1.1 通用寄存器,32位寄存器的低16位分别包含AX,BX,CX,DX,SI,DI,BP,SP寄存器。同样,16位的寄存器又分别包含AH,AL,BH,BL,CH,CL,DH,DL寄存器,分别对应AX,BX,CX,DX的高8位与低8位。,例2.1,已知AH的内容为75H,AL的内容为72H,则AX的内容为7572H;BX的内容为4612H,BL的内容为12H。求执行传送指令 MOV BX,AX 之后,BX、BH、BL、AH、AL的值。,例2.2,已知DH=10H,CL=48H,求执行加法指令 ADD CL,DH 之后CL和DH的值。,通用寄存器的用途(1),累加器AX(Accumulator):存放每次算法运算的结果,字节累加器为AL。,基址器BX(Base):地址计算时,用作存放基地址的寄存器。,计数器CX(Count):某些指令隐含的计数器,个别指令隐含用CL作计数器。,数据寄存器DX(Data):即端口地址寄存器,某些输入/输出(I/O)操作用来存放外部设备的I/O地址。,源变址器SI(Source Index)和目的变址器DI(Destination Index)均是变址寄存器,可对地址进行增量或减量计算,方便于变址的管理。,基址指针BP(Base Pointer):作为堆栈数据存取操作的基本地址指针寄存器。,栈指针SP(Stack Pointer):堆栈指针寄存器,指示堆栈的当前偏移地址。即从堆栈当前存储单元的地址到堆栈底端的距离(字节数)。,通用寄存器的用途(2),32位通用寄存器是在16位通用寄存器AX,BX,CX,DX,SI,DI,BP,SP的基础上向左扩展16位寄存器而形成的。,例2.3,已知EAX的内容为98765432H,EBX的内容为12340011H,求执行减法指令 SUB EAX,EBX之后EAX,AX,AL,EBX,BX,BH的值。,解:指令SUB EAX,EBX表示EAX-EBXEAX,且EBX的内容不变。即,EAX-EBX=98765432H-12340011H=86425421H EAX,因而各顶的值为:EAX=86425421H,AX=5421H,AL=21H,EBX=12340011H,BX=0011H,BH=00H,2.1.2 基本控制寄存器(1),标志寄存器EFLAGS又称为程序状态字寄存器PSW(Program,Status Word),如图2.1所示。每一位代表程序的某种状态。,基本标志寄存器是指011的标志位,分为条件标志和控制标志。,(1)条件标志用来反映ALU中算术逻辑运算后的结果特征,共有6个,分别为:,符号标志位SF(Sign Flag),:设置成运算操作结果的符号状态。当结果为负时,SF=1;否则SF=0,,零标志ZF(Zero Flag):,运算结果为0时,ZF=1,否则ZF=0,辅助进位标志AF(Auxiliary Carry Flag):,运算过程中第3位有进位值,置AF=1,否则AF=0,2.1.2 基本控制寄存器(2),奇偶标志PF(Parity Flag):,当结果操作数中有偶数个“1”时,置PF=1;否则,PF=0,这个标志位可用于检验机器代码传送是否出错。,进位标志CF(Carry Flag):,记录运算操作时由最高有效位产生的进位值。例如,执行加法指令时,如果向高位有进位,则CF=1,否则CF=0,溢出标志OF(OverFlow Flag):,运算时,或结果操作数结果超出了机器能表示的范围,则产生溢出,置OF=1,否则,OF=0,图2.2 EFLAG寄存器各个位的含义,基本控制寄存器(3),例2.4 执行下面两个加法后,判定各个条件标志位值。,0010 0011 0100 0101,+0011 0010 0001 1001,0101 0101 0101 1110,则指令执行后,各个标志位的值分别为SF=0 ZF=0 PF=0 CF=0 AF=0 OF=0,0101 0100 0011 1001,+0100 0101 0110 1010,1001 1001 1010 0011,则指令执行后,各个标志位的值分别为SF=1 ZF=0 PF=1 CF=0 AF=1 OF=1,基本控制寄存器(4),控制标志的功能是控制执行特殊的功能,包括3个标志。,1.方向标志DF(Direction Flag)用于字符串操作指令的控制。DF设置为0,则串操作控制处理的方向,是从带有最低地址的第一个元素开始逐个处理;若DF1,则串操作从高地址向低地址方向逐个进行处理串元素。,10000H,10001H,10002H,10003H,10004H,10005H,10000H,10001H,10002H,10003H,10004H,10005H,附加段,数据段,SI,DI,SI,DI,DF0,DF1,a,b,c,d,e,f,基本控制寄存器(5),中断允许标志IF(Interrupt Enable Flag)IF1时,CPU允许中断;IF=0,则CPU关闭中断。,跟踪标志TF(Trap Flag)如果TF=1,机器进入单步工作方式,每条指令执行后,显示结果及寄存器等有状态;若TF0,则机器处于连续工作方式。此标志为调试机器或调试程序发现故障而设置。,基本控制寄存器(6),指令指针IP(Instruction Pointer)指出了程序执行过程中的当前要取出的下条指令的地址。当取出一条指令后,IP自动的加上该指令的长度或者形成转移地址,又指示下一条指令的地址。从而控制指令的执行流程。,在主存中采用分段管理方法。段寄存器存放段的起始地址。6个16位段寄存器如下:,代码段寄存器CS(Code Segment)存放当前正在执行代码的段的起始地址。,数据段寄存器DS(Data Segment)存放当前正在执行的程序所用数据的段的起始地址。,基本控制寄存器(7),堆栈段寄存器SS(Stack Segment)存放当前正在执行程序暂时保留信息的段的起始地址。,附加段寄存器ES(Extra Segment)、FS、GS存放程序的数据段的起始地址。为程序设计使用多个数据段提供方便。,2.2 实方式存储器寻址机制,在实方式下,对于16位微处理器,只能寻址1MB存储空间。,存储器中以字节为基本单位进行数据的存储。每个字节单元都有一个编号,称为地址。,16位微处理器有20条地址线,就有2,20,个字节地址,能表示存储器的容量是2,20,(相当于1MB)个字节。32位处理器有32条地址线,则有2,32,个字节地址,存储容量为4GB。,1、单元地址,存储单元的类型有字节单元、字单元和双字单元。存储字节单元的地址是字节地址,字单元的地址是连续2个字节地址中较低的字节地址,双字单元则是4个连续字节中最低字节地址。,存储器地址,0FFFFFH,0FFFFEH,00801H,98H,00800H,00001H,00000H,低位字节,高位字节,21H,低位字节,高位字节,AH,AL,21H,98H,在存放字或双字类型的数据时,按照“低对低,高对高”的存储原则。,2、存储单元的内容,存储单元的内容是指该单元存放的二进制数据(常用16进制表示)。有时这些数据可以是另一存储单元的地址。,例如:,(1)设字单元的地址为100H,100H地址的内容是1869H,则表示为(100H)=1869H,则字单元包含2个连续字节单元的内容是(100H)69H,(101H)18H,(2)设一个存储单元的地址为M,M单元的内容表示为(M),设M单元中存放N,而N又是一个单元的地址,则N单元的内容可表示为(N,)=(M),例2.5 若M=0CA0H,N=0BF9H,(M)=N,(0BF9H)=2630H,求(M)=?,2.2.2 存储器的分段寻址(1),1、分段寻址的原因,多任务、多作业并行时便于共享存储器的需要;方便程序的重定位。,、分段寻址的计算方法,每个存储单元的物理地址用“段地址:偏移地址”来表示。,实方式下段寄存器只有16位,偏移地址也只有16位。,20位的物理地址=段寄存器的内容2,4,+偏移地址,注意:存储器的分段结构是一种逻辑结构。物理地址是唯一确定的,但是它可以不同段地址与偏移地址组合而成。,2.2.2 存储器的分段寻址(1),、物理地址的形成,存储单元的物理地址(PA)段寄存器里的数值向左移位(即在最右边加4个0)+偏移地址,16位段地址,16位偏移地址,0 0 0 0,19 18 4 3 2 1 0,+,20位物理地址,341CH,00000H,123A0H,157BCH,CS=123AH,123A0H,图a:地址计算,图b:存储地址空间,2.2.2 存储器的分段寻址(2),例2.6 设数据1000放在存储器的数据段里,段地址80480H的前位在DS中,该数据所在的存储地址PA到段地址的距离为EA=0602H,求PA=?,(PA)=?,解:因为段地址8048,PA=80482,4,+EA=80480H+0602H=80A82H,(PA)=1000H,2.2.3 段的分配方式(),在实方式下,每一个存储段最大可达64K,最小为16B。对于1M的内存空间,最多可以2,16,个段,最少也有2,4,个段。,通常段的分配由操作系统负责。,段重叠是指每个段的大小允许根据实际情况分配。,2.2.3 段的分配方式(),0150,4200,850,000,段寄存器,CS,DS,ES,SS,存储器,64K代码,64K代码,64K代码,64K代码,段地址,01500H,42000H,8C500H,C0000H,代码区,数据区,附加段区,堆栈区,2.3堆栈存储技术(),堆栈可用于传递参数或临时保留和恢复有关信息的情形。,堆栈单元的物理地址SS2,4,+SP,其中SS是堆栈段寄存器,SP是栈顶指针。,堆栈的压入(PUSH)和弹出(POP)操作都是针对字类型数据。,堆栈的压入指令格式:,PUSH 源操作数 ;将源操作数压入堆栈,执行的操作:SP-2SP ;先将SP指针减后送SP,源操作数 SP;将操作数送至SP表示的单元。SP表示SP的内容作为地址。,2.3堆栈存储技术(),例2.7 设AX=7809H,SP=0100H,执行完PUSH AX指令之后,SP=?,SP=?,解:因为SP-2=0100H-2=00FEHSP,所以SP=00FEH,AX=7809 SP,SP,?,?,SP,09H,78H,0100H,00FFH,00FEH,2.3堆栈存储技术(3),堆栈弹出指令POP指令格式,POP 目的操作数,;将当前SP指向堆栈单元的内容弹出到目的操作数,执行的操作:(SP)目的操作数 ;先将SP单元的内容送入目的操作数,SP+2 SP;后修改SP,即SP的指针加送SP,2.3堆栈存储技术(4),例2.8 设SP=00FCH,(00FCH)=4613H,执行POP BX指令后,BX=?,SP=?,解:(SP)=(00FCH)=4316HBX,SP=SP+2=00FEH,例题:设AX=4130H,BX=2010H,堆栈的初始栈顶SP=100H,执行下列指令序列,PUSH AX,PUSH BX,后,SP=?,若再执行POP BX,POP CX后,CX=?,SP=?,