首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2013-01-25 
编制一个将N个ASCII字符进行偶校验的源程序.设N8,用E命令在DS:1000—1007单元放8个ASCII字符:31,32,33,34,

编制一个将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  

热点排行