1 / 44

第 4 章

第 4 章. 第 4 章 4.4.4 串操作指令. 常见串操作 计算字符串的长度、查找某个特定字符、改换字符、判断字符串是否一致等 串操作类指令 MOVS 、 CMPS 、 SCAS 、 LODS 、 STOS 注意事项 操作数的源串在当前数据段 DS 中,若不在,可使用段前缀指令;目的串必须在附加段 ES 中,且不能使用段前缀指令. 第 4 章 4.4.4 串操作指令. 字符串指令中的操作数只用于指出指令的操作类型。目的操作数与源操作数的逻辑地址由 ES : DI 和 DS : SI 指出

yelena
Download Presentation

第 4 章

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第4章

  2. 第4章 4.4.4 串操作指令 • 常见串操作 • 计算字符串的长度、查找某个特定字符、改换字符、判断字符串是否一致等 • 串操作类指令 • MOVS、CMPS、SCAS、LODS、STOS • 注意事项 • 操作数的源串在当前数据段DS中,若不在,可使用段前缀指令;目的串必须在附加段ES中,且不能使用段前缀指令

  3. 第4章 4.4.4 串操作指令 • 字符串指令中的操作数只用于指出指令的操作类型。目的操作数与源操作数的逻辑地址由ES:DI和DS:SI指出 • 用CX存放要处理的字符串的元素个数。在执行带重复前缀的字符串指令时,每执行一次字符串操作指令,CX的内容自动减1 • 用DF标志置来规定字符串处理方向。DF=0,由低向高,DF=1,相反 • 每处理完一个元素,自动修改SI和DI的内容 • 字符串处理过程可被中断

  4. 第4章 重复前缀指令 • 重复前缀指令 • REP与MOVS、STOS指令联合使用时,他的意义是“字符串未处理完时重复” • REPE(相等时重复)和REPZ(等于0时重复)实际上是相同的。将他们与CMPS、SCAS指令联合使用,可对本条指令操作所设置的ZF进行测试,ZF=1且CX不等于0,重复,否则退出 • REPNE(不等于时重复)和REPNZ(不等于0时重复)意义相同。与CMPS、SCAS联合使用,ZF=0且CX不等于0,则重复,否则退出

  5. 字符串指令 • MOVS 目的串,源串(MOVSB/MOVSW) • 把一个字节或一个字从源串传送到目的串,并自动修改SI和DI,指向下一个元素 • 通常加REP,完成块的传送 • MOVSB和MOVSW是MOVS的替代符 传送字符串程序片断: MOV SI,2000H MOV DI,4000H MOV CX,200H CLD REP MOVSB 等价语句: MOVS PAP1,PAP2 MOVSW

  6. 字符串指令 • CMPS 源串,目的串(CMPSB/CMPSW) • 用源串减去目的串,根据操作结果影响标志,结果不回送 • 源串由SI指出,目的串由DI指出 • 源操作数写在左边,目标操作数写在右边,与其他指令不同 • CPMS的替代符—CMPSB、CMPSW,使用方法与MOVSB/MOVSW相同

  7. 字符串指令 • SCAS 目的串(SCASB/SCASW) • 功能是在字符串中查找一个与已知数值相同或不同的元素。它以AL或AX的内容与附加段ES中用DI寻址的目的串元素进行比较,利用结果影响标志位,来反映扫描结果 • 执行结果不改变源串、目的串的数据 • 与REPNE或REPNZ配合使用,CX不等于0且ZF=0,查找相同元素;CX不等于0且ZF=1,查找不同元素 • SCAS替代符—SCASB/SCASW

  8. 字符串指令 • LODS 源串(LODSB/LODSW) • 指令是把由SI寻址的源串元素装入到寄存器AL/AX中,并修改SI,指向下一元素 • 通常不加前缀 • 地址增减取决于方向标志DF,DF=0增量修改,DF=1减量修改 • 替代符—LODSB/LODSW • 举例:编制一程序段,要求将0700H单元开始的5个字节的内容逐一装入累加器中进行处理,处理完后,再送入0700H为首地址的内存区中

  9. 字符串指令 CLD MOV SI,0700H MOV CX,5 LOOP1:LODSB PUSH CX : POP CX DEC CX MOV [DI],AL JNZ LOOP1

  10. 字符串指令 • STOS 目的串(STOSB/STOSW) • 指令所完成的操作和LODS指令相反。他将累加器AL/AX中的内容存入附加段中由DI寻址的存储单元中,并自动修改地址指针 • 与REP结合,可使一串内存单元填满相同的数 • 替代符—STOSB/STOSW • 举例:若对某一数据缓冲区清零,并设(ES)=3000H,数据缓冲区首地址DI=0200H,缓冲区长度为100个字节,则可用以下的程序段:

  11. 字符串指令 CLD MOV AX,3000H MOV ES,AX MOV DI,0200H MOV CX,100 MOV AL,00 REP STOSB

  12. 第4章:4.4.5 控制转移类指令 • 控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的常用指令 • 重点掌握: • JMP/Jcc/LOOP/JCXZCALL/RET • INT n/IRET常用系统功能调用 • 控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变

  13. 第4章:目标地址的寻址方式 • 相对寻址方式 • 指令代码中提供目的地址相对于当前IP的位移量,转移到的目的地址(转移后的IP值)就是当前IP值加上位移量 • 直接寻址方式 • 指令代码中提供目的逻辑地址,转移后的CS和IP值直接来自指令操作码后的目的地址操作数 • 间接寻址方式 • 指令代码中指示寄存器或存储单元,目的地址从寄存器或存储单元中间接获得 用标号表达 用标号表达 用寄存器或存储器操作数表达

  14. 代码段 代码段 第4章:目标地址的寻址范围:段内寻址 • 段内转移——近转移(near) • 在当前代码段64KB范围内转移( ±32KB范围) • 不需要更改CS段地址,只要改变IP偏移地址 • 段内转移——短转移(short) • 转移范围可以用一个字节表达,在段内-128~+127范围的转移

  15. 第4章:目标地址的寻址范围:段间寻址 • 段间转移——远转移(far) • 从当前代码段跳转到另一个代码段,可以在1MB范围 • 需要更改CS段地址和IP偏移地址 • 目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址 代码段 代码段 • 实际编程时,汇编程序会根据目标地址的属性,自动处理成短转移、近转移或远转移 • 程序员可用操作符short、near ptr 或far ptr 强制成为需要的转移类型

  16. 第4章:4.4.5.1 无条件转移指令 • 只要执行无条件转移指令JMP,就使程序转到指定的目标地址,从目标地址处开始执行指令 • 操作数label是要转移到的目标地址(目的地址、转移地址) • JMP指令分成4种类型: ⑴ 段内转移、相对(直接)寻址,JMP disp8/disp16 ⑵ 段内转移、间接寻址,JMP MEM/REG ⑶ 段间转移、直接寻址,JMP ADDR ⑷ 段间转移、间接寻址,JMP MEM JMP label ;程序转向label标号指定的地址

  17. 第4章:无条件转移指令JMP(jump) JMP label;段内转移、相对寻址 ;IP←IP+位移量 JMP r16/m16 ;段内转移、间接寻址 ;IP←r16/m16 JMP far ptr label;段间转移、直接寻址 ;IP←偏移地址,CS←段地址 JMP far ptr mem;段间转移,间接寻址 ;IP←[mem],CS←[mem+2] 演示 演示 演示 演示 演示

  18. 第4章:4.4.5.2 条件转移指令 • 条件转移指令Jcc根据指定的条件确定程序是否发生转移。其通用格式为: Jcclabel;条件满足,发生转移 ;IP←IP+8位位移量; ;否则,顺序执行 • label是一个标号、一个8位位移量,表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移 • label只支持短转移的相对寻址方式

  19. 第4章:Jcc指令的分类 • Jcc指令不影响标志,但要利用标志(表2-4) • 根据利用的标志位不同,分成三种情况: ⑴ 判断单个标志位状态 ⑵ 比较无符号数高低 ⑶ 比较有符号数大小 • Jcc指令实际虽然只有16条,但却有30个助记符 • 采用多个助记符,目的是为了方便记忆和使用

  20. 第4章:1. 判断单个标志位状态 ⑴JZ/JE和JNZ/JNE 利用零标志ZF,判断结果是否为零(或相等) ⑵ JS和JNS 利用符号标志SF,判断结果是正是负 ⑶ JO和JNO 利用溢出标志OF,判断结果是否产生溢出 ⑷ JP/JPE和JNP/JPO 利用奇偶标志PF,判断结果中“1”的个数是偶是奇 ⑸ JC/JB/JNAE和JNC/JNB/JAE 利用进位标志CF,判断结果是否进位或借位

  21. 第4章:例题 • 题目:将AX中存放的无符号数除以2,如果是奇数则加1后除以2 • 问题:如何判断AX中的数据是奇数还是偶数? • 解答:判断AX最低位是“0”(偶数),还是“1”(奇数)。可以用位操作类指令 1:用逻辑与指令将除最低位外的其他位变成0,保留最低位不变。判断这个数据是0,AX就是偶数;否则,为奇数 2:将最低位用移位指令移至进位标志,判断进位标志是0,AX就是偶数;否则,为奇数 3:将最低位用移位指令移至最高位(符号位),判断符号标志是0,AX就是偶数;否则,为奇数

  22. 第4章:例题解答1 用JZ指令实现 test ax,01h ;测试AX的最低位D0(不用AND指令,以免改变AX) jzeven ;标志ZF=1,即D0=0:AX内是偶数,程序转移 add ax,1 ;标志ZF=0,即D0=1:AX内的奇数,加1 even: shr ax,1 ;AX←AX÷2 用右移一位的方法实现除以2。 本例中用RCR指令比SHR指令更好。

  23. 第4章:例题解答2 用JNC指令实现 mov bx,ax shr bx,1 ;将AX的最低位D0移进CF jnceven ;标志CF=0,即D0=0:AX内是偶数,程序转移 add ax,1 ;标志CF=1,即D0=1:AX内的奇数,加1 even: shr ax,1 ;AX←AX÷2 还可用SAR、ROR和RCR指令

  24. ADD BX,0 ;增加一条指令 第4章:例题解答3 用JNS指令实现 mov bx,ax ror bx,1 ;将AX的最低位D0移进最高位(符号位SF) jnseven ;标志SF=0,即D0=0:AX内是偶数,程序转移 add ax,1 ;标志SF=1,即D0=1:AX内的奇数,加1 even: shr ax,1 ;AX←AX÷2 错误!循环指令不影响SF等标志

  25. 第4章:例 判断是否为字母Y ;寄存器AL中是字母Y(含大小写),则令AH=0,否则令AH=-1 cmp al,’y’ ;比较AL与小写字母y je next;相等,转移 cmp al,’Y’ ;不相等, ;继续比较AL与大写字母Y je next;相等,转移 mov ah,-1 ;不相等,令AH=-1 jmp done;无条件转移指令 next: mov ah,0;相等的处理:令AH=0 done: ……

  26. 第4章:例 偶校验 ;对DL寄存器中8位数据进行偶校验 ;校验位存入CF标志 test dl,0ffh ;使CF=0,同时设置PF标志 jpe done ;DL中“1”的个数为偶数 ;正好CF=0,转向done stc ;DL中“1”的个数为奇数,设置CF=1 done: …… ;完成

  27. 第4章:2. 比较无符号数高低 • 无符号数的大小用高(Above)、低(Below)表示,需要利用CF确定高低、利用ZF标志确定相等(Equal) • 两数的高低分成4种关系,对应4条指令 JB(JNAE):目的操作数低于(不高于等于)源操作数 JNB(JAE):目的操作数不低于(高于等于)源操作数 JBE(JNA):目的操作数低于等于(不高于)源操作数 JNBE(JA):目的操作数不低于等于(高于)源操作数

  28. 第4章:3. 比较有符号数大小 • 判断有符号数的大(Greater)、小(Less),需要组合OF、SF标志、并利用ZF标志确定相等与否 • 两数的大小分成4种关系,分别对应4条指令 JL(JNGE):目的操作数小于(不大于等于)源操作数 JNL(JGE):目的操作数不小于(大于等于)源操作数 JLE(JNG):目的操作数小于等于(不大于)源操作数 JNLE(JG):目的操作数不小于等于(大于)源操作数

  29. 第4章:将AX和BX中较大的数值存放在WMAX内存单元第4章:将AX和BX中较大的数值存放在WMAX内存单元 cmp ax,bx ;比较AX和BX jae next ;若AX≥BX,转移 xchg ax,bx ;若AX<BX,交换 next: mov wmax,ax 如果AX和BX存放的是有符号数, 则条件转移指令应采用JGE指令

  30. 第4章:例 上题(另解) cmp ax,bx ;比较AX和BX jaenext mov wmax, bx ;若AX<BX,wmax←BX jmpdone next: mov wmax,ax ;若AX≥BX,wmax←AX done:……

  31. 第4章:例 上题(另解对比) cmp ax,bx ;比较AX和BX jbenext mov wmax, ax ;若AX>BX,wmax←AX jmpdone next: mov wmax,bx ;若AX≤BX,wmax←BX done:……

  32. 例4.12 • 设有10个数据存放在以2000H单元为首地址的数据缓冲区中,试编写找出其中最大数,并存入2100H单元的程序 MAXSTA: MOV BX,2000H MOV AL,[BX] MOV CX,9 LAB1: INC BX CMP AL,[BX] JAE LAB2 MOV AL,[BX] LAB2: DEC CX JNZ LAB1 MOV BX,2100H MOV [BX],AL

  33. dec cx jnz label 第4章: 循环控制指令 • 一段代码序列多次重复执行就是循环 • 8088设计有针对CX计数器的计数循环指令 LOOP label ;循环指令 ;首先CX←CX-1;然后判断;若CX≠0,转移 JCXZ label ;为0循环指令 :如果CX=0,则转移 • label操作数采用相对短寻址方式 • 还有LOOPZ/LOOPE和LOOPNZ/LOOPNE两条指令

  34. 例:将数据段的Sbuf指示的1KB数据送到附加段的Dbuf区例:将数据段的Sbuf指示的1KB数据送到附加段的Dbuf区 mov cx,400h ;设置循环次数:1K=1024=400H mov si,offset sbuf ;设置循环初值:SI指向数据段源缓冲区开始 mov di,offset dbuf ;DI指向附加段目的缓冲区开始(附加段) again: mov al,[si];循环体:实现数据传送 mov es:[di],al ;每次传送一个字节 inc si;SI和DI指向下一个单元 inc di loop again ;循环条件判定:循环次数减1,不为0转移(循环)

  35. 第4章:例(按字) mov cx,200h ;设置循环次数:1K÷2=200H mov si,offset sbuf ;设置循环初值:SI指向数据段源缓冲区开始 mov di,offset dbuf ;DI指向附加段目的缓冲区开始(附加段) again: mov ax,[si];循环体:实现数据传送 mov es:[di],ax;每次传送一个字 addsi,2;指向下一个(字)单元 adddi,2 loop again ;循环条件判定:循环次数减1,不为0转移(循环)

  36. 第4章: 4.子程序调用与返回指令 • 子程序是完成特定功能的一段程序 • 当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行 • 当运行完子程序功能后,采用RET返回指令回到主程序继续执行 演示 • 转移指令有去无回 • 子程序调用需要返回, • 其中利用堆栈保存返回地址

  37. 第4章: 4. 子程序调用指令CALL • CALL指令分成4种类型(类似JMP) CALL label;段内调用、直接寻址 CALL r16/m16;段内调用、间接寻址 CALL far ptr label;段间调用、直接寻址 CALL far ptr mem;段间调用、间接寻址 • CALL指令需要保存返回地址: • 段内调用——入栈偏移地址IP SP←SP-2,SS:[SP]←IP • 段间调用——入栈偏移地址IP和段地址CS SP←SP-2,SS:[SP]←CS SP←SP-2,SS:[SP]←IP

  38. 第4章: 子程序返回指令RET • 根据段内和段间、有无参数,分成4种类型 RET;无参数段内返回 RET i16;有参数段内返回 RETF;无参数段间返回 RETF i16;有参数段间返回 • 需要弹出CALL指令压入堆栈的返回地址 • 段内返回——出栈偏移地址IP IP←SS:[SP], SP←SP+2 • 段间返回——出栈偏移地址IP和段地址CS IP←SS:[SP],SP←SP+2 CS←SS:[SP],SP←SP+2

  39. 第4章:例 十六进制转换为ASCII码的子程序 ;子程序:将DL低4位的一位16进制数转换成ASCII码 htoasc proc and dl,0fh ;只取DL的低4位 or dl,30h ;DL高4位变成3 cmp dl,39h ;是0~9,还是0Ah~0Fh ? jbe htoend ;是0~9,转移 add dl,7 ;是0Ah~0Fh,加上7 htoend: ret;子程序返回 htoasc endp 转换原理 ;主程序:调用子程序 mov dl,28h call htoasc

  40. 第4章: 中断和中断返回指令 • 中断(Interrupt)是又一种改变程序执行顺序的方法 • 8088CPU支持256个中断,每个中断用一个编号(中断向量号)区别 • 中断指令有3条: INT i8 IRET INTO • 本节主要掌握类似子程序调用指令的中断调用指令INT i8

  41. 第4章:中断指令 INT i8 ;中断调用指令:产生i8号中断 ;主程序使用,其中i8表示中断向量号 IRET ;中断返回指令:实现中断返回 ;中断服务程序使用

  42. 第4章:4.4.6 处理器控制类指令 • 处理器控制类指令用来控制CPU的状态,使CPU暂停、等待或空操作等 NOP;空操作指令,等同于“xchg ax,ax”指令,占3个时钟 SEG:;段超越前缀指令:CS:,SS:,DS:,ES: HLT;暂停指令:CPU进入暂停状态 • 还有其他指令: LOCK(总线封锁) ESC(交权) WAIT(等待)

  43. 第4章:总结 • 本章展开了8088CPU16位指令系统的常用指令 • 希望大家就如下几个方面进行一下总结: • 操作数寻址方式和目的地址寻址方式 • 指令支持的操作数形式 • 常用指令的助记符和功能 • 指令对标志的影响 • 通过复习整理,形成指令系统的整体概念,进而掌握常用指令 指令执行

  44. 第4章:教学要求 • 掌握寻址方式 • 熟悉汇编语言的语句格式,掌握8088/8086基本指令: 数据传送:MOV/XCHG/XLAT、PUSH/POP、LEA 加减运算:ADD/SUB、ADC/SBB、CMP、INC/DEC 位操作:AND/OR/XOR/NOT/TEST、SHL/SHR/SAR、ROL/ROR/RCL/RCR 控制转移:JMP/Jcc/LOOP、CALL/RET、INT n

More Related