350 likes | 538 Views
微机原理与接口实验. PART1 :汇编语言程序设计. 实验三 串操作. 计算机教学实验中心. 目录. 实验目的 实验预习要求 实验环境 实验原理 实验内容 实验习题. 实验目的. 熟悉串操作指令的功能。 了解串操作指令的使用方法。. 实验预习要求. 复习 8086 指令系统中的串操作类指令。 按照题目要求在实验前编写好实验中的程序段。. 实验环境. 微型计算机一台 调试程序 TD.EXE (可选 DEBUG.EXE ). TD 的使用步骤( 1 ). 进入 TurboDebugger ,在 CPU 窗口下输入程序段 :.
E N D
微机原理与接口实验 PART1:汇编语言程序设计 实验三 串操作 计算机教学实验中心
目录 • 实验目的 • 实验预习要求 • 实验环境 • 实验原理 • 实验内容 • 实验习题
实验目的 • 熟悉串操作指令的功能。 • 了解串操作指令的使用方法。
实验预习要求 • 复习8086指令系统中的串操作类指令。 • 按照题目要求在实验前编写好实验中的程序段。
实验环境 • 微型计算机一台 • 调试程序 TD.EXE(可选DEBUG.EXE)
TD的使用步骤(1) • 进入TurboDebugger,在CPU窗口下输入程序段:
TD的使用步骤(2) • 把各标志位的初值均设置为0;
TD的使用步骤(3) • 把IP指针指向程序段开始处;
TD的使用步骤(4) • 单步运行程序,观察指令执行后标志位变化情况;
TD的使用步骤(5) • 分析指令执行后的结果及其对标志位的影响。
串操作指令简介 • 串:顺序放在内存中的一组相同类型的数据。 • 串操作:对串中的元素进行相同的操作。 • 串操作的寻址方式: 源操作数指针———DS:SI(DS可超越) 目的操作数指针——ES:DI • 每次串操作后: • 自动修改SI和DI——字节±1,字±2。DF标志决定±。(注意:退出串操作后,指针指向最后操作的元素的下一个元素) • 可完成两个存储单元之间的传送和比较操作(仅串指令可以)
重复前缀 串操作指令前面可加上重复前缀REP。当使用REP前缀时,串操作指令将重复执行,重复执行次数由CX决定(带有REP前缀的串操作指令每执行一次,CX自动减1)。 重复前缀包括: • REP CX≠0 时重复执行 • REPE/REPZ CX≠0∧ZF=1时重复执行 • REPNE/REPNZ CX≠0∧ZF=0时重复执行
串指令使用的一般方法 MOV SI, 源串首地址 (或LEA SI, 源串变量名) 设置源串地址 MOV DI, 目的串首地址 (或LEA DI, 目的串变量名) 设置目标串地址 MOV CX, 串长度 设置串长度 CLD(或STD) 设置操作方向DF 串指令 串指令
实验内容1 • 输入以下程序段并运行之,回答后面的问题。 CLD MOV DI,1000H MOV AX,55AAH MOV CX,10H REP STOSW 上述程序段执行后: (1) 从DS:1000H开始的16个字单元的内容是什么? (2) (DI)= ?(CX)= ? 并解释其原因。 实验过程演示
串存储指令STOS使用提示 STOS指令的形式和操作为: STOSB: ((ES):(DI))←(AL) DI±1 STOSW: ((ES):(DI+1)(DI))←(AX) DI±2 指令使用要点: • 本指令用于把一块存储区域填充成某一初始值(即对存储区进行初始化)。 • 存储区域的首地址要预先设置到ES:DI中。 • 要存储到串中的数据要预先存到AL(AX)中。
串存储指令STOS使用举例1 • 把从A000H开始的2KB内存单元清零。 MOV DI,0A000H MOV AX,0 MOV CX,1024 CLD REP STOSW DI AX CX 存储区 0 1024 … 0 1022 1023 … A000H 0 0 A002H 0 0 …… A7FEH 0 0 A800H
串存储指令STOS使用举例2 • 把1000H开始的100个存储单元填入 ASCII码2AH(*)。 MOV DI, 1000H ; 首地址 MOV AL, 2AH ;‘*’ MOV CX, 100 ; 重复执行100次 CLD ; 增量修改DI REPSTOSB 存储区 CX AX DI 98 99 100 … 0 2AH … 2AH 1000H 1001H 2AH … 2AH 1063H 1064H
实验内容2 • 在上题的基础上,再输入以下程序段并运行之,回答后面的问题。 MOV SI,1000H MOV DI,2000H MOV CX,20H REP MOVSB 程序段执行后: (1) 从DS:2000H开始的16个字单元的内容是什么? (2) (SI)= ?(DI)= ?(CX)= ? 并分析之。 实验过程演示
串传送指令MOVS使用提示 MOVS指令的形式和操作为: MOVSB: ((ES):(DI))←((DS):(SI)) SI±1,DI±1 MOVSW: ((ES):(DI+1)(DI))←((DS):(SI+1)(SI)) SI±2,DI±2 指令也可写成:MOVS dest,src 指令使用要点: • src用DS:SI寻址,dest用ES:DI寻址 • 传送是字节还是字,由操作数的类型决定
串传送指令MOVS使用举例1 • 用串传送指令实现200个字节的数据传送: LEA SI,MEM1 LEA DI,MEM2 MOV CX,200 CLD REP MOVSB 存储区 CX SI … 199 200 198 … MEM1 30H MEM1+1 31H … DI 30H MEM2 MEM2+1 31H …
串传送指令MOVS使用举例2 显示对应FLASH动画
实验内容3 • 在以上两题的基础上,再输入以下三个程序段并依次运行之。 程序段1: MOV SI,1000H MOV DI,2000H MOV CX,10H REPZ CMPSW 程序段1执行后: (1) ZF=? 根据ZF的状态,你认为两个串是否比较完了? (2)(SI)= ?(DI)= ?(CX)= ? 并分析之。 实验过程演示
实验内容3(续) 程序段2: MOV [2008H],4455H MOV SI,1000H MOV DI,2000H MOV CX,10H REPZ CMPSW 程序段2执行后: (1) ZF=? 根据ZF的状态,你认为两个串是否比较完了? (2)(SI)= ?(DI)= ?(CX)= ? 并分析之。 实验过程演示
实验内容3(续) 程序段3: MOV AX,4455H MOV DI,2000H MOV CX,10H REPNZ SCASW 程序段3执行后: (1) ZF=? 根据ZF的状态,你认为在串中是否找到了数据4455H? (2)(SI)= ?(DI)= ?(CX)= ? 并分析之。 实验过程演示
串比较指令CMPS使用提示 CMPS指令的形式和操作为: CMPSB: ((DS):(SI))-((ES):(DI)) SI±1, DI±1 CMPSW: ((DS):(SI+1)(SI))-((ES):(DI+1)(DI)) SI±2, DI±2 指令也可写成:CMPS dest, src 指令的使用要点: • 比较的结果只反映在标志位上,串本身无变化。 • 本指令可用来检查两个串是否相等。
串比较指令CMPS使用举例 显示对应FLASH动画
串扫描SCAS使用提示 SCAS指令的形式和操作为: 对字节:(AL)-((ES):(DI)) DI±1 对字: (AX)-((ES):(DI+1)(DI)) DI±2 指令的使用要点: • 搜索指令执行的仍是比较(减法)操作,结果只影响标志位。 • 要搜索的关键字放在AL(字节)或AX(字)中。 • 本指令用于在串中查找指定的信息。
在SCAS指令前使用重复前缀 可对串进行连续扫描比较: • 若前缀为REPZ,则表示比较结果相等且(ZF=1)且串未结束(CX≠0),则继续比较。 • 若前缀为REPNZ,则表示比较结果不相等(ZF=0)且串未结束(CX≠0)就继续比较。
串扫描SCAS使用举例 • 在ES段的偏移1000H开始处存有10个ASCII码。搜索’E’,若找到则记下搜索次数及存放地址,并在屏幕上显示’Y’;若未找到则显示’N’。 提示:在屏幕上显示一个字符的指令段如下: MOV DL,<字符> MOV AH,2 INT 21H
存储区 CX DI AL 6H 9H AH 7H 5H 8H ‘E’ … ≠ MOV DI, 1000H ;(DI)←串偏移地址 MOV CX, 0AH ;(CX)←串长度 MOV AL, ’E’ ;搜索关键字=’E’ CLD ;从低地址到高地址进行搜索 REPNZ SCASB ;若未找到, 继续搜索 JZ FD ;找到, 转至FD MOV DL, ’N’ ;串中无’E’,(DL)←’N’ JMP DE ;转至DE FD:DEC DI ;指针回退 MOV ADDR, DI ;ADDR←’E’的地址 SUB DI, 1000H MOV NUM, DI ;NUM←搜索次数 MOV DL, ’Y’ ;(DL)←’Y’ DE:MOV AH, 2 INT 21H ;显示字符 1000H ‘A’ ≠ ‘B’ 1001H ≠ ‘C’ 1002H ≠ NUM ‘D’ 1003H √ ‘E’ 4 1004H … 1005H ADDR DL ‘Y’ 1004H
实验内容4 • 从DS:1000H开始存放有一个字符串”This is a string”,要求把这个字符串从后往前传送到DS:2000H开始的内存区域中(即传送结束后,从DS:2000H开始的内存单元的内容为”gnirts a si sihT”),试编写程序段并上机验证之。 实验过程演示
串载入LODS使用提示 LODS指令的操作为: 对字节:(AL)-((DS):(SI)) SI±1 对字: (AX)-((DS):(SI+1)(DI)) SI±2 指令的使用要点: • 串装入指令通常不加重复前缀。 • LODSB等价于: ①MOV AL,[SI] ②INC SI • LODSW等价于: ①MOV AL,[SI] ②INC SI③INC SI
串载入LODS使用举例 STRING1 38H ‘8’ 被加数 • 将STRING1和STRING2表示的字符转换成相应数字相加后的结果,再转换成ASCII码显示。 35H ‘5’ 36H ‘6’ 32H ‘2’ ... 39H ‘9’ STRING2 2658 31H 加数 ‘1’ +3619 36H ‘6’ 33H ‘3’ 6277 ... 07H SUM 07H 结果 02H 06H
LEA SI,SUM+3 ;(SI)←SUM+3 MOV CX,4 ;(CX)←和长度 STD ;置DF=1,减量修改SI MOV AH,02 ;(AH)←功能号 LP: LODSB ;取BCD码至AL,且(SI)←(SI)-1 ADD AL,30H ;转换为ASCII码 MOV DL,AL ;(DL)←字符 INT 21H ;显示字符 DEC CX JNZ LP …… CX AH 1 2 3 0 4 2 SUM 07H AL DL SUM+1 07H +30H 输出 37H 32H 36H 37H 06H 02H 07H 07H SUM+2 02H SUM+3 06H SI
实验报告要求 • 整理出完整的实验程序段和运行结果,对结果进行分析。 • 简要说明执行串操作指令之前应初始化哪些寄存器和标志位。 • 总结串操作指令的用途及使用方法。