串操作指令

合集下载

d37

d37
用途:常用于字符串比较,当执行REPE COMS 指令后,若CX=0,说明两个字符串相同,若 CX≠0,则表示两个字符串不相同。
3,不相等/不为零重复前缀指令 REPNE/ REPNZ 格式:REPNE /REPNZ OPRD;
OPRD≡{CMPS,SCAS} 功能:重复OPRD操作,直至CX=0或者ZF=1(相 等)为止。即:CX-1,如果CX0且ZF=0则转移 到OPRD(继续执行),否则(CX=0或ZF=1)则 结束重复。
NEXT: LOOP LOOP1; RET;
SCASB(DF=0)等效:CMP AL,ES:[DI]; INC DI;
4,取串指令LODS 格式1:LODSB;字节取串指令 操作:AL ←[DS:SI];取DS段的1字节数据送AL
SI←SI±1;修改源串地址ቤተ መጻሕፍቲ ባይዱ针
格式2:LODSW;字取串指令 操作:AX ←[DS:SI];取DS段的1字数据送AX
用途:常用于字符串查找,当执行REPNE SCAS 指令后,若CX=0,说明字符未找到,若CX≠0, 则表示在字符串中找到与AL中相同的字符。
思考题:若CX=100,SI=DI=0000H,则执行REPNE SCASB 指令后,CX=95,SI=?,DI=?
例如,用REPE指令实现例3
REPNE1:MOV SI,OFFSET BUFF1; MOV DI,OFFSET BUFF2; MOV CX,LENGTH BUFF1; CLD; REPE CMPSB; JCXZ NEXT; MOV AL,0FFH; JMP DONE;
DI←DI±2;修改目的串地址指针
功能:搜索数据块中的某种数据或字符,便于 统计、修改或删除。
例4,统计BUFF中的字母‘E’的个数。

微机原理 第5章5.2.4串操作类指令

微机原理 第5章5.2.4串操作类指令

第5章
2、REPZ重复前缀指令
REPZ
;每执行一次串指令,CX减1 每执行一次串指令,CX减 并判断ZF是否为0 ZF是否为 ;并判断ZF是否为0, 只要CX CX= ZF= 重复执行结束 ;只要CX=0或ZF=0,重复执行结束
【例5.42】比较S1、S2两个数据串是否相同,不同则 】 比较 、 两个数据串是否相同, 两个数据串是否相同 例5.42:比较字符串 : 跳到NOMATCH执行。 执行。 跳到 执行 S1 DB 0,1,1,0,0 S2 DB 0,1,1,1,0 …… CLD LEA SI,S1 ;源串偏移地址赋值给 源串偏移地址赋值给SI 源串偏移地址赋值给 LEA DI,ES:S2 ;目的串偏移地址赋值给 目的串偏移地址赋值给SI 目的串偏移地址赋值给 MOV CX,5 ;源串和目的串的数据个数 源串和目的串的数据个数 AGAIN: CMPSB ;源串与目的串相减,标志位 源串与目的串相减, 源串与目的串相减 JNE NOMATCH ;有任一不同,跳到NOMATCH 有任一不同,跳到 有任一不同 DEC CX ;数据串没比较完,继续比较 数据串没比较完, JNZ AGAIN 数据串没比较完 NOMATCH:
第5章
四、串比较CMPS
将主存中的源操作数减去目的操作数, 将主存中的源操作数减去目的操作数,以便设 置标志(影响AF,ZF,PF,SF,OF,CF) , 进而比 置标志 ( 影响 ) 较两操作数之间的关系 CMPSB ;字节串比较:DS:[SI]-ES:[DI] 字节串比较:DS:[SI]- SI←SI± DI←DI± ;SI←SI±1,DI←DI±1 CMPSW ;字串比较:DS:[SI]-ES:[DI] 字串比较:DS:[SI]- SI←SI± DI←DI± ;SI←SI±2,DI←DI±2

串操作指令

串操作指令

运用MOVSB指令
DATA SEGMENT NUM1 DB 50 DUP(0A0H) NUM2 DB 50 DUP(0) COUNT EQU LENGTH NUM2 ENDS
DATA CODE
SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM1 MOV DI,OFFSET NUM2 MOV CX,COUNT NEXT: MOVSB LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START
例2:同学课后应用以上指令编辑传送100字的程序
DATA CODE
SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM1 MOV DI,OFFSET NUM2 MOV CX,COUNT NEXT: MOVS BYTE PTR[DI],BYTE PTR[SI] LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START
START: MOV AX,DATA NEXT: MOV AL,[DI] MOV DS,AX MOV [SI],AL MOV DI,OFFSET NUM1 INC SI MOV SI,OFFSET NUM2 INC DI MOV CX,50 LOOP NEXT
运用MOVS指令
DATA SEGMENT NUM1 DB 50 DUP(0A0H) NUM2 DB 50 DUP(0) COUNT EQU LENGTH NUM2 ENDS
基 本 串 操 作

串操作指令.

串操作指令.

8086/8088的指令系统
串处理指令
REP MOVS:将数据段中的整串数据传送到附加段中。
DS→
源串(数据段)→ 目的串(附加段) 执行 REP MOVS 之前,应先做好: 1) 源串首地址(末地址)→ SI 2) 目的串首地址(末地址)→ DI 3) 串长度 → CX
DS:SI→
~ ES→ ~
8086/8088的指令系统
串处理指令
(6) 串输出指令OUTS
功能:将由源串中的字、字节传送到在DX寄存器指定的 I/O端口中,并根据DF和数据类型来改变源变址寄存器的 方向内容。 指令格式: OUTSB ;字节串输出: ((DX))←DS:[SI] ;SI←SI±1 OUTSW ;字串串输出: ((DX))←DS:[SI] ;SI←SI±2
ES:DI→
~ ~
4) 建立方向标志
( CLD 使 DF=0,STD 使 DF=1 )
8086/8088的指令系统
串处理指令
DS→
【例】 MOV SI,0050H MOV DI,0100H MOV CX,5 CLD REP MOVSB
20000H ‘A ’ ‘B ’ ‘C ’ ‘D ’ ‘E ’ ~ ~
8086/8088的指令系统
串处理指令
(3) 串比较指令 CMPS (p69)
CMPS SRC, DST DS:SI→ 语句格式:CMPSB——字节串比较 CMPSW——字串比较 功 能:将SI所指的源串中的一个 字节(或字)存储单元中的数据与 DI ~ 所指的目的串中的一个字节(或字) ~ 存储单元中的数据相减,并根据相减 ES→ 的结果设置标志,但结果并不保存。 ES:DI→ 即:①([SI])-([DI])。 ② 修改串指针,使之指向串中的 下一个元素。 当DF=0时,(SI)和(DI)增量 。当DF=1时,(SI)和(DI)减量。

串操作、控制转移指令

串操作、控制转移指令

•STOS指令不影响标志位。
机械工程学院
14
微机与接口技术
例, 将字符“#”装入以AREA为首地址的100个字节中 LEA MOV MOV CLD REP HLT DI, AREA CX, 100 AL, ‘ #’ STOSB
机械工程学院
15
微机与接口技术 例,设有一长度为100的数据块,首地址为BLOCK,把其中的正数放 到首地址为PLUS_DATA的缓冲区,负数放到首地址为MINUS_DATA 的缓冲区 START: LEA SI, BLOCK LEA DI, PLUS_DATA LEA BX, MINUS_DATA MOV CX, 100 CLD LODSB TEST AL, 80H JNZ MIUS ;ZF=0,负数 STOSB ;ZF=1,正数 JMP AGAIN XCHG BX, DI STOSB XCHG BX, DI DEC CX JNZ GOON HLT
机械工程学院
17
GOON:
OK: DONE:
微机与接口技术
串操作指令一览表
指令 重复前缀 REP REPE/ REPNE REPE/ REPNE 操作数 目标,源 源,目标 目标 源 目标 地址指针 寄存器 ES:DI,DS:SI DS:SI ,ES:DI 6个状态 标志 ES:DI DS:SI ES:DI 不影响 不影响 影响的 标志位 不影响
机械工程学院
6
微机与接口技术
例,将数据段中首地址为BUFFER1的200个字节传送到附 加段首地址为BUFFER2的内存区中。可以用以下两种形式 实现:
法1: LEA LEA MOV CLD MOVS DEC JNZ HLT SI, BUFFER1 DI, BUFFER2 CX, 200 BYTE PTR[DI],[SI] CX AGAIN 法2: LEA LEA MOV CLD REP HLT

第3.3.5章 串操作类指令

第3.3.5章 串操作类指令

80x86 x86的指令系统和寻址方式 第3章 80x86的指令系统和寻址方式
2.串比较指令CMPS 2.串比较指令CMPS 串比较指令 语句格式: 语句格式: ① CMPS SRC, SRC,DST CMPSB——字节串比较 ② CMPSB 字节串比较 CMPSW——字串比较 ③ CMPSW 字串比较
80x86 x86的指令系统和寻址方式 第3章 80x86的指令系统和寻址方式
当相等/为 时重复串操作 (2) REPE/REPZ 当相等 为0时重复串操作 )
格式: 格式:REPE/REPZ string primitive (用来检查两字符串中是否 其中string primitive可为 可为CMPS或SCAS指令 有不同的元素 ) 其中 可为 或 指令 执行的操作: 执行的操作: 1如(COUNT REG)=0或ZF=0(即某次比较的结果两个操 ) 或 ( 作数不等)时退出REP,否则(即某次比较的结果两个操作数相等) 作数不等)时退出 ,否则(即某次比较的结果两个操作数相等) 往下执行。 往下执行。 2 (Count Reg) ← (Count Reg)-1 ) ) 3 执行其后的串处理指令 4 重复 1~ 3 其中,地址长度为 位时 位时, 作为Count Reg;地址长度为 位 其中,地址长度为16位时,用CX作为 作为 ;地址长度为32位 作为Count Reg。 时,用ECX作为 作为 。 总结:重复串操作条件: 总结:重复串操作条件: (COUNT REG)≠0且ZF=1; (即某次 ) 且 ; 比较的结果两个操作数相等) 比较的结果两个操作数相等) 退出串操作条件: 退出串操作条件: (COUNT REG)=0或ZF=0; 串操作条件 ) 或 ;
80x86 x86的指令系统和寻址方式 第3章 80x86的指令系统和寻址方式

8周参考:常用指令(串操作 程序控制指令 处理器控制指令)

8周参考:常用指令(串操作 程序控制指令 处理器控制指令)
在屏幕上显示一个字符的 指令段如下: MOV DL,<字符> MOV AH,2 INT 21H
1000H
41 42 43 44 45 46
. . .
’ A ’ B’ ’ ’C’ ’ D’ E’ ’ ’ F’
实现题目要求的程序段调试
9
MOV DI, 1000H MOV CX, 0AH MOV AL, ’E’ CLD REPNZ SCASB JZ FOUND MOV DL, ’N’ JMP DONE FOUND:DEC DI MOV ADDR, DI SUB DI, 1000H INC DI MOV NUM, DI MOV DL, ’Y’ DONE: MOV AH, 2 INT 21H HLT
31
例1:给1A000H开始的256个内存单元均减去1,若 发现某个单元减为0则立即退出循环,其后的单元 不再减1。程序段如下:(逻辑地址为1A00:0H)
MOV AX, 1A00H MOV DS, AX MOV DI, -1 MOV CX, 256 GOON: INC DI DEC BYTE PTR[DI] LOOPNZ GOON HLT
条件转移指令可实现程序的条件分支。
条件转移指令根据标志位的状态来决定是否
进行分支转移。 格式: JXX label ;xx为条件名称缩写 指令的转移范围为-128~+127字节。 主要的条件转移指令。
24
① 根据单个标志位设置的条件转移指令
JB/JC JNB/JNC/JAE JP/JPE JNP/JPO JZ/JE JNZ/JNE JS JNS JO JNO ;低于,或CF=1,则转移 ;高于或等于,或CF=0,则转移 ;奇偶标志PF=1(偶),则转移 ;奇偶标志PF=0(奇),则转移 ;结果为零(ZF=1),则转移 ;结果不为零(ZF=0),则转移 ;SF=1,则转移 ;SF=0,则转移 ;OF=1,则转移 ;OF=0,则转移

微机原理4[1].4逻辑运算及串操作指令

微机原理4[1].4逻辑运算及串操作指令
?源数据串段值为ds偏移地址为si?目的数据串段值为es偏移地址为di?字符串长度字数或字节数使用cx?指令cld使标志df0递增方向指令std使标志df1递减方向?每执行一次串指令自动修改sidi值si1或2di1或2ds
三、位操作指令
可对8位或16位的寄存器或存储器单元中 的内容按位进行操作,包括:
例1:将2000H:1200H地址开始的100个字节 传送到6000H:0000H开始的内存单元中。
MOV AX,2000H MOV DS,AX KKK:MOV AL,[SI] 2000H:1200H MOV [DI],AL MOV AX,6000H 如果不用串操作指令 INC SI MOV ES,AX INC DI MOV SI,1200H DEC CX JNZ KKK MOV DI,0 此处不用 6000H:0000H REP,则: MOV CX,100 KKK: MOVSB CLD DEC CX NEXT:REP MOVSB
(4)测试指令TEST 指令格式: TEST dest,src;dest ∧ src 指令功能: 源操作数和目的操作数的内容执行按位 的逻辑与运算,根据结果置SF、PF、ZF, 且CF=OF=0,而AF位无定义。 dest,src内 容不变。
常用于:
在不改变原来操作数的情况下,检测某一位 或某几位是否为1或为0。 编程时,用在条件转移指令前产生条件。

实现对一串字符或数据的操作
可进行串传送、串比较、串扫描、读串或写 串等操作,串长最多可达64KB

字符串指令的寻址方式只用隐含寻址,源串 固定使用SI,目的串固定使用DI。

指令包含:
REP REPE/REPZ REPNE/REPNZ
MOVS、STOS、LODS CMPS、SCAS

串操作类指令

串操作类指令
在SCAS指令前加有REPE/REPZ前缀,则表示:当串未结尾(CX≠0) 且串元素=关键值(ZF=1)时继续搜索。 --用来搜索与给定关键值不同的内容。
在SCAS指令前加有REPNE/REPNZ前缀,则表示:当串未结尾 (CX≠0)且串元素≠关键值(ZF=0)时继续搜索,直到CX=0或ZF= 1才执行下一条指令。 --可以用来在一个串中查出某一指定元素。
指令格式:SCAS OPRD SCASB ;搜索字节串 SCASW ;搜索字串 SCASD ;搜索双字串 SCASQ ;搜索4字串
功能:将累加器(AL或AX或EAX或RAX )中的内容与ES:DI(EDI 、 RDI )指定的目标串元素(字节或字或双字或4字)进行比较(减法操 作),用标志位反映比较的结果,而不改变累加器和目标串的内容,达 到字符串搜索的目的,同时自动修改指针DI。
若CMPS指令前加上前缀REPE/REPZ,则表示:当串未结尾(CX≠0) 且串相等(ZF=1)时继续比较;
如果CMPS用REPNE/REPNZ作前缀,则表示:当串未结尾 (CX≠0)且串不相等(ZF=0)时继续比较。
2009年6月2日星期二
7
例:比较两个字符串是否有相同的元素,它们的首地址和目标地址分别 为SRC和DST,字符串的长度为N个字节。
GO_ON:
MOVSD
DEC
CX
JNZ
GO_ON
若采用重复前缀,则上述程序简化为:
LEA SI,SOURCE
LEA DI,DEST
MOV ECX,50
;设置循环操作次数
CLD
;设置方向标志DF=0
REP MOVSD
2009年6月2日星期二
6
(2)串比较指令 CMPS/CMPSB/CMPSW/CMPSD/CMPSQ

微机原理实验四串操作指令

微机原理实验四串操作指令

实验四串操作指令程序实验一、实验目的1. 熟悉五种串操作指令的功能,会编写常用的串操作应用程序。

2. 会使用DEBUG 命令查看串操作运行的结果。

二、实验环境1. 硬件:PC 微机2. 软件:Masm for Windows 汇编集成开发环境三、实验讲义串指连续存放在存储器中的一些数据字节、字或者双字。

串操作允许对程序连续存放的数据块进行操作。

这是唯一一种可以从存储器到存储器的指令。

源串一般存放在数据段,偏移地址由SI 指定;目标串必须在附加段,偏移地址由DI 指定。

在每次进行串操作后,SI 和DI 两个指针会自动修改。

修改的是增量方向还是减量方向由标志位DF 决定,DF=0 为增量操作,DF=1 为减量操作。

CX 中存放的是数据块的长度,可在CX 前加重复前缀标志,对串进行连续操作。

执行串指令之前,一般先进行如下操作:源串首地址(末地址)→ SI目的串首地址(末地址)→ DI串长度→ CX建立方向标志DF1. 重复前缀标志助记符判断条件说明REP CX 0 CX=CX-1,若CX 0 则重复REPE 或REPZ CX 0 且ZF=1 CX=CX-1,若CX 0 且ZF=1 则重复REPNE 或REPNZ CX=0 且ZF=0 EX=CX-1,若CX 0 且ZF=0 则重复2. 方向标志指令方向标志由标志位DF 决定,有CLD 和STD 两种指令。

CLD 将DF 置0,地址为增量操作。

STD 将DF 置1,地址为减量操作。

3. 串传送指令格式: [REP] MOVS DESTS, SRCS[REP] MOVSB/ MOVSW / MOVSD功能:将DS:SI 中的源串数据传送到ES:DI 规定的目的串单元中。

加重复前缀REP 可实现连续存放的数据块的传送。

例1:将源串中前三个字节的数据传送到目的串。

源串在数据段(DATAS)中,存放在SRC 单元中;目的串在附加数据段(EDATAS)中,存放在DEST 单元中。

汇编语言——串操作指令

汇编语言——串操作指令
(2)MOVSW进行字型串复制,把DS:SI所指向的一个 字型数据送往ES:DI所指向的内存中。当DF=0时,令SI←SI +2,DI←DI+2;当DF=1时,令SI←SI-2,DI←DI-2。
MOVS指令可以实现把内存中的一个数据,不经过寄存 器的过渡由一处复制到另一处。这一点是MOV指令做不到 的。MOVS指令与循环控制指令配合,可以完成数据块的复 制。被复制的数据串称为源串,复制到的目的地称为目标 串。如果源串与目标串所占据的内存是完全分离的,数据 传递可以按由串首至串尾的次序进行,也可以按相反的方 向进行。但是,当两者占据的内存区域有部分重叠时,需 要注意用DF控制方向,当源串首地址小于目标串首地址时, 应由尾至首进行传送,源串首址大于目标串首址时,则由 首至尾传送。
(2)STOSW进行字型串操作,把AX的值送往内存中由 ES:DI所确定的内存中。当DF=0时,令DI←DI+2,当DF= 1时,令DI←DI-2。
STOS指令主要用于把一段连续的存储区域以AL或AX中 的值填充,特别的是,存储区的段地址必须放在附加段寄存 器ES中。STOS与LODS指令配合,还可以从一个串中取出数 据,有选择地存到另一个串中。
8088提供有两条专用指令设置DF,分别是CLD和STD 指令。
【指令格式】CLD
【功能】把标志位DF清0。
【指令格式】STD
【功能】把标志位DF置1。
7.2.2 串操作指令
8088指令系统中共设计有5条串操作指令,分别用于完 成从串中取出数据、往串中2.2.1 LODS指令──从串中取出数据
lab2:
INC [countp]
JMP lab4
lab3:
INC [countn]
lab4:
LOOP lab1

串操作指令

串操作指令
串操作指令的特点
❖ 源串一般存放在数据段,偏移地址由SI指定。允许段重 设;
❖ 目标串必须在附加段,偏移地址由DI指定; ❖ 指令自动修改地址指针,修改方向由DF决定。DF=0
增地址方向;DF=1 减地址方向; ❖ 数据块长度值由CX指定 ❖ 可增加自动重复前缀以实现自动修改CX内容。
1
串操作指令流程
JZ STOP DEC SI MOV AL,[SI] MOV BX,SI
STOP:HLT
7
3.6.3 SCAS 目标串
❖ 格式: SCAS OPRD
目标 操作数
SCASB
SCASW
❖ 执行与CMPS指令相似的操作,只是这里的源操作数是AX 或AL
❖ 常用于在指定存储区域中寻找某个关键字, 关键字要存放在AX或AL。P125 例
❖ 格式: STOS OPRD
目标 操作数
STOSB
STOSW
❖ 操作:对字节: AL ([ES:DI])
对 字: AX ([ES:DI])
P126 例
10
串送存指令例
❖ 设计思想:
区域首地址送ES:DI 串长度送CX 置方向标志DF
将内存某个区域清零
0送累加器AL 执行串送存指令
?
11
3.7 程序控制类指令
转移指令 循环控制 过程调用 中断控制
12
3.7.1 无条件转移指令
通过修改指令的偏移地址或段地址及偏移 地址实现程序的转移
无条件转移指令 无条件转移到目标地址,执行新的指令
有条件转移指令 在具备一定条件的情况下转移到目标地址
13
1. JMP 目标标号
❖ 格式: JMP OPRD
与JMP在同一代码 段

字符串操作指令

字符串操作指令

字符串操作指令
1.1 基本串操作指令
1 串传送指令
格式:MOVSB(字节串传送) 或MOVSW(字串传送) 或MOVS DST, SRC
功能:将SI所指向的源串中的一个字节或字传送到DI所指向的目的串中。
该指令 对标志位无 影响。
在执行串传送指令前,一般要预先设置源串地址DS:SI、目的串地址ES:DI和方向标 志位DF的值。
程序段如下:
MOV AX, 1000H
MOV DS, AX
;设置源串段地址
MOV AX, 2000H
MOV ES, AX
;设置目的串段地址
MOV SI, 0200H
;设置源串偏移地址
MOV DI, 1000H
;设置目的串偏移地址
MOV CX, 100 ;将串的长度送入CX
CLD
;将DF置为0,地址自动递增
串 扫 描 指 令 与 REPE/REPZ 或 REPNE/REPNZ连用,常用于搜索字符串中 是否存在某个特定的字符。
提示
(1)重复前缀指令 不能单独使用,后面必 须跟基本串操作指令。
(2)重复前缀指令 不影响标志位。
字符串操作指令
例4-1
将以1000H:0200H地址开始的100个字节传送到以2000H:1000H开始的存储单元中。
微机原理与接口技术
字符串操作字符串可能包含若干字节或字。字符串操作指令 用于对存储器中的字节串或字串进行处理。
字符串操作指令可以在两组存储单元之间进行操作。 源串(源操作数)一般存放在当前数据段中,即寄 存器DS中的内容为其段地址,寄存器SI中的内容为其偏 移地址,因此,源串地址为DS:SI; 目的串(目的操作数)一般存放在附加数据段ES中, 即寄存器ES中的内容为其段地址,寄存器DI中的内容为 其偏移地址,因此,目的串地址为ES:DI。

串操作类指令

串操作类指令

mov di,offset string2
mov cx,count
cld
repz cmpsb ;重复比较两个字符
jnz unmat ;字符串不等,转移
mov al,0
;字符串相等,设置00h
jmp output ;转向output
unmat: mov al,0ffh ;设置ffh
output: mov result,al ;输出结果标记 解释
➢把字节或字操作数从主存的源地 址传送至目的地址
MOVSB MOVSW
演示
;字节串传送:ES:[DI]←DS:[SI] ;SI←SI±1,DI←DI±1
演示
;字串传送:ES:[DI]←DS:[SI] ;SI←SI±2,DI←DI±2
offset是汇编操作符, 求出变量的偏移地址
例2.52:字节串传送
LOCK/HLT/ESC/WAIT 5. 习题4(p70) 2.15 2.16 2.26 ⑶ ⑹ ⑺
➢ 重复前缀分2类,3条指令:
配合不影响标志的MOVS、STOS(和 LODS)指令的REP前缀
配合影响标志的CMPS和SCAS指令的 REPZ和REPNZ前缀
第2章
REP重复前缀指令
REP
;每执行一次串指令,CX减1
;直到CX=0,重复执行结束
➢REP前缀可以理解为:当数据串 没有结束(CX≠0),则继续传送
LODSB LODSW
演示 ;字节串读取:AL←DS:[SI] ;SI←SI±1
;字串读取:AX←DS:[SI] ;SI←SI±2
例2.54:串读取-1
mov si,offset block mov di,offset dplus mov bx,offset dminus mov ax,ds mov es,ax ;数据都在一个段中,所以设置es=ds mov cx,count ;cx←字节数 cld

串操作指令

串操作指令

3.3.4 串操作指令串或字符串是指在内存中连续存放的由字节或字组成的数据串,可以是数值型或字符型数据。

我们常常要从数据串中查找特定数据;或者比较两个串是否相同等,或者把一个串从内存的一个区域传送到另一个区域等操作;使用串操作指令就是最佳选择。

串操作指令对串中数据进行相同的操作,可以以字节为单位或以字为单位,可操作的最大串长度为64K。

串操作指令包括:MOVS 串传送CMPS 串比较SCAS 串扫描STOS 存入串LODS 取串这五种串操作指令都是隐含指令,说明如下:①源操作数(源串)默认由DS:SI指定,即源串默认在数据段,允许段超越为CS、ES 和SS。

偏移地址指针SI自动修改。

②目的操作数(目的串)默认由ES:DI指定,即目的串默认在附加数据段。

不允许段超越。

偏移地址指针DI自动修改。

③通过设定标志寄存器中的方向标志位DF的值,可以控制串操作的方向。

DF设定为0,偏移地址指针SI和DI自动增量,如果串操作为字节操作,每次偏移地址指针加1,如果为字操作,每次偏移地址指针加2。

DF设定为1,偏移地址指针自动减量。

如果串操作为字节操作,每次偏移地址指针减1,如果为字操作,每次偏移地址指针减2。

如图3-9所示。

④串操作指令本身只操作一次,例如指令MOVSB的功能为将DS:SI指明的一个字节传送到ES:DI指明的内存单元中。

如果要使整个的源串数据全部传送到目的串中,需要再加一个重复前缀REP。

用于串操作指令的重复前缀有三种,分别是:REP:无条件重复前缀REPE:相等时重复(ZF=1),REPZ:比较结果为0时重复REPNE:不相等时重复(ZF=0),REPNZ:比较结果不为0时重复⑤带重复操作前缀的串操作指令,需要指明重复次数。

用计数器CX指定串长度,即重复次数,每次串操作后CX自动减1,直到CX=0,串操作结束。

综上所述:在使用串操作指令前应预先设置源串指针DS:SI,目的串指针ES:DI,计数器CX 和标志位DF。

【汇编语言-4】字符串处理指令stosb、lodsb、movsw、scasb、rep

【汇编语言-4】字符串处理指令stosb、lodsb、movsw、scasb、rep

【汇编语⾔-4】字符串处理指令stosb、lodsb、movsw、scasb、rep⼀、字符串处理指令(1) lodsb、lodsw:把DS:SI指向的存储单元中的数据装⼊AL或AX,然后根据DF标志增减SI(2) stosb、stosw:把AL或AX中的数据装⼊ES:DI指向的存储单元,然后根据DF标志增减DI(3) movsb、movsw:把DS:SI指向的存储单元中的数据装⼊ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI(4) scasb、scasw:把AL或AX中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI(5) cmpsb、cmpsw:把DS:SI指向的存储单元中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI(6) rep:重复其后的串操作指令。

重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。

主要⽤在MOVS和STOS前。

⼀般不⽤在LODS前。

上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器AX、计数器CX涉及的标志位:DF、AF、CF、OF、PF、SF、ZF⼆、使⽤举例(1) 把当前数据段中偏移1000H开始的100个字节的数据传送到从偏移2000H开始的单元中CLDPUSH DSPOP ESMOV SI,1000HMOV DI,2000HMOV CX,100NEXT:LODSBSTOSBDEC CXJNZ NEXTCLDPUSH DSPOP ESMOV SI,1000HMOV DI,2000HMOV CX,100NEXT:MOVSBDEC CXJNZ NEXTCLDPUSH DSPOP ESMOV SI,1000HMOV DI,2000HMOV CX,3NEXT:MOVSBLOOP NEXTCLDPUSH DSPOP ESMOV SI,1000HMOV DI,2000HMOV CX,3REP MOVSB(2) 判断AL中的数字是否为16进制数STRING DB '0123456789ABCDEFabcdef' STRLEN EQU $-STRING...CLDMOV DX,SEG STRINGMOV ES,DXMOV CX,STRLENMOV DI,OFFSET STRING NEXT:SCASBLOOPNZ NEXTJNZ NOT_FOUNDFOUND:...NOT_FOUND:...(3) 其它实例start:mov ax,#BOOTSEGmov ds,axmov ax,#INITSEGmov es,axmov cx,#256sub si,sisub di,direpmovwmovl $1024*5,%ecxxorl %eax,%eaxxorl %edi,%edicld;rep;stoslmovl $pg0+7,_pg_dirmovl $pg1+7,_pg_dir+4movl $pg2+7,_pg_dir+8movl $pg3+7,_pg_dir+12movl $pg3+4092,%edimovl $0xfff007,%eaxstd1: stoslsubl $0x1000,%eaxjge 1b。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DI
23 D0 05 AB 92
Source
NEXT: LODSB INC AL 4、保存运算结果 5、所有操作完成否?若完成, 结束;否则继续2-4的动作 STOSB DEC CX JNZ NEXT HLT
24 D1 06 AC
Dest
DI
23 D0 05
Dest
ES
例1-2:与 REP 指令配合传送100个数。 LEA SI,Souce LEA DI,Dest MOV CX,100 LEA SI,Souce LEA DI,Dest MOV CX,100 CLD REP MOVSB HLT CX不为 0 时重复执行
SI
23 D0 05 AB 92
SI
23 D0 05 AB 92
Source
[SI] - [DI] SI+1 → SI DI+1 → DI
3、操作结束? 若否,继续2中 的操作;否则结 束程序
DI
23 D0 05 A1 92
Dest
例2-2:在内存的DS和ES段中,各有长度为50字节的字符串,试比较它们 是否相同。( 与 REPE / REPZ配合使用,找第一个不相同的数据位置)
REPNE CMPSB
JE Found MOV AX, 0 JMP Exit Found : DEC SI MOV AX, SI Exit: HLT
DI 23 D0 05 A1 92 Dest
3、SCAS指令 格式:SCASB/SCASW 功能:AL/AX-[ES:DI] DI±1或2 注意:状态位随运算结果变化。
LEA DI, DEST
MOV CX, 30 MOV AL, ‘A’
DI 53 71 41 49 68 DEST
REPNE SCASB
JE Found MOV BX,0
JMP Over
Found: DEC DI MOV BX, DI
Over: HLT
下面程序是查找STRING中是否有“A”这个字符,如果有则转向YES去执行, 没有则转向NO去执行。假设STRING的长度为20 个字节. MOV CX,20 MOV BX,-1 MOV AL,’A’ NEXT: INC BX CMP AL,STRING[BX] JE YES DEC CX JNZ NEXT JMP NO YES: …… …… JMP EXIT NO: …… …… EXIT:HLT
53 71 41 49 68
DEST
例3-2:寻找字符串中是否有字符 ‘A’ 。与 REPE/ REPZ , REPNE / REPNZ配合使用。
LEA DI, DEST MOV CX, 30 CLD MOV AL,’A’ Again: SCASB JE Found DEC CX JNZ Again MOV BX,0 JMP Over Found: DEC DI MOV BX,DI Over: HLT
LEA DI, [0404H] MOV CX, 256 CLD
MOV AL,0 REP STOSB
3、将AL以串操作的方式 传到内存区域
5、LODS指令 格式:LODSB/LODSW 功能:AL/AX ←[DS:SI] SI±1或2 注意:不影响状态位。该指令就是把内存中的值取入 累加器AL/AX中,因为累加器只有一个,所以 LODSB/LODSW指令前加重复前缀没有意义。
3、REPNE/REPNZ(当不等/不为零时重复) 格式:REPNE/REPNZ CMPS/SCAS 功能:
若CX≠0且ZF=0,重复执行后续的串操作指令, 每执行一次CX← CX-1; 若CX=0或ZF=1,退出重复,结束串操作
注意:
若已知两个数据块的内容基本上相同,例如数据块 搬移后,要寻找其中不一致的地方,则应该在CMPS 指令前面使用REPE/REPZ前缀; 若已知两个数据块的内容基本不相同,要寻找其中 相一致的地方,则应该在CMPS/SCAS指令前面使用 REPNE/REPNZ前缀,例如查找程序;
该指令用来从目标串中查找某个关键字,要求 查找的关键字事先置入寄存器AL或AX中去,将 AL/AX寄存器中的关键字减去由DI指向的目标串的 一个元素,不传送结果,只是根据结果置标志位, 修改DI寄存器指向下一元素。
例3-1:寻找字符串中是否有字符 ‘A’ 。若无,将BX 置为0;若有,将字符‘A’的位置存到BX中。
分析下列程序运行后,DX中的值表示的意义是什么?
初始化 CLD LEA DI,BUFF MOV CX,50 MOV AL,’$’ XOR DX,DX REPNZ SCASB CMP CX,0 JZ K1 INC DX JMP NEXT
字符串BUFF中字符’$’的个数。
NEXT:
K1:
4、STOS指令 格式:STOSB/STOSW 功能:[ES:DI]←AL/AX DI±1或2 注意:不影响状态位。源操作数为AL或AX,由目的操 作数dest的类型确定。
例2-1:在内存的DS和ES段中,各有长度为50字节的字符串,试比较它们 是否相同,若相同,则AX=0; 若不同,记录不同字符在源数据区中的位 置。 LEA SI,Source
编程思路: 1、初始化指针SI, DI,CX, 置方向标志DF为0 (CLD)或1(STD) 2、操作
LEA DI,Dest MOV CX,50 CLD Again: CMPSB JNE Found DEC CX JNZ Again MOV AX,0 JMP Over Found: DEC SI MOV AX, SI Over: HLT
SI
Hale Waihona Puke 23 D0 05 AB 92
Source
DS
LEA SI,Source 3、操作结束? 若否,继续2中 LEA DI,Dest MOV CX,100 的操作;否则结 束程序 CLD Again: MOVSB [SI] → [DI] SI+1 → SI DEC CX DI+1 → DI JNZ Again HLT
LEA DI, DEST MOV CX, 30 CLD MOV AL,’A’ Again: SCASB JE Found DEC CX JNZ Again MOV BX,0 JMP Over Found: DEC DI MOV BX,DI Over: HLT
编程思路: DI 1、初始化指针SI, DI,CX, 置方向标志DF为0 (CLD)或1(STD) 2、操作 3、操作结束? 若否,继续2中 的操作;否则结 束程序
CX不为 0 且 [si] 与 [di] 不相等 (ZF=0) 时重复
LEA DI, DEST
MOV CX, 50 CLD
SI

检测 CX=0? 或 ZF=1? 是,退出
否,进行② CX – 1 -> CX 执行REPNE 后的串操作。 重复 ① ~ ③
53 80 05 A3 72
Souce
② ③ ④
例:在数据段中自Source开始有一长度为30个字 节的字符串,试将其每一个字符加一后送入附加 段中自Dest开始的内存单元中。
LEA SI,Source
SI
编程思路: 1、初始化指针SI,DI,CX, 置方向标志DF为0(CLD)或1(STD) 2、取数据到CPU中的寄存器
3、对数据做运算
LEA DI,Dest MOV CX, 30 CLD
串操作指令
串操作指令 重复前缀
特点: 1、可以对字节串和字串进行操作; 2、源/目的操作数是字符串,源字符串的起始地址为 DS:SI,目标字符串的起始地址为ES:DI; 3、源/目的操作数是单变量的用AL/AX 4、串操作时地址的修改方向与方向标志DF有关,当 DF=1时,SI和DI作自动减量修改,当DF=0时, SI和DI作自动增量修改。
•串操作指令 1、MOVS指令 格式:MOVS dest,src MOVSB/MOVSW 功能:[ES:DI]←[DS:SI] DI±1或2, SI±1或2 注意:不影响状态位。
例1-1: 将数据段中起始地址 为Souce的100个字节 的数据传送到附加段 的Dest指向的单元中。
编程思路: 1、初始化指针SI, DI,CX, 置方向标志DF为0 (CLD)或1(STD) 2、操作
Souce
CLD
Again: MOVSB DEC CX
DI
JNZ Again
HLT
23 D0 05 AB
Dest

判 CX=0 ? 是,传送完毕;
否,进行②
② CX – 1 -> CX
③ 执行REP后的串操作。
④ 重复 ① ~ ③
2、CMPS指令 格式:CMPSB/CMPSW 功能:[DS:SI] -[ES:DI] DI±1或2, SI±1或2 注意:状态位随运算结果变化。通常在CMPS指令前加重 复前缀REPE/REPZ,用来寻找两个串中的第一个不相 同数据。
LEA SI, SOURCE LEA DI, DEST MOV CX, 50
SI 23 D0 05 AB 92 Souce
CX不为 0 且 [si] 与 [di] 相等 (ZF=1) 时重复

检测 CX=0? 或 ZF=0? 是,退出
否,进行② CX – 1 -> CX 执行REPE 后的串操作。 重复 ① ~ ③
该指令就是把累加器AL/AX中的内容存到内存中,如 果使用重复前缀,则可以方便地将内存中的某一区 域初始化为某一数值。
例:使0404H开始的256个单元清0。
编程思路: 1、初始化指针SI,DI,CX, 置方向标志DF为0(CLD)或1(STD) 当然,程序中要用到的才进行初始化。 2、CPU中的寄存器AL清0
CLD REPE CMPSB
② ③ ④
JNE Found
MOV AX,0 JMP Exit
相关文档
最新文档