【80X86汇编语言学习】【字符串处理】字符串操作指令REP
2015-07-26 18:07
369 查看
80X86汇编提供的字符串操作指令,每次只能处理一个字或字节,所以需要提供一个循环。而8086提供了一个“重复前缀”REP,
REP重复执行后面的串操作指令,每一次执行,都先判断CX是否为0,如果CX为0,则结束重复;否则CX 减一,重复其后的串操作指令。
REP主要用在串操移动指令MOVS 和串存储指令STOS
例子:提示输入一个字符,用输入的字符填充缓冲区
效果如下:
在子程序FILLB中
SHR是CX右移以为,会将最低位移动到CF位中,如果CX是奇数,执行指令
SHR CX,1 会是CF 中为1
所以JNC FILLB_1根据CF位来判断CX是否为奇数,
REP重复执行后面的串操作指令,每一次执行,都先判断CX是否为0,如果CX为0,则结束重复;否则CX 减一,重复其后的串操作指令。
REP主要用在串操移动指令MOVS 和串存储指令STOS
CLD MOV CX,50 REP STOSW
例子:提示输入一个字符,用输入的字符填充缓冲区
;FILLB ;测试用指定的字符填充指定的缓冲区 DSEG SEGMENT MESS1 DB 'Please input:',0 BUFFER DB 10 DUP (0) LEN_BUFF EQU $ - BUFFER DSEG ENDS CSEG SEGMENT ASSUME DS:DSEG,CS:CSEG START: MOV AX,DSEG MOV DS,AX ; MOV SI,OFFSET MESS1 ;显示提示信息 CALL DMESS MOV AH,1 ;接收一个字符 INT 21H ; MOV BX,SEG BUFFER MOV ES,BX MOV DI,OFFSET BUFFER MOV CX,LEN_BUFF CALL FILLB ; CALL NEWLINE MOV CX,LEN_BUFF MOV SI,OFFSET BUFFER NEXT: MOV AL,[SI] CALL PUTCH INC SI DEC CX JNZ NEXT EXIT: MOV AX,4C00H INT 21H ;子程序名:PUTCH ;功 能:显示一个字符 ;入口参数:AL = 需要显示的字符 ;出口参数:无 PUTCH PROC PUSH DX MOV DL,AL MOV AH,2 INT 21H POP DX RET PUTCH ENDP ;子程序名:DMESS ;功 能:显示一个以0为结束符的字符串 ;入口参数:SI = 字符串首地址 ;出口参数:无 DMESS PROC DMESS1: MOV DL,[SI] INC SI OR DL,DL JZ DMESS2 MOV AH,2 INT 21H JMP DMESS1 DMESS2: RET DMESS ENDP ; ;子程序名:NEWLINE ;功 能: 形成回车和换行 ;入口参数:无 ;出口参数:无 ;说 明:通过显示回车符形成回车,通过显示换行符形成换行 NEWLINE PROC PUSH AX PUSH DX ; MOV DL,0DH ;回车符的ASCII码 0DH MOV AH,2 ;显示回车 INT 21H ; MOV DL,0AH ;换行符的ASCII码 0AH MOV AH,2 ;显示换行符 INT 21H ; POP DX POP AX RET NEWLINE ENDP ;子程序名:FILLB ;功 能: 用指定字符填充指定缓冲区 ;入口参数:ES:DI = 缓冲区首地址 ; CX = 缓冲区长度,AL = 填充字符 ;出口参数:无 FILLB PROC PUSH AX PUSH DI JCXZ FILLB_1 CLD ;使DI指针递增 SHR CX,1 ;CX 、2,将字节数转换为字的个数 MOV AH,AL REP STOSW ;按字进行填充 JNC FILLB_1 ;如果缓冲区长度为偶数,则转移 STOSB ;如果缓冲区的长度为奇数,则单独进行按字节进行填充 FILLB_1: POP DI POP AX RET FILLB ENDP CSEG ENDS END START
效果如下:
在子程序FILLB中
SHR CX,1 MOV AH,AL REP STOSW JNC FILLB_1
SHR是CX右移以为,会将最低位移动到CF位中,如果CX是奇数,执行指令
SHR CX,1 会是CF 中为1
所以JNC FILLB_1根据CF位来判断CX是否为奇数,
相关文章推荐