当前位置: 代码迷 >> 汇编语言 >> 编制一个将N个ASCII字符进行偶校验的源程序.解决办法
  详细解决方案

编制一个将N个ASCII字符进行偶校验的源程序.解决办法

热度:9351   发布时间:2013-02-26 00:00:00.0
编制一个将N个ASCII字符进行偶校验的源程序.
设N=8,用E命令在DS:1000—1007单元放8个ASCII字符:31,32,33,34,41,42,43,44
参考程序:

LEA SI, [1000]
LEA BX,      [1010]
MOV CX, 8
AGAIN: LODSB
AND AL, AL
JPE NEXT(0417)
OR AL, 80
MOV [BX], AL
INC BX
JMP LP1(041A)
NEXT: MOV [BX], AL
INC BX
LP1: DEC CX
JNZ AGAIN(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  
  相关解决方案