第7章常用数据结构 7.1数组与内存块 7.2字符串处理 7.3结构 7.4链表 7.5函数指针 7.6程序执行环境
第7章 常用数据结构 7.1 数组与内存块 7.2 字符串处理 7.3 结构 7.4 链表 7.5 函数指针 7.6 程序执行环境
7.1数组与内存块 数组是内存中的一块连续数据单元 ■数组中的元素大小固定,类型相同 组连续的数据单元称为内存块 ■数组,字符串和结构都可以看成是一个 内存块
7.1 数组与内存块 ◼ 数组是内存中的一块连续数据单元 ◼ 数组中的元素大小固定,类型相同 ◼ 一组连续的数据单元称为内存块 ◼ 数组,字符串和结构都可以看成是一个 内存块
7.1.1块操作 块操作指令一共有5种 指令名称 功能 MOSB, MOWSW MOVSD,将一个内存操作数复制到另一个内存操作数 CMPSB. CMPSW CMPSD,比较两个内存操作数的大小 SCASB. SCASW SCASD 将内存操作数与AL,AX,EA比较 STOSB. STOSW STOSD 将AL,AX,EAX保存在内存操作数中 LODSE, LODSW LODSD,读入内存操作数放入AL,AX,EA中
7.1.1 块操作 块操作指令一共有5种
块操作指令的用法 1.操作数的大小 指令后面的B,W,D分别代表字节、字、双字 2.源操作数和目的操作数 源操作数是DS:[ESI]所指向的内存单元; 目标操作数是ES:[EDI所指向的内存单元 方向标志和地址指针的修改 块操作指令会自动地修改ESI和EDI
块操作指令的用法 1.操作数的大小 指令后面的B, W, D分别代表字节、字、双字 2.源操作数和目的操作数 源操作数是DS:[ESI]所指向的内存单元; 目标操作数是ES:[EDI]所指向的内存单元 3.方向标志和地址指针的修改 块操作指令会自动地修改ESI和EDI
操作数的大小决定增加或减小的单位 4.重复前缀 ■可以和块操作指令联合使用 有3种形式:REP,REPZ, REPNZ n放在块操作指令的前面
操作数的大小决定增加或减小的单位 4.重复前缀 ◼ 可以和块操作指令联合使用 ◼ 有3种形式:REP,REPZ,REPNZ ◼ 放在块操作指令的前面
5种块操作指令的功能 (1) MOVSB/W/D将ESI所指向的字节/字/双字复制到EDI 所指向的字节/字/双字。 (2) CMPSB/W/D将ESI和EDI所指向的字节/字/双字进行 比较。 (3) SCASB/W/D将EDI所指向的字节/字/双字和 AL/AX/EAX进行比较 (4) STOSB/W/D将ALAX/EAX保存到EDI所指向的字节/字 /双字中 (5) LODSB/W/D将ESI所指向的字节/字/双字读入到 AL/AX/EAX中
5种块操作指令的功能 (1)MOVSB/W/D将ESI所指向的字节/字/双字复制到EDI 所指向的字节/字/双字。 (2)CMPSB/W/D将ESI和EDI所指向的字节/字/双字进行 比较。 ( 3 ) SCASB/W/D 将 EDI 所 指 向 的 字 节 / 字 / 双 字 和 AL/AX/EAX进行比较。 (4)STOSB/W/D将AL/AX/EAX保存到EDI所指向的字节/字 /双字中。 (5)LODSB/W/D将ESI所指向的字节/字/双字读入到 AL/AX/EAX中
3种重复前缀的用法 (1)前缀为REP时,重复次数固定为ECX。 REP和MOVS,STO0S,LODS联合使用 (2)前缀为REPZ时,重复次数最大为ECX。 ■REPZ和OMPS,SCAS联合使用。 ■如果在比较或扫描时,ZF=0,不再重复。 (3)前缀为 RENZ时,重复次数最大为ECX ■ RENZ和CMPS,SCAS联合使用 ■如果在比较或扫描时,ZF=1,不再重复
3种重复前缀的用法 (1)前缀为REP时,重复次数固定为ECX。 REP和MOVS,STOS,LODS联合使用。 (2)前缀为REPZ时,重复次数最大为ECX。 ◼ REPZ和CMPS,SCAS联合使用。 ◼ 如果在比较或扫描时,ZF=0,不再重复。 (3)前缀为REPNZ时,重复次数最大为ECX。 ◼ REPNZ和CMPS,SCAS联合使用。 ◼ 如果在比较或扫描时,ZF=1,不再重复
7.1.2块传送指令 MOVSB/W/D将操作数从一个内存单元传 送到另一个内存单元,它和REP前缀同时 使用,将一个内存块(源数据块)复制 到另一个内存块(目标数据块)
7.1.2 块传送指令 MOVSB/W/D将操作数从一个内存单元传 送到另一个内存单元,它和REP前缀同时 使用,将一个内存块(源数据块)复制 到另一个内存块(目标数据块)
1.数组的复制 下面的程序将数组 Array1复制给 Array2 Array l dWord1,10,100,1000,10000 Array2 DWORD 5 DUP(O) LEA ESI, Array LEA EDI, Array2 CLD MOV ECX. 5 REP MOVSD 每次, MOVSD传送一个双字,ESI,EDI自动加4, 指向下一个双字,ECX自动减1
1.数组的复制 下面的程序将数组Array1复制给Array2 Array1 DWORD 1, 10, 100, 1000, 10000 Array2 DWORD 5 DUP (0) LEA ESI, Array1 LEA EDI, Array2 CLD MOV ECX, 5 REP MOVSD 每次,MOVSD传送一个双字,ESI,EDI自动加4, 指向下一个双字,ECX自动减1
2.从字符串中删除一个字符 一行字符存储在缓冲区 In Buffer中 In Buffer byte Hellox World! 0 把X删掉的指令代码为 LEA ESI. NbUffer+6 ESⅠ指向字符 LEA EDI. NbUffer+5 ED指向字符’x CLD 地址由低至高 mov ecx. 8 传送8次 REP MOVSB 以字节为单位传送
2.从字符串中删除一个字符 一行字符存储在缓冲区InBuffer中 InBuffer BYTE 'Hellox World!', 0 把X删掉的指令代码为 LEA ESI, InBuffer+6 ; ESI指向字符' ' LEA EDI, InBuffer+5 ; EDI指向字符'x' CLD ; 地址由低至高 MOV ECX, 8 ; 传送8次 REP MOVSB ; 以字节为单位传送