字节串检索
SCASB ;(AL)-(ES:[DI])
;DI←(DI)±1
字串检索
SCASW ;(AX)-(ES:[DI])
;DI←(DI)±2
影响标志位
字节串读取
LODSB ;AL←(DS:[SI])
;SI←(SI)±1
字串读取
LODSW ;AX←(DS:[SI])
;SI←(SI)±2
不影响标志位
字节串存储
STOSB ;ES:[DI]←(AL)
;DI←(DI)±1
字串存储
STOSW ;ES:[DI]←(AX)
;DI←(DI)±2
不影响标志位
重复前缀指令(repeat)
串操作指令前,可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在CX寄存器中。
重复前缀分2类,3条指令:
REP前缀配合不影响标志的MOVS、STOS指令使用
REPZ/REPE、REPNZ/REPNE前缀配合影响标志的CMPS、SCAS指令使用
REP重复前缀指令
REP ;每执行一次串指令,CX减1
;直到CX=0,重复执行结束
REPZ/REPE重复前缀指令
REPZ ;每执行一次串指令,CX减1
;并判断ZF是否为0,
;只要CX=0或ZF=0,重复执行结束
REPNZ/REPNE重复前缀指令
REPNZ ;每执行一次串指令,CX减1
;并判断ZF是否为1,
;只要CX=0或ZF=1,结束重复执行
5)调用/转移/循环控制/中断指令
(1)指令寻址方式及无条件转移指令JMP
指令寻址方式:顺序寻址方式、跳跃寻址方式
通过改变IP(和CS)值,实现程序执行顺序的改变。
跳跃寻址方式:
段内直接寻址方式
段内间接寻址方式
不更改CS,只改变IP
段间直接寻址方式
段间间接寻址方式
更改CS,改变IP
段内直接寻址方式(相对寻址)
IP← (IP)+ 8/16位位移量
16位位移量:近转移(near)(-32768~+32767)
8位位移量:短转移(short) (-128~+127)
段内间接寻址方式
IP←(reg16/mem16)
段间直接寻址方式
远转移(far)——目标地址必须是32位,称为远指针即逻辑地址。
IP←目标的偏移地址
CS←目标的段地址
段间间接寻址方式
IP←(mem)
CS←(mem+2)
(2)子程序调用和返回指令
子程序是完成特定功能的一段程序;
当主程序(调用程序)需要执行这个功能时,采用CALL转移到该子程序的起始处执行;
当运行完子程序功能后,采用RET返回指令回到主程序继续执行。
调用指令
CALL指令分成4种类型(类似JMP)
CALL label
;段内调用、直接寻址
CALL reg16/mem16
;段内调用、间接寻址
CALL far ptr label
;段间调用、直接寻址
CALL dword ptr mem
;段间调用、间接寻址
调用指令
CALL指令需要保存返回地址
段内调用——偏移地址IP压栈
SP←(SP)-2,(SP)←(IP)
段间调用——偏移地址IP和段地址CS压栈
SP←(SP)-2,(SP)←(CS)
SP←(SP)-2,(SP)←(IP)
返回指令
根据段内和段间、有无参数,分成4种类型
RET ;无参数段内返回
RET imm16 ;有参数段内返回
RET ;无参数段间返回
RET imm16 ;有参数段间返回
需要弹出CALL指令压入堆栈的返回地址
段内返回——偏移地址IP弹栈
IP←((SP)),SP←(SP)+2
段间返回——偏移地址IP和段地址CS弹栈
IP←((SP)),SP←(SP)+2
CS←((SP)),SP←(SP)+2
RET imm16 ;有参数返回
RET指令可以带有一个偶数imm16,
则堆栈指针SP将增加,即
SP←(SP)+imm16
有参数返回使得程序方便地废除执行CALL指令以前入栈的参数。
(3)条件转移指令
条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令。
Jcc指令不影响标志。