微机原理黄冰版--作业答案 下载本文

MOV DI,0 ;目标串指针->DI SDCMP: MOV AL,SRCBUF[SI] CMP AL,0DH JZ NSEND

MOV DSTBUF[DI],AL ;不等于0DH,保存数据,修改SI、DI INC DI

NSEND: INC SI ;等于0DH,不保存数据,修改SI LOOP SDCMP MOV AH, 4CH INT 21H CODE ENDS END START

3.17 已知有n个元素存放在以BUF为首址的字节存储区中,试统计其中负元素的个数,画出程序框图,编写程序。

DATA SEGMENT

BUF DB 92H,12H,0F3H,23H,87H LEN EQU $-BUF DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN ;比较次数->CX MOV SI,0 ;字节存储区指针 MOV DL,0 ;负元素个数初始化 NEGCMP: MOV AL,BUF[SI] CMP AL,0 JNL C0GE

INC DL ;小于0,个数加1,指针加1 C0GE: INC SI ;不小于0,指针加1 LOOP NEGCMP MOV AH, 4CH INT 21H CODE ENDS END START

3.18 已知以BUF为首址的字存储区中存放着n个有符号的二进制数,试编写程序,将大于等于0的数送以BUF1为首址的字存储区中,将小于0的数送以BUF2为首址的字存储区中,并画出程序框图。

DATA SEGMENT

BUF DW 1212H,0FF12H,3434H,8989H,5656H,9090H LEN EQU ($ - BUF) / 2 BUF1 DW LEN DUP (?) BUF2 DW LEN DUP (?) DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN ;循环次数,即BUF的单元数 MOV BX,0 ;BUF指针初始化 MOV SI,0 ;BUF1指针初始化 MOV DI,0 ;BUF2指针初始化 CLOOP: MOV AX,[BX] ;BUF数据->AX CMP AX,0 JGE TO1

MOV BUF2[DI],AX ;AX<0,AX->BUF2,DI+2->DI,BX+2->BX INC DI

INC DI

JMP CONTINUE

TO1: MOV BUF1[SI],AX ;AX>=0,AX->BUF1,SI+2->SI,BX+2->BX INC SI INC SI CONTINUE:INC BX INC BX

LOOP CLOOP MOV AH, 4CH INT 21H CODE ENDS END START

3.19 已知在以BUF为首地址的字节存储区中,存放着一个以′$′作结束标志的字符串,试编写程序,在CRT上显示该字符串,并要求将小写字母以大写字母形式显示出来。画出程序框图。

DATA SEGMENT

BUF DB 'abCDalskdjf$' DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,0 ;BUF地址指针 ALOOP: MOV DL,BUF[SI] ;BUF数据->DL CMP DL,'$' ;DL='$',EXIT JE STOP CMP DL,5AH

JBE UPPER ;大写字母,打印输出,地址指针SI加1

SUB DL,20H ;小写字母,DL减20H后打印输出,地址指针SI加1 UPPER: MOV AH,02H INT 21H INC SI

JMP ALOOP STOP: MOV AH, 4CH INT 21H CODE ENDS END START

3.20 设有三个字节变量X、Y、Z,试找出X、Y有符号数中较大者送入Z中,编写程序。

推荐检测实例:-128和127 DATA SEGMENT X DB 0F0H Y DB 12H Z DB ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,X ;X->AL CMP AL,Y ;X ? Y JGE NEXT ;X>=Y,X->Z MOV AL,Y ;XZ NEXT: MOV Z,AL MOV AH, 4CH INT 21H CODE ENDS

END START

3.21 设在变量单元A、B和C中存放有三个数,若三个数都不为0,则求出三个数之和存入D中;若有一个为0,则将其他两个单元也清零,编写程序。

DATA SEGMENT A DB 0F0H B DB 12H C DB 22H D DW ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX CMP A,0 JZ STOP CMP B,0 JZ STOP CMP C,0 JZ STOP ;有一个为0,全部置0 MOV AH,0 ;否则作加法运算,放到D,注意加法运算结果为字 MOV BH,0 MOV AL,A MOV BL,B ADD AX,BX MOV BL,C ADD AX,BX MOV D,AX JMP STOP NEXT: MOV A,0 MOV B,0 MOV C,0 STOP: MOV AH, 4CH INT 21H CODE ENDS END START

3.22 试分析下列程序段,说明完成了什么操作?程序执行前后HEXNUM字节单元的内容是什么?

ASCNUM DB 41H HEXNUM DB ?

MOV AH,ASCNUM CMP AH,39H JBE NEXT SUB AH,7

NEXT:SUB AH,30H

MOV HEXNUM,AX HLT 解:

'0'~'9'与'A'~'F'组成的一位十六进制数的ASCII码转换为一位十六进制数。 程序执行前:[HEXNUM] = ? 程序执行后:[HEXNUM] = 0AH

3.23 在数据区STR1单元开始存放一长度为1~256个字符的字符串。要求对该字符串中每个字符在最高位配上一个偶校验位(即保持一字节数中1的个数为偶数),并存回到原单元中。

DATA SEGMENT

STR1 DB 'abcdefghi' LEN1 EQU $-STR1 DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN1 MOV SI,0

ALOOP: MOV AL,STR1[SI]

OR AL,0 ;与0相或,不影响原来的值

JP CONTINUE ;若1的个数为偶数,不做任何处理 OR AL,80H ; 若1的个数为偶数,最高位置1 MOV STR1[SI],AL CONTINUE:INC SI

LOOP ALOOP STOP: MOV AH, 4CH INT 21H CODE ENDS END START

3.24 已知在数据区中DATA1和DATA2开始分别存放N个字节数据,编制程序检查两数据块中的数据是否相同。若完全一致,则将标志单元FLAG置FFH,否则置0。并将第一次出现的不同数据的地址分别存放ADR1和ADR2单元中,编写程序。

;假设为按顺序比较,非无序比较 DATA SEGMENT

DATA1 DB 22H,33H,44H,55H DATA2 DB 22H,33H,44H,66H N EQU $-DATA2 FLAG DB ? ADR1 DW ? ADR2 DW ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,N MOV SI,0 MOV DI,0

ALOOP1: MOV AL,DATA1[SI] CMP AL,DATA2[DI] JNZ NE12 INC SI INC DI

LOOP ALOOP1 MOV FLAG,0FFH

JMP EXIT NE12: MOV FLAG,0 MOV ADR1,SI MOV ADR2,DI EXIT: MOV AH, 4CH INT 21H