实例4 secret1.exe
MOV AH,0A
INT 21
系统调用,输入一个字符串,(加上最后的回车也是一个字符)长度不超过0A,即10。所以最多只能输入9个字符。
DS:0000用来存储字符串的长度,DS:0001用来存储输入字符串的真实长度,即CL用来存储字符串的长度。从DS:0002开始才用来存储输入的字符串,所以SI用来存储输入字符串首字符的地址。DI存储的是提示正确信息字符串的首字符的地址。
JNZ(或JNE)(jump if not zero, or not equal),汇编语言中的条件转移指令。结果不为零(或不相等)则转移。
CL用于存储字符串的真实长度,每输入正确一个字符,就将其减一,若还未减到零,则说明还没有输入全部的字符,则要进入循环:在提示正确输入的信息字符串中取下一位字符,将其与输入字符串中的下一位字符比较ASCII码值,若不相等则跳到0036提示输入错误,然后顺序往下执行,让BX加一,控制输入错误的次数不超过3次。
由分析可知:
程序想让我们输入的字符串其实是提示正确输入信息字符串的前9位的ASCII码加一以后对应的字符串。可输入1到9位字符,答案有9种。
只输入一个字符z或者zp、zpv、zpv!等也会直接提示输入正确。这是因为控制循环的因子CL是用户所输入的字符串的长度,只要输入的字符串中的字符的ASCII码依次是提示信息字符串ASCII码加一的结果即可。
总结:
看到看不懂的代码,应该去上下文找寻相关联系,思考它的用意。知道它是什么目的之后就容易理解了。