汇编数据串操作和修改标志位指令处理机控制指令

目录

不使用数据串操作

数据串指令

数据串操作指令注意:

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取反

猜你喜欢

转载自blog.csdn.net/m0_64365315/article/details/128392445