第4章 指令系统(二) - 图文 联系客服

发布时间 : 星期日 文章第4章 指令系统(二) - 图文更新完毕开始阅读8a408c77be23482fb4da4cc0

四川警安职业学院标准教案纸

课程名称 授课时间 教学目标 教学重点 教学难点 教学时数 教学内容: 第4章 8086/8088寻址方式及指令系统(二) 计算机组成原理(第二十八讲) 任课教师 陈 平 地点 多媒体 授课班级 人数 1. 掌握跨段知识 2. 掌握8086/8088指令系统 1. 跨段应用 2. 8086/8088指令系统 1. 数据传送指令 2. 乘法指令 3. 控制转移指令 讲授法、演示法、实践操教学手2节 教学方法 多媒体教学 作法 段 4.2 跨段及寻址综合举例 4.2.1 跨段的有关问题 8086的存储器是分段使用的,通常,若选用寄存器(能选用的寄存器有BX、BP、SI和DI)作间址寄存器、变址寄存器或基址寄存器,即在采用寄存器间接寻址、变址寻址或基址加变址寻址时,只有BP出现在方括号之内,则操作数在当前堆栈段,此时,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址EA相加;否则,操作数在当前数据段,此时,操作数的物理地址PA由数据段寄存器DS的内容左移4位与偏移地址EA相加形成。这是8086的具体约定、即默认状态。当要否定默认状态,到非约定段寻址操作数时,必须用跨段前缀指明操作数所在段的段寄存器名。 汇编格式:段寄存器名: 功能:冒号“:”之前的段寄存器指明了操作数所在段。 例4.2.1: 有指令如下: (1) MOV AX, DS: [BP] (2) MOV BX, ES: [BX] (3) MOV CX, SS: [SI] (4) MOV DX, SS: [DI] 则,它们所对应的物理地址为: (1) PA=16D*(DS)+(BP) (2) PA=16D*(ES)+(BX) (3) PA=16D*(SS)+(SI) (4) PA=16D*(SS)+(DI) 如没有段前缀(DS:、ES:、SS:),则它们所对应的默认的物理地址为: (1) PA=16D*(SS)+(BP) (2) PA=16D*(DS)+(BX) (3) PA=16D*(DS)+(SI) (4) PA=16D*(DS)+(DI) 最后需要说明的是:无论是段默认状态,还是跨段情况,操作数的物理地址PA均由系统自动计算。所以,在实际应用中,当要访问某段之中某一存储单元时,着重考虑的不是其物理地址的计算方法及结果,而是其类型及偏移地址的表示形式。因此,从本章之后,我们谈到的存储单元地址均是指偏移地址。 4.2.2 寻址的综合举例 例4.2.2:请回答如下程序执行到EXIT时,字节单元A、B、C、C+1、C+2中的内容各是什么? STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS 1 DATA SEGMENT A DB 0 B DB 0 C DB 30,40,50 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX, DATA MOV DS, AX MOV AL,C MOV A, AL MOV AL,C+1 MOV AL, C+2 MOV B, AL ADD C, 10 ADD C+1,20 ADD C+2,30 EXIT :MOV AH, 4CH INT 21H CODE ENDS END START 说明:DB为数据定义伪指令。其使用格式为: [变量名] DB 表达式 [?] 功能:定义一个以变量名为首地址的字节数据存储区,所含数据存储单元的个数由其后表达式的个数决定,并为各数据存储单元提供一个由其对应表达式得出的初值。 图4-10 数据段中的数据 图4-11 程序运行到EXIT时,运 行结果 在主存中的存放形式示意图 在主存中的存放形式示意图 在本程序数据段中,三次利用伪指令DB定义了三个字节数据存储区,第一个首地址为变量A,它只包含一个字节单元,初值为0;第二个首地址为变量B,它只包含一个初值为0的字节单元;第三个首地址为变量C,包含三个字节单元,其初值分别为30、40、50。它们在主存中存放的形式如图4-10所示。当程序从START执行到EXIT时,各字节变量的内容和存放形式如图4-11所示。

2

即(A)=70,(B)=90,(C)=40,(C+1)=60,(C+2)=80 4.3 8086/8088指令系统 4.3.1 数据传送指令 我们已经知道计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令集提供给用户使用,这组指令集就称为计算机的指令系统。目前,一般小型或微型计算机的指令系统可以包括几十种或百余种指令。 我们已经知道,计算机只能识别二进制代码,所以机器指令是由二进制代码组成的。为便于人们使用而采用汇编语言来编写程序。汇编语言是一种符号语言,它的助记符来表示操作码,用符号或符号地址来表示操作数或操作数地址,它与机器语言是一一对应的。 8086的指令系统可以分为6组:(1) 数据传送指令;(2) 串处理指令;(3) 算术指令;(4) 控制转移指令;(5) 逻辑指令;(6)处理机控制指令。下面分别加以说明。 数据传送指令负责把数据、地址或立即数传送到寄存器或存储单元中。它可以分为四种,分别说明如下: 1.通用数据传送指令 (1) MOV (Move)传送指令 格式为:MOV DST,SRC 执行操作:(DST) (SRC) 其中DST表示目的操作数,SRC表示源操作数。 MOV指令的机器语言可以有如下7种格式: 1) MOV mem/reg1,mem/reg2 当然,双操作数指令不允许两个操作数多使用寄存器,因而两个操作数中必须有一个是寄存器。这种方式不允许指定段寄存器。 2) MOV reg, data 当然,这种方式也不允许指定段寄存器。 3) MOV ac, mem 其中ac为累加器,D给出存储单元的偏移地址。 4) MOV mem, ac 5) MOV segreg, mem/reg 其中reg指定段寄存器,但不允许使用CS寄存器。此外,这条指令执行完后不影响中断,要等下一条指令执行完后才可能响应中断。 6) MOV mem/reg, segreg 7) MOV mem/reg, data 这种方式的目的操作数只用存储器寻址方式而不用寄存器方式。 以上七种方式说明MOV命令可以在CPU和存储器之间传送字或字节,它传送的信息可以从寄存器到寄存器,立即数到寄存器,立即数到存储单元,从存储单元到寄存器,从寄存器到存储单元,从寄存器或存储单元到除CS外的段寄存器(注意,立即数不能直接送段寄存器),从段寄存器到寄存器或存储单元。但是MOV指令的目的操作数不允许用立即数方式,也不允许用CS寄存器,而且除源操作数为立即数的情况外,两个操作数中必须有一个是寄存器。也就是说,不允许用MOV指令在两个存储单元之间直接传送数据。此外,也不允许在两个段寄存器之间直接传送信息。还应该注意的是MOV指令不影响标志位。 (2) PUSH(Pop onto the stack)进栈指令 格式为: PUSH SRC 执行操作:(SP)<-- (SP) - 2

3

((SP)+1,(SP))<-- (SRC) (3) POP(Pop from the stack)出栈指令 格式为: POP DST 执行操作:(DST)<-- ((SP) + 1,(SP)) (SP) <-- (SP) + 2 这两条堆栈的进栈和出栈指令。堆栈是以“后进先出”方式工作的一个存储区,它必须存在于堆栈段中,因而此段地址存放于SS寄存器中。它只有一个出入口,所以只有一个堆栈指针寄存器SP,SP的内容在任何时候都指向当前的栈顶,所以PUSH和POP指令都必须根据当前SP的内容来确定进栈或是出栈的存储单元,而且必须及时修改指针,以保证(SP)指向当前的栈顶。 堆栈的存取必须以字为单位,所以PUSH和POP指令只能作字操作。它们可以使用除立即数以外的其他寻址方式。指令也可以指定段寄存器作为操作数,但POP指令不允许用CS寄存器。这两条堆栈指令不影响标志位。 例 4.3.3: PUSH AX 堆栈在计算机工作中起着重要的作用,如果在程序中要用到某些寄存器,但它的内容却在将来还有用,这时就可以用堆栈把它们保下来,然后到必要时再恢复其原来的内容。例如: PUSH AX PUSH BX ? 其间程序用到AX和BX寄存器 ? POP BX POP AX 堆栈在子程序结构的程序及中断程序中也很有用,这将在以后加以说明。 (4) XCHG(Exchange) 交换指令 格式为: XCHG OPR1,OPR2 执行操作:(OPR1)<--> (OPR2) 其中OPR表示操作数。该指令的两个操作数中必须有一个在寄存器中,因而它可以在寄存器之间或者在寄存器和存储器之间交换信息,但不允许使用段寄存器。指令允许字或字节操作,且不影响标志位。 2.累加器专用传送指令 这组指令只限于使用累加器AX或AL传送信息,不影响标志位。 (1) IN(Input)输入指令 长格式为: IN AL,PORT (字节操作) IN AX,PORT (字操作) 执行的操作:(AL)<-- (PORT) (字节操作) (AX)<-- (PORT+1,PORT) (字操作) 短格式为: IN AL,DX (字节操作) IN AX,DX (字操作) 执行的操作:(AL)<-- ((DX)) (字节操作) (AX)<-- ((DX)+1,(DX)) (字操作) (2)OUT(Output)输出指令 长格式为: OUT PORT,AL (字节操作) OUT PORT,AX (字操作)

4