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
- 30 -
DATA SEGMENT BUFFER DB 3 DB 'ABC'
DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,STACK MOV SS,AX LEA SP,TOP MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI,BUFFER XOR CX,CX MOV CL,[DI] INC DI
CALL SETEVEN MOV AH,4CH MOV AL,0 INT 21H SETEVEN PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DI SETEVEN1:
MOV AL,[DI] CALL COUNTBYTE
- 31 -
;首字节为字符串长度 ;字符串
;返回DOS
;加偶校验子程序
AND BL,01H JZ SETEVEN2 OR AL,80H MOV [DI],AL SETEVEN2: INC DI
LOOP SETEVEN1 POP DI POP CX POP BX POP AX RET SETEVEN ENDP COUNTBYTE
PROC NEAR
PUSH AX PUSH CX MOV CX,8 XOR BL,BL
COU1:
SHR AL,1 ADC BL,0 LOOP COU1 POP CX POP AX RET COUNTBYTE ENDP
CODE ENDS END START
20. 编写程序完成求多位数(N个字)的绝对值。
- 32 -
21. 已知斐波那契数列的定义为:F1数列前n项的子程序。
?1,F2?1,Fi?Fi?1?Fi?2(i?3),编写求该
解:设奖斐波那契数列存放在字变量RESULT中。在数据段中定义 RESULT DW 100H DUP(?)
在代码段中编写子程序 FIBONACCI
PROC NEAR
XOR DI,DI
MOV RESULT[DI],1
;前两个数为1
MOV RESULT[DI+2],1
ADD DI,4 MOV CX,N
L1:
MOV AX, RESULT[DI-4] ADD AX, RESULT[DI-2] MOV RESULT[DI],AX ADD DI,2 LOOP L1 RET FIBONACCI ENDP
22. 编写程序实现循环显示10条信息,保存每条信息的变量分别为INFOM1~INFORM10。 解:在数据段中定义变量:
TABLE DW INFORM1, INFORM2, INFORM3, INFORM4, INFORM5 DW INFORM6, INFORM7, INFORM8, INFORM9, INFORM10 在代码段中编写程序段:
MOV XOR MOV MOV
CX,10 SI,SI
DX,TABLE[SI] AH,9
L1:
- 33 -
INT ADD CALL LOOP
21H SI,2 WAIT L1
这里,WAIT为延时子程序,用于在显示信息之间的停顿。
23. 编写程序实现将包含20个数据的数组ARRAY分成两个数组:正数数组ARRAYP和负数数组ARRAYN,并分别将这两个数组中数据的个数显示出来。
解:先编写一个子程序DISPALD,完成以3位十进制数形式显示出AL的内容。
DISPALD PROC NEAR
PUSH AX PUSH CX PUSH DX XOR AH,AH MOV CL,100 DIV CL PUSH AX MOV DL,30H ADD DL,AL MOV AH,2 INT 21H POP AX MOV AL,AH XOR AH,AH MOV CL,10 DIV CL PUSH AX MOV DL,30H ADD DL,AL MOV AH,2
- 34 -