10. 将BUFFERS中N个字按相反顺序传递到BUFFERT中。 解:
LEA SI,BUFFERS LEA DI,BUFFERT MOV CX,N ADD DI,N ADD DI,N SUB DI,2 L1:
MOV AX,[SI] MOV [DI],AX ADD SI,2 SUB DI,2 LOOP L1
11. 数组ARRAY中存放有一组字型数据,前两个字节存放数据长度(5的倍数)。为给这
个数组中的数据进行加密保护,每5个数据取出一个数据进行加密处理:奇数位进行取反,偶数位不变,例如对数据0110 1100 1011 0001B加密后变成1100 0110 0001 1011B,编写加密程序encrpytion 和解密程序 unencrpytion 。
解:约定从第一个数据开始,每5个数据为一组,每组中的第一个数据采取加密/解密处理。由于加密算法采用的是取反操作,解密算法也采用取反操作,因此解密和解密算法是同一个程序。
ENCRPYTION PROC NEAR
LEA SI,ARRAY
XOR DX,DX MOV AX,[SI] MOV BX,5 DIV BX MOV CX, AX ADD SI, 2
L1:
- 28 -
MOV AX, [SI] XOR AX,0AAAAH MOV [SI], AX ADD SI,10 LOOP L1 RET
ENCRPYTION ENDP
13. 设BUF中存放有N个无符号数(或有符号数),编程实现求它们的最小值(存入AX)
和最大值(存入DX)。
解:BUF存放有N个无符号数的程序如下: MOV CX,N LEA SI,BUF MOV AX,[SI] MOV DX,AX ADD SI,2 L1:
CMP AX,[SI] JBE NOCHG1 XCHG AX,[SI] NOCHG1:
CMP DX,[SI] JAE NOCHG2 XCHG DX,[SI] NOCHG2:
ADD SI,2 LOOP L1
如果BUF中存放的是有符号数,则只需要将程序中的两行内容修改:
JBE NOCHG1 JAE NOCHG2
改成:JLE NOCHG1 改成:JGE NOCHG2
- 29 -
14. 设BUFFER中存放有N个无符号(第1个字节存放缓冲区的长度),编程实现将其中的
0元素抹去,并更新其长度。
解:设BUFFER中存放的是字节型数据。采用双指针方法:SI为读指针,DI为写指针,从低地址开始,内存中读出一个字节,如果不为0,则写入内存;如果为0,则不进行写操作。
LEA SI, BUFFER XOR CX,CX MOV CL, [SI] INC SI MOV DI, SI XOR BH,BH XOR AL,AL L1:
CMP [SI],AL JZ L2 MOV BL,[SI] MOV [DI],BL INC DI INC BH L2:
INC SI LOOP L1
MOV BUFFER,BH
16. 编写一个子程序实现统计AL中1的个数,然后检测出字节型缓冲区BUF中0和1个
数相等的元素个数。
解:统计AL中1的个数,只需将AL右移,移出的一位内容进行累加,子程序为: COUNTBYTE PROC NEAR PUSH AX PUSH CX
- 30 -
MOV CX,8 XOR BL,BL
COU1:
SHR AL,1 ADC BL,0 LOOP COU1 POP CX POP AX RET COUNTBYTE ENDP
在此基础上,可以检测出字节型缓冲区BUF中0和1个数相等的元素个数,即一个字
节中有4个1。设BUF中有N个字节型数据,结果保持在BH中。
MOV CX,N LEA SI, BUF XOR BH,BH L1: MOV AL,[SI]
CALL COUNTBYTE CMP BL,4 JNZ L2 INC BH L2: INC SI
LOOP L1
19. 在缓冲区BUFFER中,第1个字节存放数组的长度(<256),从第2个字节开始存放字
符的ASCII码,编写子程序完成在最高位给字符加上偶校验。 解:STACK SEGMENT STACK 'STACK' DW 100H DUP(?) TOP LABEL BYTE
STACK ENDS
- 31 -