《微机原理与接口技术》课件 第4章
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CLD
REP MOVSB
;设置源串段地址
;设置目的串段地址 ;设置源串偏移地址 ;设置目的串偏移地址 ;将串的长度送入CX ;将DF置为0,地址自动递增 ;重复执行串传送指令,每次传送一个字节
【例4-2】 对附加段中从BUFF开始的100个连续的内存单元进行 清0操作。
程序段如下:
LEA DI,BUFF MOV AL,00H MOV CX,100
4.3.3 循环控制指令
循环控制指令使用CX寄存器作为循环计数器,因此,在使用 循环指令前,必须先将循环次数存入CX中。 每执行一次循环控制指令,CX中的值自动减1,然后对循环 条件进行判断。
注:循环控制指令是短转移,即转移的目标地址必须在当前代码段内,偏移 量的范围为﹣128~127字节。
循环指令对标志位无影响。
4.段间间接调用
格式:CALL DWORD PTR OPR 功能:操作数为一个32位存储器单元,其内容为要调用的子程
序的入口偏移地址(低16位)和段地址(高16位)。
指令执行时,即(SP)←(SP)+4,存储器中指定地址开始的连续四个 单元的内容分别被赋于IP和CS。
【例4-9】 已知:主程序所在代码段的段地址为1000H,(IP)= 0100H,(DS)=2000H,(BX)=0200H,(20200H)=78H,(20201H) =56H,(20202H)=34H,(20203H)=12H,执行指令:CALL DWORD PTR [BX]。
3.段间直接调用
格式:CALL FAR PTR OPR 功能:操作数为子程序名,指令中直接给出要调用的子程序的
入口段地址和偏移地址。
指令执行时, (SP)←(SP)+4,子程序的入口地址(包括基地址和偏 移地址)被赋于CS和IP。
【例4-8】 已知:主程序所在代码段的段地址为1000H,(IP)= 0100H,子程序SUM的入口地址为2000H:0200H,执行指令: CALL FAR PTR SUM。
CLD
REP STOSB
;将目的串的偏移地址送入DI ;将0送入AL ;将串的长度送入CX ;将DF置为0,地址自动递增 ;重复执行串存储指令,将100个连续的内存单元 ;清0
处理器控制类指令
4.2.1 标志位操作指令
注:对其他标志位无影响。
4.2.2 外部同步指令
注:不影响标志位。
实训4-1 寻找字符串中指定字符
功能:将寄存器AL(字节操作)或AX(字操作)中的一个 字节或字存入DI所指向的目的串中。
注:此指令对标志位无影响。
4.1.2 重复前缀指令
使用重复前缀指令前,先要将字符串的长度装入CX寄存器, 每执行一次基本串操作指令后,CX的值自动减1,直到CX=0。
1.REP前缀
格式:REP 串操作指令 功能:重复执行串操作指令,直到CX中的值为0时结束操作。
;将B存入BX
CMP AX, BX
;比较AX和BX的大小
JG NEXT
;AX大于BX时程序转移至NEXT
MOV MAX, BX
;AX小于或等于BX时,将BX的内容
;送入MAX单元
JMP EXIT
;程序转移至EXIT
NEXT: MOV MAX, AX
; AX大于BX时,将AX的内容送入MAX
EXIT: …
5.段间间接转移
格式:JMP DWORD PTR OPR 功能:指令中的操作数是一个双字存储器单元,偏移地址和段
地址分别存放在连续两个字的存储单元中。
指令执行后,段地址(高16位)和偏移地址(低16位)分别被赋于当 前的CS和IP,程序转移到另一个代码段中相应位置去执行。
注:无条件转移指令对标志位无影响。
不为零)时重复执行串比较或串扫描指令;否则,结束 操作。
注:重复前缀指令不能单独使用,后面必须跟基本串操作指令。 重复前缀指令不影响标志位。
【例4-1】 将1000H:0200H地址开始的100个字节传送到 2000H:1000H开始的存储单元中。
程序段如下:
MOV AX,1000H MOV DS,AX MOV AX,2000H MOV ES,AX MOV SI,0200H MOV DI,1000H MOV CX,100
4.3.4 子程序调用
1.段内直接调用
格式:CALL NEAR PTR OPR 功能:操作数为子程序名,指令中直接给出要调用的子程序的
入口偏移地址。
指令执行时, (SP)←(SP)+2,CS的内容不变,子程序的入口偏移地 址(16位)被赋于IP。
【例4-6】 已知:(CS)=1000H,(IP)=0100H,子程序SUM的入口 地址为1000H:0200H,执行指令:CALL SUM。
2.段内间接调用
格式:CALL WORD PTR OPR 功能:操作数为16位寄存器或16位存储器单元,其内容为要调
用的子程序的入口偏移地址。
指令执行时, (SP)←(SP)+2,CS的内容不变,寄存器中的内容或 存储器中指定地址开始的连续两个单元的内容被赋于IP。
【例4-7】 已知:(CS)=1000H,(IP)=0100H,(DS)=2000H, (BX)=0200H,(20200H)=34H,(20201H)=12H,执行指令: CALL WORD PTR [BX]。
第4章 8086指令系统(下)
本章内容提要
4.1 字符串操作指令 4.2 处理器控制类指令 4.3 程序控制类指令
字符串操作指令
源串(源操作数)一般存放在当前数据段中,即寄存器DS中 的内容为其段地址,寄存器SI中的内容为其偏移地址,因此,源 串地址为DS:SI。
目的串(目的操作数)一般存放在附加数据段ES中,即寄存 器ES中的内容为其段地址,寄存器DI中的内容为其偏移地址, 因此,目的串地址为ES:DI。
4.3.5 返回指令
注:该指令对标志位无影响。
1.中断指令
4.3.6 中断指令
格式:INT n
功能:调用中断类型号为n(0~255)的中断服务程序。
执行中断时,首先将标志位寄存器的内容、INT指令的下一条指令 的段地址和偏移地址分别压入堆栈保存,将标志位IF和TF清0,然后根 据n的值计算出中断向量的存放地址,接着从该地址处取出中断向量分 别送入IP和CS。
2.REPE/REPZ前缀
格式:REPE/REPZ 串比较或串扫描指令 功能:CX≠0且ZF=1(要比较的两个字节或字相等或相减为
零)时重复执行串比较或串扫描指令;否则,结束操 作。
3.REPNE/REPNZ前缀
格式:REPNE/REPNZ 串比较或串扫描指令 功能:CX≠0且ZF=0(要比较的两个字节或字不相等或相减
;定义源字符串 ;NUM为字符串STR的长度
;将字符串的首地址送入DI ;设置方向标志,使DF=0 ;将字符串长度NUM送入CX ;将空格字符的ASCII码送入AL ;将ADDR的初始值设为0FFFFH ;若当前字符是空格,则重复执行串扫 ;描指令 ;若全部是空格,则程序转移至EXIT ;使DI指向第一个非空格字符 ;将第一个非空格字符的偏移地址存入
注:受影响的标志位有:OF、SF、ZF、AF、PF和CF。
3.串扫描指令
格式:SCASB(字节串扫描) 或 SCASW(字串扫描) 或 SCAS DST
功能:将寄存器AL(字节操作)或AX(字操作)中的内容 与DI所指向的目的串中的一个字节或字相减,不保存 结果,只是根据结果设置标志位。
注:受影响的标志位有:OF、SF、ZF、AF、PF和CF。
【例4-5】 将以BUFFER开始的100个内存单元都减去1,如果某 个单元减1后为0则不再执行此操作。
程序段如下:
MOV DI, 0 MOV CX, 100 LOP:INC DI DEC BUFFER[DI] LOOPNZ LOP
;将DI的初始值设为0 ;将字节数(循环次数)送入CX ;地址指针加1 ;将当前内存单元中的内容减1 ;结果不为0时执行循环
【例4-3】
… JMP SHORT NEXT L: MOV AL, 12H
… NEXT: MOV CX, 1234H
…
设标号L和NEXT之间的偏移量为08H。 执行JMP指令 后,IP的内容更新为 1008H。
2.段内直接近转移
格式:JMP NEAR PTR OPR 功能:操作数可以是目标地址的标号或指定一个16位的偏移
4.串装入指令
格式:LODSB(字节串装入) 或 LODSW(字串装入) 或 LODS SRC
功能:将SI所指向的源串中的一个字节或字送入寄存器AL (字节操作)或AX(字操作)中。
注:此指令对标志位无影响。
5.串存储指令
格式:STOSB(字节存储) 或 STOSW(字存储) 或 STOS DST
功能:将SI所指向的源串中的一个字节或字传送到DI所指向 的目的串中。
注:该指令对标志位无影响。
2.串比较指令
格式:CMPSB(字节串比较) 或 CMPSW(字串比较) 或 CMPS DST, SRC
功能:将SI所指向的源串中的一个源自节或字与DI所指向的目 的串中的一个字节或字相减,不保存结果,只是根据 结果设置标志位。
4.3.2 条件转移指令
注:所有的条件转移指令都是短转移,即转移的目标地址必须在当前代码段 内,偏移量的范围为﹣128~127字节。
条件转移指令对标志位无影响。
【例4-4】 比较两个带符号数A和B的大小,把大数存入MAX单 元。
实现这个过程的程序段如下:
MOV AX, A
;将A存入AX
MOV BX, B
量,转移范围为-32768~32767字节。
指令执行后, CS的内容不变,IP的值(即JMP指令的下一条指令) 与16位偏移量之和被赋于当前的IP。
3.段内间接转移
格式:JMP WORD PTR OPR 功能:指令中的操作数是16位寄存器或存储器单元,段内转移
的偏移地址存放在16位寄存器或存储器中连续两个字节 的存储单元中。
源程序
STR DB ‘ This is a string!$’ NUM EQU $-STR
LEA DI, STR CLD MOV CX, NUM MOV AL, 20H MOV ADDR, 0FFFFH REPZ SCASB
JZ EXIT DEC DI MOV ADDR, DI
EXIT: MOV AH, 4CH INT 21H
若要使用重复前缀指令时,字符串的长度必须存放在CX寄存 器中。
每次执行字符串操作后,SI和DI中的内容会自动修改,从而 指向下一个字节或字。SI和DI的修改方式取决于标志位DF的值, 增减量的大小取决于操作数类型。
4.1.1 基本串操作指令
1.串传送指令
格式:MOVSB(字节串传送) 或 MOVSW(字串传送) 或 MOVS DST, SRC
在文章的每一段开头,一般要缩进几个空格。现有一个以 空格开头的字符串,找出其中第一个非空格字符,并把其偏移 地址存入指定内存单元ADDR中。
首先,将字符串首地址送入DI,设置字符串操作方向,将 字符串长度送入CX,并为ADDR设置初值。重复执行传扫描指 令,直到找到第一个非空格字符,使DI指向第一个非空格字符, 并将其偏移地址存入ADDR。若未找到非空格字符,则程序结 束。
注:INT指令只影响标志位IF和TF。
2.溢出中断指令
格式:INTO 功能:程序运行过程中,如果运算结果产生溢出,即OF=1,
则调用溢出中断处理程序。
注:此指令相当于中断类型号为4的INT指令。
3.中断返回指令
格式:IRET 功能:退出中断服务程序,返回被中断的程序 。
指令执行时,将堆栈顶部保存的内容依次弹出,分别送入IP、 CS和标志位寄存器。 注:IRET指令将影响所有标志位的值。
指令执行后,CS的内容不变,寄存器中的内容或存储器中指定地址开 始的连续两个字节单元的内容被赋于当前的IP。
4.段间直接转移
格式:JMP FAR PTR OPR 功能:操作数可以是目标地址的标号,指令操作码后的连续两
个字给出转移后的偏移地址(低16位)和段地址(高16 位)。
指令执行后,段地址和偏移地址分别被赋于当前的CS和IP,程序转 移到另一个代码段中相应位置去执行。
;ADDR ;系统功能调用,结束程序返回DOS
程序控制类指令
4.3.1 无条件转移指令
1.段内直接短转移
格式:JMP SHORT OPR 功能:操作数可以是目标地址的标号或指定一个8位的偏移
量,转移范围为-128~127字节。
指令执行后,CS的内容不变,IP的值(即JMP指令的下一条指令) 与8位偏移量之和被赋于当前的IP。
REP MOVSB
;设置源串段地址
;设置目的串段地址 ;设置源串偏移地址 ;设置目的串偏移地址 ;将串的长度送入CX ;将DF置为0,地址自动递增 ;重复执行串传送指令,每次传送一个字节
【例4-2】 对附加段中从BUFF开始的100个连续的内存单元进行 清0操作。
程序段如下:
LEA DI,BUFF MOV AL,00H MOV CX,100
4.3.3 循环控制指令
循环控制指令使用CX寄存器作为循环计数器,因此,在使用 循环指令前,必须先将循环次数存入CX中。 每执行一次循环控制指令,CX中的值自动减1,然后对循环 条件进行判断。
注:循环控制指令是短转移,即转移的目标地址必须在当前代码段内,偏移 量的范围为﹣128~127字节。
循环指令对标志位无影响。
4.段间间接调用
格式:CALL DWORD PTR OPR 功能:操作数为一个32位存储器单元,其内容为要调用的子程
序的入口偏移地址(低16位)和段地址(高16位)。
指令执行时,即(SP)←(SP)+4,存储器中指定地址开始的连续四个 单元的内容分别被赋于IP和CS。
【例4-9】 已知:主程序所在代码段的段地址为1000H,(IP)= 0100H,(DS)=2000H,(BX)=0200H,(20200H)=78H,(20201H) =56H,(20202H)=34H,(20203H)=12H,执行指令:CALL DWORD PTR [BX]。
3.段间直接调用
格式:CALL FAR PTR OPR 功能:操作数为子程序名,指令中直接给出要调用的子程序的
入口段地址和偏移地址。
指令执行时, (SP)←(SP)+4,子程序的入口地址(包括基地址和偏 移地址)被赋于CS和IP。
【例4-8】 已知:主程序所在代码段的段地址为1000H,(IP)= 0100H,子程序SUM的入口地址为2000H:0200H,执行指令: CALL FAR PTR SUM。
CLD
REP STOSB
;将目的串的偏移地址送入DI ;将0送入AL ;将串的长度送入CX ;将DF置为0,地址自动递增 ;重复执行串存储指令,将100个连续的内存单元 ;清0
处理器控制类指令
4.2.1 标志位操作指令
注:对其他标志位无影响。
4.2.2 外部同步指令
注:不影响标志位。
实训4-1 寻找字符串中指定字符
功能:将寄存器AL(字节操作)或AX(字操作)中的一个 字节或字存入DI所指向的目的串中。
注:此指令对标志位无影响。
4.1.2 重复前缀指令
使用重复前缀指令前,先要将字符串的长度装入CX寄存器, 每执行一次基本串操作指令后,CX的值自动减1,直到CX=0。
1.REP前缀
格式:REP 串操作指令 功能:重复执行串操作指令,直到CX中的值为0时结束操作。
;将B存入BX
CMP AX, BX
;比较AX和BX的大小
JG NEXT
;AX大于BX时程序转移至NEXT
MOV MAX, BX
;AX小于或等于BX时,将BX的内容
;送入MAX单元
JMP EXIT
;程序转移至EXIT
NEXT: MOV MAX, AX
; AX大于BX时,将AX的内容送入MAX
EXIT: …
5.段间间接转移
格式:JMP DWORD PTR OPR 功能:指令中的操作数是一个双字存储器单元,偏移地址和段
地址分别存放在连续两个字的存储单元中。
指令执行后,段地址(高16位)和偏移地址(低16位)分别被赋于当 前的CS和IP,程序转移到另一个代码段中相应位置去执行。
注:无条件转移指令对标志位无影响。
不为零)时重复执行串比较或串扫描指令;否则,结束 操作。
注:重复前缀指令不能单独使用,后面必须跟基本串操作指令。 重复前缀指令不影响标志位。
【例4-1】 将1000H:0200H地址开始的100个字节传送到 2000H:1000H开始的存储单元中。
程序段如下:
MOV AX,1000H MOV DS,AX MOV AX,2000H MOV ES,AX MOV SI,0200H MOV DI,1000H MOV CX,100
4.3.4 子程序调用
1.段内直接调用
格式:CALL NEAR PTR OPR 功能:操作数为子程序名,指令中直接给出要调用的子程序的
入口偏移地址。
指令执行时, (SP)←(SP)+2,CS的内容不变,子程序的入口偏移地 址(16位)被赋于IP。
【例4-6】 已知:(CS)=1000H,(IP)=0100H,子程序SUM的入口 地址为1000H:0200H,执行指令:CALL SUM。
2.段内间接调用
格式:CALL WORD PTR OPR 功能:操作数为16位寄存器或16位存储器单元,其内容为要调
用的子程序的入口偏移地址。
指令执行时, (SP)←(SP)+2,CS的内容不变,寄存器中的内容或 存储器中指定地址开始的连续两个单元的内容被赋于IP。
【例4-7】 已知:(CS)=1000H,(IP)=0100H,(DS)=2000H, (BX)=0200H,(20200H)=34H,(20201H)=12H,执行指令: CALL WORD PTR [BX]。
第4章 8086指令系统(下)
本章内容提要
4.1 字符串操作指令 4.2 处理器控制类指令 4.3 程序控制类指令
字符串操作指令
源串(源操作数)一般存放在当前数据段中,即寄存器DS中 的内容为其段地址,寄存器SI中的内容为其偏移地址,因此,源 串地址为DS:SI。
目的串(目的操作数)一般存放在附加数据段ES中,即寄存 器ES中的内容为其段地址,寄存器DI中的内容为其偏移地址, 因此,目的串地址为ES:DI。
4.3.5 返回指令
注:该指令对标志位无影响。
1.中断指令
4.3.6 中断指令
格式:INT n
功能:调用中断类型号为n(0~255)的中断服务程序。
执行中断时,首先将标志位寄存器的内容、INT指令的下一条指令 的段地址和偏移地址分别压入堆栈保存,将标志位IF和TF清0,然后根 据n的值计算出中断向量的存放地址,接着从该地址处取出中断向量分 别送入IP和CS。
2.REPE/REPZ前缀
格式:REPE/REPZ 串比较或串扫描指令 功能:CX≠0且ZF=1(要比较的两个字节或字相等或相减为
零)时重复执行串比较或串扫描指令;否则,结束操 作。
3.REPNE/REPNZ前缀
格式:REPNE/REPNZ 串比较或串扫描指令 功能:CX≠0且ZF=0(要比较的两个字节或字不相等或相减
;定义源字符串 ;NUM为字符串STR的长度
;将字符串的首地址送入DI ;设置方向标志,使DF=0 ;将字符串长度NUM送入CX ;将空格字符的ASCII码送入AL ;将ADDR的初始值设为0FFFFH ;若当前字符是空格,则重复执行串扫 ;描指令 ;若全部是空格,则程序转移至EXIT ;使DI指向第一个非空格字符 ;将第一个非空格字符的偏移地址存入
注:受影响的标志位有:OF、SF、ZF、AF、PF和CF。
3.串扫描指令
格式:SCASB(字节串扫描) 或 SCASW(字串扫描) 或 SCAS DST
功能:将寄存器AL(字节操作)或AX(字操作)中的内容 与DI所指向的目的串中的一个字节或字相减,不保存 结果,只是根据结果设置标志位。
注:受影响的标志位有:OF、SF、ZF、AF、PF和CF。
【例4-5】 将以BUFFER开始的100个内存单元都减去1,如果某 个单元减1后为0则不再执行此操作。
程序段如下:
MOV DI, 0 MOV CX, 100 LOP:INC DI DEC BUFFER[DI] LOOPNZ LOP
;将DI的初始值设为0 ;将字节数(循环次数)送入CX ;地址指针加1 ;将当前内存单元中的内容减1 ;结果不为0时执行循环
【例4-3】
… JMP SHORT NEXT L: MOV AL, 12H
… NEXT: MOV CX, 1234H
…
设标号L和NEXT之间的偏移量为08H。 执行JMP指令 后,IP的内容更新为 1008H。
2.段内直接近转移
格式:JMP NEAR PTR OPR 功能:操作数可以是目标地址的标号或指定一个16位的偏移
4.串装入指令
格式:LODSB(字节串装入) 或 LODSW(字串装入) 或 LODS SRC
功能:将SI所指向的源串中的一个字节或字送入寄存器AL (字节操作)或AX(字操作)中。
注:此指令对标志位无影响。
5.串存储指令
格式:STOSB(字节存储) 或 STOSW(字存储) 或 STOS DST
功能:将SI所指向的源串中的一个字节或字传送到DI所指向 的目的串中。
注:该指令对标志位无影响。
2.串比较指令
格式:CMPSB(字节串比较) 或 CMPSW(字串比较) 或 CMPS DST, SRC
功能:将SI所指向的源串中的一个源自节或字与DI所指向的目 的串中的一个字节或字相减,不保存结果,只是根据 结果设置标志位。
4.3.2 条件转移指令
注:所有的条件转移指令都是短转移,即转移的目标地址必须在当前代码段 内,偏移量的范围为﹣128~127字节。
条件转移指令对标志位无影响。
【例4-4】 比较两个带符号数A和B的大小,把大数存入MAX单 元。
实现这个过程的程序段如下:
MOV AX, A
;将A存入AX
MOV BX, B
量,转移范围为-32768~32767字节。
指令执行后, CS的内容不变,IP的值(即JMP指令的下一条指令) 与16位偏移量之和被赋于当前的IP。
3.段内间接转移
格式:JMP WORD PTR OPR 功能:指令中的操作数是16位寄存器或存储器单元,段内转移
的偏移地址存放在16位寄存器或存储器中连续两个字节 的存储单元中。
源程序
STR DB ‘ This is a string!$’ NUM EQU $-STR
LEA DI, STR CLD MOV CX, NUM MOV AL, 20H MOV ADDR, 0FFFFH REPZ SCASB
JZ EXIT DEC DI MOV ADDR, DI
EXIT: MOV AH, 4CH INT 21H
若要使用重复前缀指令时,字符串的长度必须存放在CX寄存 器中。
每次执行字符串操作后,SI和DI中的内容会自动修改,从而 指向下一个字节或字。SI和DI的修改方式取决于标志位DF的值, 增减量的大小取决于操作数类型。
4.1.1 基本串操作指令
1.串传送指令
格式:MOVSB(字节串传送) 或 MOVSW(字串传送) 或 MOVS DST, SRC
在文章的每一段开头,一般要缩进几个空格。现有一个以 空格开头的字符串,找出其中第一个非空格字符,并把其偏移 地址存入指定内存单元ADDR中。
首先,将字符串首地址送入DI,设置字符串操作方向,将 字符串长度送入CX,并为ADDR设置初值。重复执行传扫描指 令,直到找到第一个非空格字符,使DI指向第一个非空格字符, 并将其偏移地址存入ADDR。若未找到非空格字符,则程序结 束。
注:INT指令只影响标志位IF和TF。
2.溢出中断指令
格式:INTO 功能:程序运行过程中,如果运算结果产生溢出,即OF=1,
则调用溢出中断处理程序。
注:此指令相当于中断类型号为4的INT指令。
3.中断返回指令
格式:IRET 功能:退出中断服务程序,返回被中断的程序 。
指令执行时,将堆栈顶部保存的内容依次弹出,分别送入IP、 CS和标志位寄存器。 注:IRET指令将影响所有标志位的值。
指令执行后,CS的内容不变,寄存器中的内容或存储器中指定地址开 始的连续两个字节单元的内容被赋于当前的IP。
4.段间直接转移
格式:JMP FAR PTR OPR 功能:操作数可以是目标地址的标号,指令操作码后的连续两
个字给出转移后的偏移地址(低16位)和段地址(高16 位)。
指令执行后,段地址和偏移地址分别被赋于当前的CS和IP,程序转 移到另一个代码段中相应位置去执行。
;ADDR ;系统功能调用,结束程序返回DOS
程序控制类指令
4.3.1 无条件转移指令
1.段内直接短转移
格式:JMP SHORT OPR 功能:操作数可以是目标地址的标号或指定一个8位的偏移
量,转移范围为-128~127字节。
指令执行后,CS的内容不变,IP的值(即JMP指令的下一条指令) 与8位偏移量之和被赋于当前的IP。