3.汇编指令:【串操作指令】

一、重复指令(REP、REPE、REPZ、REPNE、REPNZ)

满足条件就一直重复执行(重复前缀后边的)串操作指令
分为:
无条件重复前缀 ——> 用于 传送类指令
条件重复前缀 ——>用于 比较类指令

在这里插入图片描述




二、串操作指令

在这里插入图片描述

2.1使用串操作注意点

针对字符串或数据块的操作。源操作数称为源串,目标操作为目标串

  • 目标串必须在附加段,源串默认在数据段(允许段重设)
  • 源串和目标串指针分别为 SIDI
  • 串长度值必须由 CX 给出
  • 需要通过设置 DF的状态,确定数据的操作方向
  • 串操作指令前可以加 重复前缀(重复前缀必须与串指令一块使用,不能单独使用)

2.2 串操作指令流程

在这里插入图片描述




2.3 CLD 和 STD 指令

CLD 表示将 DF 清零; STD 表示将 DF 置1
在这里插入图片描述




2.4 正题

① 串传送指令 MOVS

首先是串传送:MOVS ,更具体地说,应该分成两种: MOVSB MOVSW
MOVSB 顾名思义就是传送1个字节(也就是8位)的串;
MOVSW 则是传送 1个字的串。

我们看一个例子学习它的用法:

使用 MOVS指令,将200个字节数据从内存数据段 MEM1 为首地址的区域送到一个逻辑段 MEM2为首地址的区域:(我们下面给出程序的分析):

方案一:
在这里插入图片描述

LEA SI, MEM1     //源串的串首地址 给SI寄存器
LEA DI MEM2      //目标串的串首地址 给 DI 寄存器
MOV CX 200       //给 串的长度赋初值(要赋值给 CX)
CLD              //令 DF = 0,说明是从低地址向高地址执行
REP MOVSB        //无条件重复:只要 CX ≠0 就一直执行串的传输
HLT              //当REP跳出来了,就结束

当然也是可以用 MOVSW的,这样的话,我们的 CX 就要赋初值为 100 了,因 MOVSW一次操作16位

方案二:
在这里插入图片描述




② 串比较指令 CMPS

同样地,CMPS 也分为:CMPSB, CMPSW
它执行的是啥呢?—— 目标串 - 源串,但是结果并不返回目标串。就是实现两串的比较。

对于串比较指令,我们一般在它前面加条件前缀。

那么,依旧是刚刚的例子,我们在传输完了 200 个字节的串之后,想要检测一下是否正确传输,我们就需要比较两个串了:下面是程序分析:

	LEA SI, MEM1
	LEA DI MEM2
	MOV CX, 200
	CLD             //上面四条语句全都是初始化
	REPE CMPSB
	JZ STOP         //JZ 表示当 ZF = 1 时执行跳转,执行到这里如果ZF仍然为1说明两串一样
	DEC SI          //完成SI的自减,回顾上面的流程图,SI现在是在串低的后一位
	MOV AL, [SI]    //取出SI中地址所指向的内容           就是不同数据的值
	MOV BX, SI      //取出SI寄存器中的地址               就是不同数据的所指向的地址
STOP: HLT

首先,我们明确一件事情:REPE 的意思是相同即重复( CX≠0,且 ZF = 1 ),也就是说当比较的串一样时,就继续比。那么 REPE 退出的情况有什么呢?

  • CX = 0(说明比完了,那么就是两个串完全一样)
  • CX ≠ 0 ,但是 ZF = 0 (说明在中间有两个串不一样的地方了)

JZ 表示当 ZF = 1 时执行跳转,跳转到 STOP



CMPS 例题2

在这里插入图片描述
到黑色箭头就不在执行REPZ后面的串比较指令CMPSB,并且 指针+1 —>所以SI= DATA1 +5 、DI= DATA1 +5
执行一次比较,cx就减1,故还剩1
ZF=0说明不相等




③ 串扫描指令 SCAS

SCAS也分为 SCASBSCASW
当我们使用时,源操作数是不用写出来的,但是要在程序的前面声明。源操作数是 AL 或者 AX。
当使用 SCASB时,一次操作一个字节单元,源操作数就是 AL
当使用 SCASW时,一次操作一个字单元,源操作数就是 AX

另外,说一下 SCASB,SCASW 都干了什么:

以 SCASB 为例,它执行的是将 AL 里面存放的字节依次和串内的每一个字节单元相减,但是结果不返回,影响标志位 ZF
用于搜索串里面,有没有哪个字节单元的内容和 AL 的一样。

举一个例子:在 ES段中从 2000H 单元开始存放了 10 个字符,寻找其中有没有字符 ‘A’,若有则记录搜索次数,将搜索次数写入 DATA1 单元,并将 ‘A’ 写入 DATA2 单元。

首先,我们要明确一件事情:目标串地址在 ES:DI 里面。

		MOV DI, 2000H     //先给DI 赋值
		MOV BX, DI        //地址备份,用于后面计算搜索次数
		MOV CX, 10        //因为如果采用SCASB,那么就是一个字节一个字节搜索,10次
		MOV AL, 'A'
		CLD
		REPNE SCASB       //“若不相等则重复”,如果不相等,即ZF = 0 ,那么就一直搜索
		JZ FOUND          //若 ZF = 1 就跳转到 FOUND(ZF=1 说明找到一样的了)
		MOV DI, 0
		JMP DONE
FOUND:  DEC DI  //因为 DI 是先自增之后才进入判断的,所以在跳出之后DI 会在 'A' 的后一个单元
		MOV DATA2, DI    //‘A’ 写入 DATA2 单元。
		INC DI
		SUB DI, BX        //计算搜索次数
DONE: 	MOV DATA1,DI
		HLT 




④ 串加载 LODS 与 串存储 STOS

如果使用的是 LODSB,那么它执行的操作是:将数据段中地址为SI 的单元装入 AL;
如果使用的是LODSW,那么它执行的操作是:将数据段中地址为 SI 的单元装入 AX;



如果使用的是 STOSB,那么它执行的是:将 AL 里面的内容存储进 [ES:DI] 内
如果使用的是 STOSW,那么它执行的是:将 AX 里面的内容存储进 [ES:DI] 内




  • 20
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你说的白是什么白_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值