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

组制一个将N个ASCII字符进行偶校验的源程序

热度:10083   发布时间: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
  相关解决方案