2007 /2008学年 第 二 学期
所在系部 计算机工程系 教 研 室 网络教研室 课程名称 微机原理与接口技术 课程类别 专业基础课 授课对象 0520221、222、211 授课教师 王伟 职 称 副教授
教材名称 微型计算机原理与接口技术
2008年 2 月 25 日
1
教 案 首 页
课程名称 微机原理与接口技术 授课时间 3月14日 地点 F05019 授课班级 0520221、222、211 授课学时安排 第三章 指令系统 授课题目,内容(章、节) 3.3.1数据传送类指令 教学目的,要求 掌握数据传送类指令 重 点:指令的格式、功能对标志位的影响 教学重点与难点 难 点 : MOV、PUSH、POP、LEA指令 教学方式,与手段 方法讲授演示法 使用教具 多媒体CAI课件 教学参考资料 微型计算机原理与接口技术 冯博琴 清华大学出版社 教案审批人意见 审批人签名: 日期 课后作业及小结 备注 说明:1. 2学时为一个教案,需加教案首页。 2. 助教上课教案应有教研室主任审批。
2
教学环节及组织:
5.2.1数据传送类指令
1.通用数据传送指令MOV
通用数据传送指令的一般形式为:
MOV dist,src ;dist←src 它表示把源操作数(src),传送给目的操作数(dist),源操作数不变,目的操作数被源操作数所替换。传送指令每次可以传送一个字节或一个字,它可以实现CPU的内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以将立即数送给内存单元或者CPU内部的寄存器。例如:
MOV AL ,28H ;立即数28H送AL
MOV [BX],2004H ;立即数2004H送BX和BX+1所指向的两内存单元 MOV AX,BX ;BX中的16位数据送AX MOV DX,5024 ;立即数5024送DX
MOV AX,[BX] ;BX和BX+1所指的两个内存单元的内容送AX
MOV DS,[SI+BX] ;SI+BX和SI+BX+1所指向的两内存单元的内容送DS MOV [SI],3510H ;立即数3510H送到SI和SI+1所指的两个内存单元
使用MOV指令要注意以下几点:
(1)立即数只能作为源操作数,不能作为目的操作数。
(2)立即数不能直接传送到段寄存器,但可通过其他寄存器或堆栈传送。 (3)MOV指令的两个操作数类型必须相同。
例如: MOV AL, BX 是错误的指令。
(4)CPU中的寄存器除IP外都可通过MOV指令访问。 (5)CS只能作为源操作数,不能作为目的操作数。
(6)段寄存器之间不能直接传送,两个内存单元之间不能直接传送。
例如: MOV [BX],[SI]是错误的指令。
2.交换指令XCHG(eXCHanGe) 交换指令一般形式为: XCHG reg, mem/reg
该指令可以实现字节交换,也可以实现字交换,可以实现数据在CPU的内部寄存器之间交换,也可以实现数据在CPU内部寄存器和存储单元之间进行交换。例如:
XCHG AL,BL; AL和BL的内容进行交换 XCHG AX,DX; AX和DX之间进行字交换
XCHG CX,[3450H]; CX中的内容和3450H、3451H两单元的内容进行交换 3.堆栈操作指令 PUSH,POP
在子程序调用时要保存返回地址,在中断处理过程中要保存断点地址,进入子程序和中断处理后还要保留通用寄存器的值.子程序执行完毕和中断处理完毕返回时,又要恢复通用寄存器的值,并分别将返回地址或断点地址恢复到指令指针寄存器中。这些功能都要通过堆栈来实现。8086的堆栈操作必须遵循以下原则:
·堆栈的存取每次必须是一个字(16位),而不能是单独一个字节。
·堆栈指令中的操作数只能是存储器或寄存器操作数,而不能是立即数。
·堆栈指针SP总是指向栈顶.所谓栈顶,是当前可用堆栈操作指令进行数据交换的存储单元。 ·入栈时“先减后压”(SP先减2,再压入操作数),出栈时“先弹后加”(弹出操作数后,SP加2)。 堆栈操作指令共有两条:
3
压入堆栈指令(简称为压栈或入栈指令):PUSH 弹出堆栈指令(简称出栈指令):POP 其一般形式为:
PUSH mem/reg/segreg POP mem/reg/segreg
特别注意两点:
(1)PUSH CS是合法指令,可POP CS却是非法指令,因为8086指令系统中不允许CS寄存器作为目的操作数,执行POP CS将改变代码段寄存器CS的内容,会导致CPU从一个与程序无关的新段中去取下一条指令,从而使程序错误地运行。
(2)堆栈操作遵循“后进先出”的原则。保存内容和恢复内容时,要按照对称的次序执行一系列入栈和出栈操作。
4.地址传送指令
(1)取有效地址指令LEA(Load Effective Address)
LEA指令的格式为: LEA reg,mem
LEA指令的功能是将存储器地址送到一个寄存器(16位)中,指令的源操作数必须是存储器操作数,目的操作数必须是寄存器操作数。例如:
LEA BP,[3456H] ;将3456单元的偏移量送BP,执行指令后BP=3456H
LEA BX,DATA ;将内存单元DATA的偏移地址送BX,这里DATA为符号地址
例3.11设BX=1000H,DS=6000H, [61050H]=33H,[61051H]=44H,试比较以下两条指令单独执行时的结果。
LEA BX,[BX+50H] MOV BX,[BX+50H]
执行第一条指令后BX=1050H;执行第二条指令后BX=4433H
(2)地址指针装到DS和指定的寄存器指令LDS(Load pointer with DS) LDS指令的一般格式为:LDS reg ,mem
LDS指令的功能是把2个字的地址指针(一个段地址和一个偏移地址)传送到DS和另一个指定的寄存器中,其中地址指针的后一个字(即段地址)送到DS。
例如:设当前DS=1000H,某地址指针的偏移地址3450H 存放在当前数据段的12210H、12211H单元,段地址3000H存放在12212H和12213H单元,则执行指令
LDS DI,[2210H] 后,DI=3450H DS=3000H,其操作过程如图所示。 „„ 1000H×16+2210H 12210H 50 DS 12211H 34 12212H 00 12213H 30 34 50 DI „„ „„
30 00 DS 存储器
图LDS DI,[2210H]指令的操作过程
(3)地址指针装到ES和指定的寄存器指令LES(Load pointer with ES) LES指令格式为: LES reg,mem
LES指令与LDS指令功能类似,只是把DS换成ES。操作时将段地址(后一个字)传送ES段寄存器。 要注意LDS、LES两条指令都是传送一个目的地址指针(包括一个偏移地址和一个段地址),共32位
4
数据;源操作数必须是存储器操作数。
5.标志寄存器传送指令
标志寄存器传送指令共有4条:
(1)读取标志指令LAHF(Load AH from Flags)
LAHF指令执行时,将标志寄存器中的低8位传送到AH中,包括5个状态标志SF,ZF,AF,PF,CF,其对应的位是第7、6、4、2和0位,而第5、3、1位没有定义。LAHF指令的操作过程如图所示。
OF DF IF TF SF ZF AF PF CF 标志寄存器
D7 D6 D4 D2 D0 AH
图LAHF指令的操作过程
(2)设置标志指令SAHF(Store AH into Flags)
SAHF指令刚好与LAHF指令相反,执行时将AH寄存器的相应位送到标志寄存器的低8位。该指令经常用于修改状态标志。
(3)标志入栈指令 PUSHF(PUSH Flags)
该指令将标志寄存器的值压入堆栈顶部,同时堆栈指针SP减2,这条指令在执行后标志寄存器的本身的内容并没有变。
(4)标志出栈指令POPF(POP Flags)
POPF指令与PUSHF指令刚好相反,执行时从堆栈栈顶弹出一个字送到标志寄存器,然后堆栈指针SP的值加2。
PUSHF指令和POPF指令分别起保护标志和恢复标志的作用。PUSH,LAHF对标志位无影响,而SAHF、POPF将对标志位产生影响,使当前的标志位被新的值所替换。
6.累加器专用传送指令
累加器专用传送指令共有三条,它包括输入/输出(I/O)指令和换码指令XLAT。
输入/输出指令共有两条:IN和OUT,它用来实现累加器(AX/AL)与I/O端口之间的数据传送,执行输入指令时CPU可以从一个端口(8位)读入一个字节到AL中,也可以从两个连续的8位端口读一个字到AX中。执行输出指令时,CPU可将AL中的一个字节写到一个8位端口中,也可以将AX中的一个字写到两个连续的8位端口中。
8086系统的I/O指令中有以下两种寻址方式:
·直接寻址方式:指令中直接指出一个8位的I/O端口地址,端口地址为00~FFH。
·寄存器间接寻址方式:当端口地址大于FFH(100H~FFFFH)时,端口地址由DX寄存器指定(也只能由DX指定)。当然,DX中也可存放8位的端口地址。 (1)输入指令IN
IN指令的一般形式为:
IN AL/AX,port ;直接寻址,port为8位立即数表示的端口地址
或IN AL/AX, DX ;间接寻址,由DX指出8位或16位端口地址 例如:IN AL,38H ;将38H端口的字节读入AL
IN AL,DX ;从DX所指端口中读取一个字节到AL
IN AX,50H ;将50H、51H两端口的一个字读入AX,其中50H端口的
字节读入AL,51H端口中的字节读入AH
IN AX,DX ;从DX和DX+1所指的两个端口中读取一个字到AX,低地址端口中的字
节读入AL,高地址端口中的字节读入AH
(2)输出指令OUT
OUT指令的一般形式为:
5
OUT port, AL/AX ;直接寻址,port为8位立即数表示的端口地址或OUT DX, AL/AX ;间接寻址,DX给出8位或16位端口地址 例如:OUT 35H,AL ;将AL中的一个字节输出到35H端口
OUT 60H,AX ;将AX中的一个字输出到60H、61H两端口,其中AL中的
内容输出到60H,AH中的内容输出到61H
OUT DX,AX ;将AX中的一个字输出到DX及DX+1所指的端口中
例3.12 MOV DX,288H OUT DX,AX
执行这两条指令的结果是将AX的内容输出到地址为288H和289H的两个端口。 (3)换码指令XLAT
该指令通过AL和BX寄存器进行表格查找,将8位数装入AL中。它完成的操作为:
AL← [BX+AL],XLAT指令常用于查表操作,即BX寄存器含有表格的起始地址,而AL中的值是作进入表格中的偏移量,查出表格中的内容送入AL中。
例3.13 设DS =3000H, AL=09H, BX=0080H
执行指令XLAT作用是:将存储单元30089H的内容送入AL中。
6
因篇幅问题不能全部显示,请点此查看更多更全内容