NO. 0,3,6,9:
1. 下列变量各占多少字节? A1 DW 23H,5876H A2 DB 3 DUP(?),0AH,0DH, ‘$’ A3 DD 5 DUP(1234H, 5670H) A4 DB 4 DUP(3 DUP(1, 2,’ABC’)) 答:A1 占4 个字节 A2 占6 个字节 A3 占40 个字节 A4 占60 个字节
2. 编程序统计N个学生的《微机原理》成绩,分别归类90 分~99 分,80 分~ 分,70 分~79 分,60分~69 分及60 分以下,并将各段的人数送入内存单元中。 答:设学生人数为字节,成绩为压缩BCD 码,且都是合法的。 DATA SEGMENT
BUFF DB XXH,……. ANUM EQU $-BUFF ;总人数 SNUM DB 5 DUP(0) ;存放各类成绩统计结果 BUFF1 DB ANUM DUP(0) ;存放60 分以下成绩 BUFF2 DB ANUM DUP(0) ;存放60 分~69 分成绩 BUFF3 DB ANUM DUP(0) ;存放70 分~79 分成绩 BUFF4 DB ANUM DUP(0) ;存放80 分~ 分成绩 BUFF5 DB ANUM DUP(0) ;存放90 分以上成绩 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS: DATA,ES: DATA START: MOV AX, DATA
MOV DS,AX MOV ES,AX
MOV CL,ANUM ;取学生人数 MOV CH,0 MOV BH,0
MOV SI,OFFSET BUFF MOV DI,OFFSET SNUM D1: MOV AL,[SI]
CMP AL,60H JAE NEXT1 ;大于等于60,转next1 MOV BL,[DI]
MOV BUFF1[BX],AL INC BYTE PTR [DI] JMP NEXT5
NEXT1: CMP AL,69H
JA NEXT2 ;大于69转next2 MOV BL,[DI+1]
MOV BUFF2[BX],AL
INC BYTE PTR [DI+1] JMP NEXT5
NEXT2: CMP AL,79H
JA NEXT3 ;大于79转next3 MOV BL,[DI+2]
MOV BUFF2[BX],AL INC BYTE PTR [DI+2] JMP NEXT5
NEXT3: CMP AL,H
JA NEXT4 ;大于转next4 MOV BL,[DI+3]
MOV BUFF3[BX],AL INC BYTE PTR [DI+3] JMP NEXT5
NEXT4: MOV BL,[DI+4]
MOV BUFF4[BX],AL INC BYTE PTR [DI+4] NEXT5: INC SI
LOOP D1
MOV AH,4CH INT 21H CODE ENDS END START
3.在附加段中有一个首地址为BUF的未经排序的字数组。在数组的第一个字中存放该数组的长度N,数组的首地址已存放在DI寄存器中,AX寄存器中存放一个数M。要求编制一程序,在数组中查找该数,若找到此数,则把它从数组中删除。 答:DATA SEGMENT
BUF DW N,**H,**H,……**H ;假设一个数组 S_NUM EQU M ;查找的数M DATA ENDS CODE SEGMENT ……
DEL_M PROC NEAR CLD
PUSH DI
MOV CX,ES:[DI] ;取元素个数 ADD DI,2
REPNE SCASW ;串扫描,查找数是否在串中 JE DELETE ;若在,则转去删除 POP DI ;若不在,则结束 JMP SHORT EXIT DELETE:JCXZ DEC_CNT
NEXT_EL:MOV BX,ES:[DI] ;后面的数依次往前移 MOV ES:[DI-2],BX
ADD DI,2
LOOP NEXT_EL DEC_CNT:POP DI
DEC WORD PTR ES:[DI] EXIT:RET DEL_M ENDP ......
NO. 1,4,7:
1.假设程序中的数据定义如下: PAR DW ?
PNAME DB 16 DUP(?) COUNT DD ?
PLENTH EQU $-PAR
求PLENTH 的值为多少?表示什么意义?
答:PAR 的偏移地址为0,PLENTH 当前偏移地址$=2+16+4=22, $-PAR=22,故PLENTH 的值为22。
若在PLENTH 所在行有变量定义,则$表示该变量的偏移地址,即$表示PLENTH 所在行的当前偏移地址。故PLENTH 表示从当前行到PAR 之间定义的变量所占的字节个数。 2. 在附加段有一个数组,首地址为BUFF,数组中第一个字节存放了数组的长度。编一个程序在数组中查找0,找到后把它从数组中删去,后续项向前压缩,其余部分补0。 答:DATA SEGMENT
BUFF DB 10, 1,0,2,3,4,0,5,6,7,0 ;10 个数 M EQU 0 DATA ENDS CODE SEGMENT
ASSUME CS:CODE, ES:DATA, DS:DATA START: MOV AX, DATA ; 初始化ES,DS
MOV ES, AX MOV DS, AX MOV AL, M ; 关键字M 存入AL MOV DI, OFFSET BUFF MOV CL, [DI] ; 数组长度存入CX MOV CH, 0 INC DI ;指向数组起始地址 CLD ;清方向标志 L1: REPNE SCASB ;重复搜索关键字
JNZ STOP ; 未找到,转STOP 结束 JCXZ STOP ; 最后一个数是M,转STOP PUSH DI ;关键字下一单元地址和循 PUSH CX ;环次数入栈保护 DEL: MOV BL, [DI] ; 前移,末尾补0
MOV [DI-1], BL INC DI LOOP DEL
MOV BYTE PTR[DI-1], 0 POP CX ; 恢复CX,DI POP DI
DEC DI ; 由于REPNE SCASB 已自动加1 JMP L1
STOP: MOV AH, 4CH
INT 21H CODE ENDS END START
3.设有数组X和Y。X数组中有X1,….,X10;Y数组中有Y1,…,Y10。试编程计算Z1=X1+Y1,Z2=X2+Y2,Z3=X3-Y3,Z4=X4-Y4,Z5=X5-Y5,Z6=X6+Y6,Z7=X7-Y7,Z8=X8-Y8,Z9=X9+Y9,Z10= X10+Y10,结果存入Z数组。 答:DATA SEGMENT
X DW X1,X2,X3,X4,……,X10 ;假设X数组
Y DW Y1,Y2,……………,Y10 ; 假设Y数组 Z DW Z1,Z2,…………….,Z10 ; 假设Z数组
FLAG_MEM DW 00DCH ;假设做十次操作的10个标志位,低位开始0为
加法1为减法,最高6位没意义
DATA ENDS CODE SEGMENT
ASSUME CS:CODE, DS:DATA START:PUSH DS SUB AX,AX ;AX清0 PUSH AX MOV AX,DATA MOV DS,AX MOV BX,0 MOV CX,10 MOV DX,FLAG_MEM NEXT:MOV AX,X[BX] SHR DX,1 JC SUBTRACT ADD AX,Y[BX] JMP SHORT RESULT SUBTRACT:SUB AX,Y[BX] RESULT:MOV Z[BX],AX ADD BX,2
LOOP NEXT RET
CODE ENDS END START
NO. 2,5,8:
1. 对于下面的数据定义,各条MOV 指令执行后,有关寄存器的内容是什么?
DA1 DB ?
DA2 DW 10 DUP(?) DA3 DB ‘ABCD’ MOV AX, TYPE DA1 MOV BX, SIZE DA2 MOV CX, LENGTH DA3 答:AX=1,BX=20,CX=1
2.设ARRAY是10个元素的数组,每个元素是8位数据。试用子程序计算数组元素的检验和,并将结果存入变量result中。所谓“校验和“是指不记进位的累加,常用于检查信息的正确性。
答:DATA SEGMENT
COUNT EQU 10 ;数组元素个数 ARRAY DB **H,**H,**H,……**H ;假设一个数组 RESULT DB ? ;校验和 DATA ENDS CODE SEGMENT MAIN PROC FAR
……
START:MOV BX,OFFSET ARRAY MOV CX,COUNT CALL CHECKSUM ;调用子过程 MOV RESULT,AL MAIN ENDP
CHECKSUM PROC ;子过程 XOR AL,AL SUM:ADD AL,[BX]
INC BX LOOP SUM RET
CHECKSUM ENDP CODE ENDS END START
3.现有一个以“$”结尾的字符串,要求剔除其中的空格字符,并将后续字符前移一个字符位置。
答:DATA SEGMENT
STRING DB ‘THIS IS A STRING!’ , ’$’ ;假设一个字符串 DATA ENDS CODE SEGMENT
……
MOV SI, OFFSET STRING
OUTLP: CMP BYTE PTR[SI],’$’ ;外循环,先判断后循环 JZ DONE ;为0结束
CMP BYTE PTR [SI] , ’ ‘ ;检测是否为空格
JNZ NEXT ;不是则继续循环 MOV DI,SI ;若是,进入删除空格分支,该分支是循环程序段 INLP :INC DI MOV AL,[DI] ;前移一个位置 MOV [DI-1],AL CMP BYTE PTR [DI],’$’ ;内循环,先循环后判断 JNZ INLP JMP OUTLP NEXT :INC SI ;继续对后续字符进行判断处理 JMP OUTLP
DONE :EXIT CODE ENDS END START
;结束