汇编:程序输出特殊的ASCII字符

时间:2017-04-11 01:38:06

标签: assembly masm

我需要帮助在MASM中编写一个程序,要求用户输入和输出ASCII特殊字符。例如,如果用户写道:

hello \01 i missed you \03.

它将输出为:

hello ☺ i missed you ♥.

我知道要打印笑脸,我可以使用以下代码:

MOV AH, 6
MOV DL, 1; print ☺
INT 21H

但是当用户输入\01时,我不知道如何自动执行此操作。任何帮助都将很高兴。

1 个答案:

答案 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语法规则以获取灵感。)

首先可能首先使用字符串替换函数,然后编写触发序列检测器,然后编写值的解析器(如果可能的话将它们写为单独的函数+在移动下一个主题之前调试/验证它们),然后将它们组合成完整的解决方案。