用寄存器间接寻址的方法可以对数组进行很方便的存取操作。 如例3,将字符数组的地址变量赋值给bx,只要增加bx的值的大小就可以顺序取出相应地址里存放的字符,再将bx所指向的地址里的值赋值给另外一个寄存器cx,再对cx中存放的值进行大小比较,判断该字符是否属于数字,进而确定是否对其进行简单地加密。
;eg3.将字符串string中非数字的所有字符加密。(该程序写错了!!!) assume cs:code,ds:data data segment string db '123Hello!' data ends code segemnt start: mov ax,data mov ds,ax mov bx,offset string x1: mov cl,[bx] ;cl相当于一个临时变量,专门用于比较大小和重新赋值操作 cmp cl,'0' jb x2 ;若该字符的ASCII码值小于数字0的ASCII码值,则跳到x2 cmp cl,'9' ja x2 ;若该字符的ASCII码值大于数字9的ASCII码值,则跳到x2 ;这里忽视了如果是数字的话,程序会直接顺序往下执行,导致数字字符也会被加密 x2: inc cl ;将该非数字字符的ASCII码值加1 mov [bx],cl ;将加密完的字符重新写回原来的地址 inc bx ;移到下一个字符 cmp bx,9 ;判断是否超过字符串本身长度 jb x1 ;重入循环 code ends end start结果截图: 总结: 跳出自己看自己的时候,觉得很好笑。人,好像无论什么时候都是以自我为中心的,仿佛这个世界上的其他人都是为自己存在的。我不是这个客观世界的中心,我只是我的世界的中心,两个世界交叠着,混淆视听,迷惑人心。如果沉迷于自己的世界,难免会与这个世界脱节,迷失掉自己,离最初的真我越来越远。我越来越理解这一点了,好像活得更自在一点了呢。干巴爹!!!
纠错: 今天上课的时候才发现代码写错了,题目要求的是将非数字的字符加密,而我的结果却是将全部字符都加密了。居然没发现,真是无语了。。。。。
错误原因: 代码是顺序执行的。如果是数字的话,程序也会顺序往下执行到x2中的语句,也就意味着不管判断结果如何都会对字符进行加密。所以判断字符类型的结果是要保证顺序往下执行被加密的字符是非数字,而数字字符将跳过加密过程,直接进入下一轮循环。 修改过后的代码:
assume cs:code,ds:data data segment string db '123Hello!' data ends code segment start: mov ax,data mov ds,ax mov bx,offset string x1: cmp bx,9 ;每次判断字符类型之前先判断一下循环因子 jae exit mov cl,[bx] cmp cl,'0' jb x2 cmp cl,'9' jbe next ;关键点 让落在['0','9']范围内的字符跳过加密过程x2 x2: inc cl mov [bx],cl next: inc bx jmp x1 exit: code ends end start截图: 总结: 始终要牢记程序是顺序执行的。有时头脑发昏的话,可以画流程图来辅助理清思路。 ε=(´ο`*)))唉,,,,,
