我需要帮助在MASM中编写一个程序,要求用户输入和输出ASCII特殊字符。例如,如果用户写道:
hello \01 i missed you \03.
它将输出为:
hello ☺ i missed you ♥.
我知道要打印笑脸,我可以使用以下代码:
MOV AH, 6
MOV DL, 1; print ☺
INT 21H
但是当用户输入\01
时,我不知道如何自动执行此操作。任何帮助都将很高兴。
答案 0 :(得分:0)
如果您正在通过DOS服务读取输入,则"\01"
被编码为三个字节:92,48,49(如果您不了解这些值的来源,请查看ASCII表。)< / p>
所以你需要的是用值为1的单个字节替换字符串中的那三个字节,并将字符串的剩余部分移动两个字节&#34; left&#34;压缩它(即字符串替换)。
现在要知道字符串的哪一部分应该替换为你必须编写的某种解析器,它将检测'\'
字符,读取后面的一些数字/字符(你必须定义什么是正确的)语法,如果在\
形成十六进制字节值后总是两个字符,即。"\4A"
将变为J
,或者最多三位数0-9形成十进制值,即。"\122"
将变成z
),将这些数字/字符转换为字节值,并使用该字节值作为该解析部分的替代。
也适用于&#34;亲&#34;质量解决方案确保您的解析器足够强大,能够在\<EOF>
之类的无效语法中生存,并且具有一些合理的语法,例如\\01
转换为\01
而不解析数字等等...(请参阅C / C ++ string-literal-in-source语法规则以获取灵感。)
首先可能首先使用字符串替换函数,然后编写触发序列检测器,然后编写值的解析器(如果可能的话将它们写为单独的函数+在移动下一个主题之前调试/验证它们),然后将它们组合成完整的解决方案。