(2)串指令的传送
存入串指令STOS可以与REP联用,数据串的长度送到CX寄存器中,以控制重复执行的次数。它可使规定长度的字节单元或字单元设置相同的数值。
LODS (Load form string)从串取指令
STOS (Store into string) 存入串指令 这两个源操作数隐含在AL(字节操作)或AX(字操作)中
【例】在ES=1000H的附加段中,将从BUF为首地址的100个字节单元内容清零,可编写主要程序段如下:
MOV AX,1000H
MOV ES,AX ;条件1
LEA DI,BUF ;条件2
MOV AL,0 ;条件3
MOV CX,100 ;条件4
CLD ;条件5,必须设以上五个条件
REP STOSB ;可重复100次操作
【例】 将数据段中首地址为BUF1的200个字节数据传送到附加段中首地址为BUF2开始的内存区中,设DS=1000H,ES=2000H,试用以下三种要求来编制
程序:
? ?(1) 用一般的MOV指令;
?(2) 用串操作指令MOVSB;
(3) 用LODSB与STOSB指令。
要求一的程序段:使用MOV指令的程序段:
MOV AX,1000H ;
MOV DS,AX ;数据段赋值
MOV AX,2000H ;
MOV ES,AX ;附加段赋值
LEA BX,BUF1 ;取源数据区首址
LEA SI,BUF2 ;取目标数据区首址
MOV CX,200 ;传送的字节数
LOP: MOV AL,[BX] ;取源数据
MOV ES:[SI],AL ;存数
INC BX ;
INC SI ;调整地址指针
DEC CX ;调节循环次数
JNZ LOP ;CX≠0继续循环
要求二的程序段:使用MOVSB指令的程序段:
MOV AX,1000H
MOV DS,AX ;设置DS
MOV AX,2000H
MOV ES,AX ;设置ES
LEA SI,BUF1 ;设置SI(源串)
LEA DI,BUF2 ;设置DI(目的串)
MOV CX,200 ;重复次数
CLD ;增量 DF=0
REP MOVSB ;重复200次传送操作
注意:为使指令REP MOVSB的执行,必须准备好六个条件,方能达到预期结果。
要求三的程序段:使用LODSB和STOSB指令的程序段:
MOV AX,1000H
MOV DX,AX ;LODSB 指令条件1
MOV AX,2000H
MOV ES,AX ;STOSB指令条件1
LEA SI,BUF1 ;LODSB指令条件2
LEA DI,BUF2 ;STOSB指令条件2
CLD ;两指令共同条件3
MOV CX,200 ;置循环数
LOP: LODSB ;从串数组中取出数据到AX中
STOSB ;从串数组中取出数据存到AX中
DEC CX
JNZ LOP
标准的ASCII码共128个字符,分为二类:非打印的和可打印的ASCII码。
非打印ASCII码:这类编码用于控制性代码,共33个。如:
BEL(响铃,07H),
DEL(删除,7FH),
CR (回车,0DH),
LF (换行,0AH)等。
可打印ASCII码:共有95个。其中有:
数字0~9的编码 30H~39H
大写字母A~Z的编码 41H~5AH
小写字母a~z 的编码 61H~7AH
空格(Space)的编码 20H
【例】 在数据段中以BLOCK1为首地址的数据块中,存放有大写或小写的英文字母、数字和其它符号组成,其结束符为回车符CR(ASCII码为0DH),把该数据块传送到附加段内以BLOCK2为首地址的内存区,并将其中小写英文字母转换成相应的大写字母ASCII码,其余符号的ASCII码不变。设数据段与附加段的段基值分别为DATA与EXTRA。
英文小写字母ASCII码(a~z):61H~7AH
大写字母ASCII码(A~Z):41H~5AH
即将小写字母的ASCII码减20H,即可得到相应大写字母的ASCII码,程序段如下:
MOV AX,DATA
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
LEA SI,BLOCK1
LEA DI,BLOCK2
CLD
LOP: LODSB ;取一个字符到AL中
CMP AL,0DH ;是否回车符
JZ DONE ;是,转DONE
CMP AL,‘a’
JB OK ;是小于‘a’,转OK
CMP AL,‘z’
JA OK ;是大于‘z’,转OK
SUB AL,20H ;是小写字母,AL减20H
OK: STOSB ;送存
JMP LOP ;转到LOP
DONE: ┉