目录
不使用数据串操作
数据串指令
数据串操作指令注意:
MOVS数据串传送指令 (重点掌握)
REP重复指令(补充)
LODS取数据串(只有源)
STOS存入串(只有目标)
CMPS串比较
可以加重复前缀REPZ/REPE 和REPNZ/REPNE
SCAS 串搜索(串扫描)
补充指令直接影响标志位
DF标志位
CLD指令
STD指令
IF标志位
CLI指令
STI指令
CF标志位
CLC 指令
STC指令
CMC指令
不使用数据串操作
串操作引入,不适用串操作完成复制需要借助寄存器
MOV SI,OFFSET STR1 MOV DI,OFFSET STR2 MOV CX,5 NEXT1: MOV AL,[SI];需要使用4条指令才可以完成 MOV [DI],AL INC SI INC DI LOOP NEXT1
数据串指令
需要掌握源在哪里,目标在哪里。知道会自动修改,知道方向标志位DF 的影响
数据串操作指令注意:
源串必须在数据段DS当中,必须是用SI作为地址指针
目标段必须定义在附加段ES,使用DI作为地址指针
MOVS数据串传送指令 (重点掌握)
(move string)
MOVSB/W(字节/字)
从内存直接传入内存,就不需要CPU了
也就是刚才的四句话直接换成 MOVSB 就行了
自动修改SI和DI的指针,指针的方向有DF决定是加还是减也就是程序中就不需要
DATA SEGMENT STR1 DB 'ABCDE' DATA ENDS EXTRA SEGMENT STR2 DB 5 DUP(?) EXTRA SEGMENT CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EXTRA START: MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX ;开始写程序 MOV SI,OFFSET STR1 MOV DI,OFFSET STR2 MOV CX,5 CLD;指针方向自增 NEXT1: MOVSB;自动修改SI和DI LOOP NEXT1 EXIT: MOV AH,4CH INT 21H CODE ENDS END START
可见数据串操作指令注意事项很多
但MOVSB指令并补不能自己循环,所以需要配合LOOP指令
如果你不想用loop指令,也可以用重复指令REP
REP重复指令(补充)
也可以自动修改CX,如果CX不为零,会继续执行REP后面的指令。这样就省去的LOOP指令
REP MOVSB
例题:
将1000H:000H开始的100H个数据顺序下移一个位置。
这时候方向标志位就要反着来,如果正方向移动数据就都丢了
MOV SI,00FFH MOV DI,0100H MOV CX,0100H STD;指针自减 REP MOVSB
LODS取数据串(只有源)
(load string)
因为它只能往AL中取,取完就要立即进行操作,要不你取下一个
就把上次取的覆盖了,所以不和重复指令REP联用。字节取到AL,字取到AX
STOS存入串(只有目标)
(store string)
用于初始化
CMPS串比较
(compare string)
一旦遇到不一样的就会退出
可以加重复前缀REPZ/REPE 和REPNZ/REPNE
REPZ CX不等于0,ZF=1执行
REPNZ CX不等于0,ZF=0执行
跟前面学的跳转指令差不多,有N就是0有效,没N就是1有效
SCAS 串搜索(串扫描)
(scan string)
在一个数据串(附加段)中,搜索寄存器中的值。找到一样的就退出
补充指令直接影响标志位
DF标志位
CLD指令
(clear direction)
让DF=0 (地址是加的不是减)
STD指令
(set direction)
让DF=1 (地址是减量的)
IF标志位
CLI指令
(clear interrupt)
IF=0 关中断状态
STI指令
(set interrupt)
IF=0 开中断状态
CF标志位
CLC 指令
(clear carry)
CF=0
STC指令
(set carry)
CF=1
CMC指令
(carry make change)
CF=CF取反