汇编语言程序设计282943

上传人:bin****86 文档编号:57220103 上传时间:2018-10-20 格式:PPT 页数:49 大小:493.50KB
返回 下载 相关 举报
汇编语言程序设计282943_第1页
第1页 / 共49页
汇编语言程序设计282943_第2页
第2页 / 共49页
汇编语言程序设计282943_第3页
第3页 / 共49页
汇编语言程序设计282943_第4页
第4页 / 共49页
汇编语言程序设计282943_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《汇编语言程序设计282943》由会员分享,可在线阅读,更多相关《汇编语言程序设计282943(49页珍藏版)》请在金锄头文库上搜索。

1、汇编语言程序设计 Assembly Language Programming,第二章 80x86计算机系统组织,计算机的基本结构 CPU Register Memory 内存特性 分段技术,2.1 计算机基本结构,中央处理机CPU,总线控制逻辑,接 口,接 口,存储器,大容量 存储器,I/O设备,I/O子系统,系统总线,组成: 算术逻辑部件、控制部件和寄存器组。CPU的作用:执行算术与逻辑运算。控制指令的执行。编程结构: 对汇编语言程序员来说,关心的是其中的寄存器。,CPU,总线是部件之间进行数据(电信号)交换的通道。80x86计算机的系统总线分为3类:数据总线地址总线控制总线,系统总线,数据

2、总线数据总线是用来传递数据的,定义了CPU在每个内存周期所能存取数据的位数。80x86系列CPU的数据总线为8位、16位、32位或64位。这就是“为什么通常的数据存取是以8位、16位、32位或64位进行的”。数据总线越宽,处理能力越强。具有N位数据总线并不意味着CPU只能处理N位数据。,系统总线,地址总线地址总线用来指出数据的地址(内存或I/O)。地址总线的位数决定了最大可编址的内存与I/O空间。对于N位地址总线,CPU可以提供2N个不同地址:02N -1。地址总线由内存与I/O子系统共享使用(I/O只用低16位)。(如何区分?) 控制总线 控制总线用来控制CPU与内存和I/O设备之间的数据传

3、送方式(如传送方向)。,系统总线,内存是存放指令和数据的部件,由若干内存单元构成。 80x86的内存以字节编址:每个内存单元有唯一的地址,可存放1个字节。 内存单元的2个要素:地址(编号)与值(内容)。 (100H)=34H 1个字占据2个相邻的内存单元; 低字节在低地址单元,高字节在高地址单元;字的地址由其低地址来表示。双字也类似。 同一地址可以看作是字节、字或双字单元的地址。(?),内存,I/O子系统 通过接口电路与微机系统连接 I/O接口由若干寄存器组成:数据寄存器、状态寄存器、命令寄存器 I/O端口:即I/O地址,是区分I/O设备及其寄存器的编号。汇编语言程序员看到的,是端口 8086

4、计算机采用16位表示I/O端口 I/O端口与内存地址如何区分?,I/O 子系统,2.2 80x86 的寄存器组,80868088中共有14个16位寄存器 寄存器在CPU内部,所以访问速度快。但容量小,外存,内存,寄存器与存储器的比较:寄 存 器 存 储 器在CPU内部 在CPU外部访问速度快 访问速度慢容量小,成本高 容量大,成本低用名字表示 用地址表示没有地址 地址可用各种方式形成,专用寄存器,数据寄存器:AX/BX/CX/DX,存放任何数据信息。暂存计算的中间结果,数据中转站。 每个寄存器又有它们各自的专用目的: AX (Accumulator)累加器,使用频度最高,用于算术、逻辑运算以及

5、与外设传送信息等; BX (Base)基址寄存器,常用做存放存储器地址; CX (Count)计数器,作为循环和串操作等指令中的隐含计数器; DX (Data)数据寄存器,常用来存放双字长数据的高16位,或存放外设端口地址。,16位一分为二,AX = 1234H,AH= 12H AL=34H,AX = CDABH,AH = CDH AL = ABH,80386及其后继:EAX,EBX,ECX,EDX,EAX = 12345678H,AX = 5678H,AH = 56H AL = 78H,变址寄存器:SI/DI,变址寄存器常用于存储器寻址时提供地址 串操作类指令中,SI(Source Inde

6、x)是源变址寄存器 串操作类指令中,DI (Destination Index)是目的变址寄存器 16位,不可拆分使用 80386及其后继:ESI,EDI,指针寄存器:SP/BP,指针寄存器用于寻址内存堆栈内的数据 SP (Stack Pointer)为堆栈指针寄存器,指示栈顶的偏移地址 SP 不能再用于其他目的,具有专用目的 BP (Base Pointer)为基址指针寄存器,表示数据在堆栈段中的基地址 SP和BP寄存器与SS段寄存器联合使用以确定堆栈段中的存储单元地址 80386及其后继:ESP,EBP,段寄存器:CS/DS/SS/ES,8086CPU的个16位的段寄存器 代码段寄存器CS

7、 (Code Segment) 数据段寄存器DS (Data Segment) 堆栈段寄存器SS (Stack Segment) 附加数据段寄存器ES (Extra Segment) 段寄存器用来确定该段在内存中的起始地址。 用途特定,不可分开使用。 80386及其后继:FS GS,IP (Instruction Pointer),指令指针寄存器IP,指示代码段中指令的偏移地址 它与代码段寄存器CS联用,确定下一条指令的物理地址 计算机通过CS : IP寄存器来控制指令序列的执行流程 IP寄存器是一个专用寄存器,程序一般不可直接使用该寄存器。 80386及其后继:EIP,标志寄存器,用途:标志

8、寄存器F(FLAGS),又称程序状态字寄存器PSW,是用以记录或存放状态标志和控制标志信息的。 状态标志位用以记录当前运算结果的状态信息 控制标志位用以存放控制CPU工作方式的标志信息。 80386及其后继:FLAGS,状态标志位,(1)进位标志CF (2)零标志ZF (3)符号标志SF (4)溢出标志 OF (5)奇偶标志 PF (6)辅助进位标志AF,控制标志位,方向标志DF 中断允许标志IF 追踪标志TF,为什么要标志寄存器?,Why状态标志位? 一般只需要计算结果 结果特征有时更重要Why控制标志位 改变CPU工作方式,标志寄存器设置,状态标志位的设置是由CPU根据当前程序运行结果的状

9、态自动完成的。状态标志位信息一般用作转移指令的转移控制条件。控制标志位由程序设置,控制CPU的工作方式,进位标志CF(Carry Flag),当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF = 1;否则CF = 0。 例如: 3AH + 7CHB6H 没有进位:CF = 0 AAH + 7CH(1)26H 有进位:CF = 1,零标志ZF(Zero Flag),若运算结果为0,则ZF = 1,否则ZF = 0 例如: 3AH + 7CHB6H,结果不是零: ZF = 0 86H + 7AH(1)00H,结果是零(为什么?): ZF = 1 注意:ZF为1表示的结果是

10、0,符号标志SF(Sign Flag),有符号数据利用最高有效位表示数据的符号。所以,最高有效位就是符号标志的状态。 运算结果最高位为1,则SF = 1;否则SF = 0。 例如: 3AH + 7CHB6H, 最高位D71:SF = 1 86H + 7AH(1)00H, 最高位D70:SF = 0,奇偶标志PF (Parity Flag),当运算结果最低字节中“1”的个数为偶数时,PF = 1;否则PF = 0。 例如: 3AH + 7CHB6H10110110B, 结果中有5个1,是奇数:PF = 0 注意:PF标志仅反映最低8位中“1”的个数是偶或奇,即使是进行16位字操作。,辅助进位标志

11、AF (Auxiliary Carry Flag),运算时D3位(低半字节)有进位或借位时,AF = 1;否则AF = 0。 例如: 3AH + 7CHB6H D3有进位:AF = 1 这个标志主要由处理器内部使用,用于十进制算术运算指令中,用户一般不必关心。(类似于进位标志),溢出标志OF(Overflow Flag),若算术运算的结果有溢出,则OF=1;否则 OF0。 只是对有符号数而言。对无符号数而言,OF1并不意味着结果出错。80H - 01H7FH = 127, OF1 对于无符号数而言,128 1 127,正确 对于无符号数而言,128 1 127,错误,什么是溢出,处理器内部以补

12、码表示有符号数 8个二进制位能够表达的整数范围是:+127 -128 16位表达的范围是:+32767 -32768 如果运算结果超出了这个范围,就是产生了溢出 有溢出,说明有符号数的运算结果不正确 无符号数有溢出吗? FFH + 01H = 00H, CF = 1, 进位溢出,溢出的判断,方法一(CPU): 如果最高位与次高位同时向前有或无进/借位,则OF 0;(?) 如果最高位与次高位不同时向前有或无进/借位,则OF 1; 方法二: 两个正补码数相加结果为负 两个负补码数相加结果为正 正补码数 负补码数为负 负补码数 正补码数为正 其他情况,OF 1,OF 0,溢出和进位,溢出标志OF和进

13、位标志CF是两个意义不同的标志 进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确; 可恢复的错误。 溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。 不可恢复错误。,溢出和进位的对比,例1:7FH + 01H80H 无符号数运算:1271128, 范围内,无进位 有符号数运算: 1271128 ,范围外,有溢出例2:FFH + 01H(1)00H 无符号数运算:2551256,范围外,有进位 有符号数运算:110 , 范围内,无溢出,如何运用溢出和进位,处理器对两个操作数进行运算时,并不知道操作数是有符号数还是无符号数,所以全部设置,按各自规则。 应该利用哪个标志,则由

14、程序员来决定。 将参加运算的操作数是无符号数,就应该关心CF; 将参加运算的操作数是有符号数,则要注意是否溢出。 我怎么知道是什么数? 除了你没人知道,,例: MOV AX, 1MOV BX, 2ADD AX, BX指令执行后,(AX)=3, OF=0, CF=0, ZF=0, SF=0例: MOV AX, FFFFHMOV BX, 1ADD AX, BX指令执行后,(AX)=0, OF=0, CF=1, ZF=1, SF=0,方向标志DF(Direction Flag),用于串操作指令中,控制地址的变化方向: 设置DF0,串操作的存储器地址自动增加; 设置DF1,串操作的存储器地址自动减少。

15、 CLD指令复位方向标志:DF0 STD指令置位方向标志:DF1,中断允许标志IF(Interrupt-enable Flag),用于控制外部可屏蔽中断是否可以被处理器响应: 设置IF1,则允许中断; 设置IF0,则禁止中断。 CLI指令复位中断标志:IF0 STI指令置位中断标志:IF1,陷阱标志TF(Trap Flag),用于控制处理器是否进入单步操作方式: 设置TF0,处理器正常工作; 设置TF1,处理器单步执行指令。 单步执行指令处理器在每条指令执行结束时,便产生一个编号为1的内部中断。这种内部中断称为单步中断,所以TF也称为单步标志。 利用单步中断可对程序进行逐条指令的调试。 这种逐条指令调试程序的方法就是单步调试。,2.3 80x86 CPU的工作模式,实模式 保护模式 虚拟8086模式,实模式(Real Mode),与8086兼容的工作模式,只有低20位地址线起作用,仅能寻址第一个1MB的内存空间。 MS DOS运行在实模式下, 80286-Pentium系列复位后工作于实模式,直到OS引导后,切换到保护模式。,实模式(Real Mode),分段技术 Why? 矛盾:AB 20位 DB 16位 地址:20位地址Register:16位 How? 用两个16位Register 方案?,方案,用两个16位Register,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号