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

Assembly: Program outputs special ASCII characters

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

hello  i missed you .

它将输出为:

hello ☺ i missed you ♥.

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

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

但我不知道如何在用户输入时自动执行 。如有任何帮助,我们将不胜感激。

如果您通过 DOS 服务读取输入,则 "" 被编码为三个字节:92、48、49(如果您不明白这些值的来源,请检查 ASCII table来自).

所以你需要用值为 1 的单个字节替换字符串中的这三个字节,并将字符串的剩余部分移动两个字节 "left" 以压缩它(即字符串替换)。

现在要知道字符串的哪一部分应该用你必须编写的某种解析器来替换,它将检测 '\' 字符,在它之后读取一些 digits/chars (你必须定义什么是正确的语法,比如如果它总是在 \ 之后的两个字符形成十六进制字节值,即 "A" 会变成 J,或者最多三位数字 0- 9 形成十进制值,即 "2" 将变成 z),将那些 digits/chars 转换为字节值,并将该字节值用作该解析部分的替换。

此外,对于 "pro" 质量解决方案,请确保您的解析器足够健壮,能够承受 \<EOF> 等无效语法,并具有一些合理的语法,例如 \01 变成 [=19] =] 而不解析数字等...(请参阅 C/C++ string-literal-in-source 语法规则以获取灵感)。

所以可能首先从字符串替换函数开始,然后编写触发序列检测器,然后编写值解析器(如果可能,将它们写成单独的函数 + debug/validate 在继续下一个主题之前将它们写成),然后将它们组合成完整的解决方案。