1、3-39:以MEM为首地址的内存区域中10个以非压缩性BCD码形式存放的十进制数,它的可能值0-9中任意一个数字,先编程将这10个数顺序显示在屏幕上,程序段如下:
LEA SI,MEM ;SI—源串偏移地址
MOV CX,10 ;设置串长度
CLD ;DF—0
MOV AH,02H ;AH—功能号(表示但字符显示输出)
NEXT:LODSB ;取一个BCD码到AL
ADD AL,30H ;BCD码转换为对应的ASCII码
MOV DL,AL ;DL—字符的ASCII码
INT 21H ;输出显示
DEC CX ;CX—CX-1
JNZ NEXT ;ZF=0则重复
HLT
理解:
串装入指令格式,LODS OPRD;OPRD—源串
LODSB:一次完成一个字节串的装入
2、3-40:把6000H:1200H单元开始的100个字节储存的内容全部清零,可以用串储存指令实现,程序如下:
MOV AX,6000H
MOV ES,AX ;ES—目标串的段地址
MOV DI,1200H ;DI—目标串的偏移地址
MO V CX,100 ;CX—串长度
CLD ;DF—0,从低地址到高地址的方向进行储存
MOV AX,0 ;AX—0,即要存入目的串的内容
REP STOSW ;将100个单元清零
HLT
理解:
串储存指令:STOS OPRD ;OPRD为目标串
STOSW:每次按照一个字来进行储存
3、3-41:
MOV AX,BX
JMP NEXT ;无条件段内转移,转向符号地址NEXT处
AND CL,0FH
理解:这里的NEXT是一个段内标号,当程序计算出JMP的下条指令,即AND CL,0FH的地址到NEXT编号代表的地址之间的距离。
4、3-42:提前设置DS=3000H,BX=3000H,[33000H]=0BH,[33001H]=20H;[33002H]=10H,[33003H]=80H,则执行指令后,IP=200BH,CS=8010H
JMP DWORD PTR [BX]
理解:
段间转移是控制程序转移到另一个程序代码中,不仅IP的内容要改变,CS的内容也要改变,转移的地址一定是32位字长,所以一定要加上DWORD PTR,表示其后的操作数是双数。JMP对标志位无影响。
5、3-43:在内存的数据段中存放100个8位带符号数,将其首地址设为TABLE,试统计其中正元素和负元素、零元素的个数,并分别将个数存入PLUS,MINUS和ZERO这三个单元中。
START:XOR AL,AL ;AL清零
MOV PLUS,AL ;PLUS单元清零
MOV MINUS,AL ;MINUS清零
MOV ZERO,AL ;ZERO清零
LEA SI,TABLE ;数据表首地址送SI
MOV CL,100 ;表长度送入CL
CLD ;使DF=0
CHECK:LODSB ;取到一个数到AL
OR AL,AL ;操作数自身相“或”,仅影响标识位
JS X1 ;若为负转为X1
JS X2 ;若为零转为X2
INC PLUS ;否则为正,PLUS单元加一
JMP NEXT ;
X1:INC MINUS ;MINUS单元加一
JMP NEXT ;
X2:INC ZERO ;ZERO单元加一
NEXT:DEC CL ;CL减一
JNZ CHECK ;若ZF=0转CHECK
HLT ;停止
理解:为实现上述功能,先将三个单元清零,在利用条件转移存入单元中。
6、3-44:以DATA为首地址的内存数据段中存放200个16位带符号数,找出其中最大数和最小数,分别放在MAX和MIN单元中。
START:LEA SI,DATA ;SI—数据段首地址
MOV CX,200 ;CX—数据段长度为200
CLD ;清方向标志DF
LODSW ;AX—一个16位带符号位
MOV MAX,AX ;将数据送入MAX
MOV MIN,AX ;将数据送入MIN
DEC CX ;CX=CX-1
NEXT: LODSW ;取下一个16位带符号数
CMP AX,MAX ;与MAX单元进行比较
JG LARGER ;若大于则转LARGER
CMP AX,MIN ;否则再与MIN单元进行比较
JG SMALL ;若小于MIN内容则转入SMALL
JMP GOON ;否则就转到GOON
LARGER:MOV MAX,AX ;MAX=AX
JMP GOON ;
SMALL:MOV MIN,AX ;MIN=AX
GOON:LOOP NEXT,AX ;CX-1,若CX不等于0,则转NEXT
HLT
理解:为寻找最大数和最小数,先取出数据段中一个数作为标准,将其同时存入MIN和MAX,然后让其他得数与其比较,若大于则取代MAX中的数,若小于则取代MIN中的数。
7、3-45:比较两组输入端口的数据是否一致。主端口的首地址为MAIN_PORT,冗余端口的首地址为REDNUDANT_PORT,端口数目均为NUMBER。
MOV DX,MAIN_PORT ;DX—主端口地址指针
MOV BX,REDNUDANT_PORT ;BX—冗杂端口地址指针
MOV CX,NUMBER ;端口数
TOP:IN AX,DX ;AX—从主端口输入一个数据
XCHG AX,BP ;主端口输入的数据暂时存入BP
INC DX ;主端口地址指针加一
XCHG BX,DX ;DX—冗杂端口地址指针
IN AX,DX ;AX—从冗杂端口输入一个数据
INC DX ;冗杂端口地址指针加一
XCHG BX,DX ;两端口地址指针恢复到原来的寄存器中
CMP AX,BP ;比较两端口数据
LOOPE TOP ;若两端口数据相等且CX-1不等于0,则转TOP
JNZ PORT_ERROR ;若两端口数据不相等,则转PORT_ERROR
.
.
.
PORT_ERROR:…….
.
.
.
理解:LOOPE指令,先使CX内容减一,再根据CX的值和ZF的值决定是否循环,