《微机原理与接口技术》PPT电子课件教案-第四章 80868088的指令系统(2) .ppt_第1页
《微机原理与接口技术》PPT电子课件教案-第四章 80868088的指令系统(2) .ppt_第2页
《微机原理与接口技术》PPT电子课件教案-第四章 80868088的指令系统(2) .ppt_第3页
《微机原理与接口技术》PPT电子课件教案-第四章 80868088的指令系统(2) .ppt_第4页
《微机原理与接口技术》PPT电子课件教案-第四章 80868088的指令系统(2) .ppt_第5页
免费预览已结束,剩余69页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三节 8086/8088的指令系统 一. 概述 二. 数据传送指令 三. 算术运算指令 四. 逻辑运算指令 五. 控制转移指令 六. 处理机控制指令 七. 串操作指令 1 一概述 8086/8088的指令系统中共有92种基本指令。 可以分成6个功能组: 数据传送(data transfer) 算术运算(arithmetic) 逻辑运算和移位指令(logic (ds) = 200h mov 100h , cl ;(02100h) = (cl) 编程1: mov ax, 200h mov ds , ax ; (ds) = 200h mov di , 100h ; (di) = 100h mov di , cl ;(02100h) = (cl) 编程2: mov 200h:100h , cl 22 movmov指令应用(自学)指令应用(自学) 例: 实现将area1开始的100个数据传送到area2开始的单元。 area1: area2: 100个数据 23 分析题意: 可以用200条mov指令来完成100个数据传送, 指令操作重复,每个数据传送后的地址是变化的。 可以利用循环, 但每循环一次要修改地址(源地址和目的地址), 必须把地址放在寄存器当中,用寄存器间接寻址来寻找操作数. 24 得到如下程序: mov si,offsetoffset area1 mov di,offsetoffset area2 mov cx,100 again :mov al,si mov di,al inc si inc si ;修改地址指针修改地址指针 inc di inc di ;修改地址指针修改地址指针 dec cxdec cx;修改个数修改个数 jnz again 25 2. xchg交换指令 格式 xchg oprd1,oprd2 执行 (oprd1) (oprd2) reg reg reg mem mem reg 可实现 26 例 xchg ax, bx 字操作 执行前(ax)= 1122h (bx)= 3344h 执行后(ax)= 3344h (bx)= 1122h 例 xchg ah, bl 字节操作 执行前(ax)= 1122h (bx)= 3344h 执行后(ax)= 4422h (bx)= 3311h 27 xchg oprd1,oprd2 注意事项: l 双操作数指令 l可进行字或字节操作,不影响标志位。 l不允许对立即数、段寄存器做操作数 xchg ax, 4 xchg bx, ds 存储器之间不能交换,两个操作数中必须有一个在寄存器中 ; xchg bx,di(错) 28 3. 3. 输入输出指令输入输出指令(input and output) 输入输出指令共两条: ( 1 )1 )、inin (input byte or word) ( 2 )2 )、outout (output byte or word) 输入指令用于cpu从外设端口接收数据, 输出指令用于cpu向外设端口发送数据。 无论接收还是发送数据,必须通过累加器ax(字)或al(字节) , 又称累加器专用传送指令 。 输入、输出指令不影响标志位。输入、输出指令不影响标志位。 29 每个外设要占几个端口:数据口,状态口和控制口。 30 由图可见:信息交换要通过端口:由图可见:信息交换要通过端口: 在ibmpc机里,可以配接许多外部设备, 每个外设与cpu之间交换数据,状态信息和控制命令, 每一种信息交换都要通过一个端口来进行。 端口数:外部设备最多有65536个i/o端口。 a0a15译码形成。 端口号:端口号(即外设端口地址)为0000hffffh。 pc机仅使用a0a9译码形成i/o口地址,即1024h个口地址 端口号:0000h03ffh 其中: a9=1,表示扩充槽上的口地址。 31 长格式:长格式: 端口号中前端口号中前256256个端口(个端口(00h ffh00h ffh),可以直接写在指令 中, 端口号代替指令中的port, 机器指令用二字节表示,第二字节就是端口号。 短格式:短格式: 当端口号当端口号 256256时,只能使用短格式时,只能使用短格式, 必须先把端口号放到dx寄存器中。 不需要用任何段寄存器来修改它的值。 32 (1)(1)、in (input byte or word) in (input byte or word) 输入指令输入指令 格式:in acc, port ;(acc) (port) 具体形式有四种: 长格式长格式: : in al, data8 ; 端口地址8位,输入一个字节 in ax, data8 ;端口地址8位,输入一个字 短格式短格式: : in al, dx ;端口地址16位,输入一个字节 in ax, dx ;端口地址16位,输入一个字 必须通过累加器ax(字)或al(节)输入数据。 33 (2 )(2 )、outout(output byte or word) 输出指令输出指令 格式: out port, acc ;(port) (acc) 具体形式有四种: 长格式长格式: : out data8 , al ; 端口地址8位,输出一个字节 out data8, ax ;端口地址8位,输出一个字 短格式短格式: : out dx , al ;端口地址16位,输出一个字节 out dx , ax ;端口地址16位,输出一个字 必须通过累加器ax(字)或al(节)输出数据。 34 例1:实现(29h)(28h)(data_word) 长格式长格式: : in ax,28h mov data_word,ax 例2:从端口3fch 送一个字到ax寄存器 短格式短格式: : mov dx,3fch in ax,dx ; (al)(3fch), (ah)(3fdh) 例3:实现将(al) (05h) 长格式长格式: : out 5,al;(05h)(al) 35 4 push (push word onto stack) pop (pop word off stack) 这是两条堆栈操作指令。 (1)(1) 先介绍一下什么是堆栈,为什么需要堆栈先介绍一下什么是堆栈,为什么需要堆栈 l 堆栈是按照先进后出原则组织的一段内存区域。 通常用于存放一些重要数据, 如:程序的地址、或是需要恢复的数据。 l为方便数据的存放和恢复, 设置专门的指针,指向堆栈中要操作的单元。 段值由 ss 给出,偏移地址由 sp 给出 ss 堆栈段寄存器 (stack segment) sp 堆栈指针寄存器 (stack point) ss:sp 36 特点:特点: 下推式的(规定堆栈设置在堆栈段内)改变sp的内容 , 随着推入堆栈内容增加,sp的值减少。 先进后出工作原则(last in first out 简称lifo) 堆栈在内存中的情况: 37 堆栈在内存中的情况:堆栈在内存中的情况: 可以用一条立即数传送指令给sp赋值,确定sp在ss段中的初始位置。 例: 设: (ss)=9000h , 堆栈段为64kb mov sp,0e200h;(sp)=0e200h 则: 整个堆栈段的物理地址范围为: 90000h9ffffh90000h9ffffh 栈顶的栈顶的物理地址为:物理地址为:9e200h9e200h 堆栈在内存中的情况如右图所示: 堆栈在内存中的情况 38 (2) (2) 堆栈操作指令堆栈操作指令 (堆栈操作指令有两条): 入栈指令入栈指令 格式:push src ; (sp) (sp)-2 (sp)+1,(sp) (src) 把一个字从源操作数把一个字从源操作数( (srcsrc) )由由spsp指向堆栈顶部。指向堆栈顶部。 出栈指令出栈指令 格式:pop dest ;(dest) (sp)+1,(sp) (sp) (sp)+2 把现行把现行spsp所指向堆栈顶部的一个字所指向堆栈顶部的一个字 指定的目的操作数指定的目的操作数( (destdest) ), 同时进行修改堆栈指针的操作。同时进行修改堆栈指针的操作。 ss:sp ss:sp (src) ss:sp ss:sp (dst) 39 push 入栈操作 格式 push src 执行 ( sp) (sp)- 2 (ss:sp) (src) 特点: l 单操作数指令 l 操作数为16位,可以是reg/segreg/mem, 不可以是data reg : ax, bx, cx, dx, si, di, bp, bx segreg : cs, ds, es, ss mem : 字类型 ss:sp ss:sp (src) 40 例: push ax 若执行前: (ss)= 2000h (sp)= 1002h (ss:sp)= 2010h (ax)= 1234h 指令执行前 3b 2a 10 低 高 20 地址 ss:sp 2000h:1002h (ax)=1234h 则执行后: (ss)= 2000h (sp)= 1000h (ss:sp)= 1234h (ax)= 1234h 12 34 10 低 高 20 地址 ss:sp 2000:1000 指令执行后 (ax)=1234h 不变 减2 变 不变 41 特点: l单操作数指令 l操作数为16位,可以是reg/segreg/mem, 不可以是data reg : ax, bx, cx, dx, si, di, bp, bx segreg : ds, es, ss, 不允许是cs mem : 字类型 pop出栈操作 ss:sp ss:sp (dst) 格式 pop dst 执行 (dst) (ss:sp) ( sp) ( sp)+ 2 42 若执行前: (ss)= 2000h (sp)= 1000h (ss:sp)= 1234h (bx)= 5678h 12 34 10 低 高 20 ss:sp 2000:1000 指令执行前 地址 (bx)=5678h 例: pop bx 12 34 10 低 高 20 ss:sp 2000:1002 指令执行后 地址 (bx)=1234h 则执行后: (ss)= 2000h (sp)= 1002h (ss:sp)= 2010h (bx)= 1234h 不变 加2 变 变 43 例:执行下列程序段 push ax push bx mov ax,66h mov bx,99h pop bx pop ax 若执行前 (ss)= 3000h (sp)= 200eh (ss:sp)= 1234h (ax)= 0a0bh (bx)= 0c0dh 3000:200e ss:sp 执行前 (ax)=0a0bh (bx)=0c0dh 34 12 执行后 3000:200c ss:sp 0b 0a 3000:200a ss:sp 执行后0d 0c 3000:200c ss:sp 执行后: (bx)=0c0d 执行 后 (ax)=0066 (bx)=0099 执行后: (ax)=0a0b 3000:200e ss:sp 44 用push往ss段传送一批数据后,再用pop取出时, 取出单元的顺序与存放时的顺序正好相反,“后进先出” pop ax (ax)=0a0b push ax 3000:200ess:sp 执行前 3000:200c ss:sp 3000:200a ss:sp push bx 3000:200e ss:sp 3000:200c ss:sp 0d 0c 0b 0a 34 12 pop bx (bx)=0c0d (ax)=0a0b (bx)=0c0d mov ax,0066 ;(bx)=0099 mov ax,0066 ;(ax)=0066 45 堆栈使用的场合 l 用堆栈保存恢复信息 l 子程序的调用、返回以及中断调用、返回 l 用堆栈传送数据 (程序设计中介绍) 46 主程序 子程序: 子程序:在一个实际程序中,有些操作要执行多次, 把要重 复执行(subroutine)操作编为子程序。 也常把一些常用的操作标准化、通用化的子程序 。 主程序(main program)往往要调用子程序 或处理中断, 暂停主程序,执行子程序或中断服务程序。 47 调用子程序时需调用子程序时需保留内容保留内容: : 调用子程序:将调用子程序:将callcall下条指令地址即下条指令地址即ipip值保留下来值保留下来 (8086中码段寄存器cs和指令指针ip), 才能保证子程序执行完后准确返回主程序继续执行。保证子程序执行完后准确返回主程序继续执行。 执行子程序时执行子程序时, 通常用到内部寄存器,执行结果会影响标志位, 必须在调用子程序之前将现状保护起来现状保护起来。 子程序嵌套或子程序递归(自调自) 保留许多信息,而且保证正确返回(且后进先出)。 后保留先取出原则(即lifo-last in first out)。 48 注意:sp堆栈指针,始终指向栈顶。 sp初值用mov sp, data来设定。 下边详细说明一下堆栈用途:下边详细说明一下堆栈用途: 49 q 存放cpu寄存器或存储器中暂时不使用的数据, 使用数据时将其弹出: push ax; 将(ax)入栈 (ax) (ax ) 50 使用数据时将其弹出: pop bx 51 q 调用子程序(或过程)或发生中断时要保护断点的地址, 子程序或中断返回时恢复断点。 子程序嵌套 断点地址压入和弹出情况 52 注意事项 l 堆栈是一重要数据结构,使用堆栈应有明确目的。 不乱用堆栈操作,不乱修改堆栈内容。 push、pop、pushf、popf 、 call、ret、int、iret 乱修改 ss 和 sp 的内容 包括 乱用bp参与的存储器操作数 乱用指令 53 l push和pop 指令只能对字操作。 push al pop byte ptr bx l 可以对段寄存器操作 但pop不能对cs操作 push ds push cs pop es pop cs 54 自学堆栈应用:比较下边两个程序运行结果? 例:用用bpbp的基址指令的基址指令 代替代替poppop指令指令 mov bp,sp push ax push bx push cx mov cx,bp-6 mov bx,bp-4 mov ax,bp-2 add sp, 6 例 : 压入堆栈的内容压入堆栈的内容 与弹出内容顺序相反与弹出内容顺序相反 push ax push bx push cx pop cx pop bx pop ax 55 5. xlat5. xlat(trans latetrans late)换码指令:换码指令:该指令不影响标志位。 格式: xlat str_table;(al)(bx )+(al) 或 xlat str_table表格符号地址(首地址), 只是为了提高可读性而设置,汇编时仍用bx 。 56 xlat指令使用方法: v 先建立一个字节表格; vv 表格首偏移地址存入表格首偏移地址存入bxbx; vv 需要转换需要转换代码的序号代码的序号(相对与表格首地址位移量)存入存入alal ; (表中第一个元素的序号为0) vv 执行执行xlatxlat指令后,表中指定序号的元素存于指令后,表中指定序号的元素存于alal中中。 (al)为转换的代码。 57 xlatxlat指令应用:指令应用: 若把字符的扫描码转换成ascii码; 或数字09转换成7段数码所需要的相应代码(字形码)等 就要用xlat指令。 例:内存的数据段中有一张十六进制数字的ascii码表。 首地址为:hex_table ,欲查出表中第10个元素(a) 58 执行指令序列: mov bx,offset hex_table mov al,0ah xlat hex_table 假设: (ds)=f000h, hex_table=0040h (al)=0ah 执行xlat以后: (al)=41h=(f004ah) , 即“a”的ascii码。 30h 31h 32h . 39h 41h 42h . 46h . hex_table hex_table+1 hex_table+2 hex_table+0ah hex_table+0bh hex_table+0fhf b a 9 1 2 0 16进制数的ascii码表 59 6. 6. 目的地址传送指令目的地址传送指令(address-object transfer) 8086 /8088 提供三条: 地址指针写入指定寄存器或寄存器对指令。 (1)lea(load effective address) (2)lds (load pointer using ds) (3)les (load pointer using es) 60 (1) lea有效地址传送 格式 lea reg, mem 执行 (reg) mem的ea 即 寄存器 存储器操作数的偏移地址 61 执行后 ( bx ) = 1000h 注意: offset是汇编程序提供的一个操作符,不是cpu的指令. lea bx, buffer 例 buffer是一个符号地址表示的内存操作数(变量)。 . 12h 34h 56h . buffer 内存 ds: 1000h若变量buffer的偏移地址= 1000h 等价于 mov bx ,offset buffer 62 buffer 1a 2b 3c 4d 、 、 例 将buffer为首的4个字节内存内容相加,存放在al中。 mov ax, seg buffer mov ds, ax lea bx, buffer mov cx, 4 mov al, 0 exit: add al, bx inc bx dec cx ;(cx) =(cx) -1 jnz exit ;zf 0, 转至exit 说明: 1) 操作符seg 的作用是取变量的段地址。 执行完前两条指令后,(ds)=buffer的段值 2) 操作符offset的作用是取变量的偏移地址 执行完lea bx, buffer, (bx)为buffer的偏移地址, 3)操作数 bx是以ds为段值,bx为偏移值的内存单元 63 lea reg, mem 特点及注意事项: l目的操作数reg应是16位通用寄存器 lea es, bx lea al, buffer lea 6, bx+si lea di, buffer l 源操作数应是存储器操作数 lea bx, ax l 传送的是内存单元的有效地址,与其内容无关。 . 12h 34h 56h . buffer 内存 64 (2)(2) ldslds (load pointer using ds) 格式:lds reg16, mem32 ;(reg16)(ea) (ds)(ea)+2) 功能:把源操作数指定的把源操作数指定的4 4个相继字节送指令指定的寄存器个相继字节送指令指定的寄存器 及及dsds寄存器中寄存器中 。 前两个单元内容(16位偏移量)装入指定通用寄存器, 后两个单元内容(段地址) 装入到ds段寄存器。 用于写远地址指针。 65 例: 假设: (ds)=c 000h 指令: lds si, 0010h 执行指令后: (si)=0180h (ds)=2000h 80h 01h 00h 20h c000h:0010h (ds) c0011h c0012h c0013h . . 存储器 66 (3)(3) les (load pointer using es)les (load pointer using es) 格式:les reg16, mem32 ;(reg16)(ea) (es)(ea)+2) 功能:把源操作数指定的把源操作数指定的4 4个相继字节送指令指定的寄存器及个相继字节送指令指定的寄存器及eses寄存器中。寄存器中。 前两个单元内容(16位偏移量)装入指定通用寄存器, 后两个单元内容(段地址) 装入到es段寄存器。 此指令常常指定di寄存器。 用于写远地址指针。 67 例: 假设: (ds)=b 000h (bx)=080ah 指令: les di, bx 执行指令后: (di)=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论