编制一个将N个ASCII字符进行偶校验的源程序.
设N=8,用E命令在DS:1000—1007单元放8个ASCII字符:31,32,33,34,41,42,43,44
参考程序:
LEASI,[1000]
LEABX, [1010]
MOVCX,8
AGAIN:LODSB
ANDAL,AL
JPENEXT(0417)
ORAL,80
MOV[BX],AL
INCBX
JMPLP1(041A)
NEXT:MOV[BX],AL
INCBX
LP1:DECCX
JNZAGAIN(040B)
RET
要求可以要debug调试!!!
[解决办法]
LEA SI, [1000];SI指向字符串的第一个字符
LEA BX, [1010];BX指向缓冲区用来存放做好偶校验的字符
MOV CX, 8;设置循环次数
AGAIN: LODSB;SI指向读入累加器
AND AL, AL;累加器AL与运算不变,设置标志位,当操作结果为偶数的时候1
JPE NEXT(0417);如果为偶数个1跳转到next,奇数个1顺序执行
OR AL, 80;将最高位置1
MOV [BX], AL;将修改后AL中字符放到bx指向的缓冲区中
INC BX;BX指向下一个地址
JMP LP1(041A);跳到计数器位置准备下一次循环
NEXT: MOV [BX], AL;将AL中字符放到bx指向的缓冲区中
INC BX;BX指向下一个地址
LP1: DEC CX;计数器减1
JNZ AGAIN(040B);不为0返回重复循环
RET
这个代码只能校验低7位,最高位做校验位
[解决办法]
唉,这孩子,不能理解还能做出来:
DATA SEGMENT
TABLE1 DB 1,2,3,4,5,6,7,8
TABLE2 DB 8 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA SI, TABLE1
LEA BX, TABLE2
MOV CX, 8
AGAIN: LODSB ;将字符取到AL中,SI会自动增1
AND AL, AL ;执行与操作,目的是自身相与影响各个状态标志
JPE NEXT ;如果状态标志位P=1则跳转到next(P=1表示结果的第8位中含有偶数个1。此处,若有偶数个1则跳转到next)
OR AL, 80H ;否则,将AL中的数据最高位置1(即P=0,有奇数个1,要凑成偶数个)
MOV [BX], AL ;存结果
;INC BX
JMP LP1
NEXT: MOV [BX], AL;直接存结果
LP1:INC BX ;地址增大
LOOP AGAIN ;循环
MOV AH,4CH
INT 21H
CODE ENDS
END START