微型计算机原理与接口技术

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的值决定是否循环,


你可能感兴趣的:(微型计算机原理与接口技术)