8086 汇编 Int 21h 和扩展 ASCII 字符

dhc*_*ona 3 assembly ascii dos codepages x86-16

我需要一些作业帮助。我需要处理 ASCII 格式的纯文本文件并返回每个代码存在多少个字符(有多少个 a、有多少个 b 等)。现在它几乎完美地工作了。

\n\n

我现在遇到的问题是,如果文件上有扩展 ASCII 字符,当我使用 3fh 服务中断时,它不能很好地读取它们。

\n\n

例如,如果文件具有 \xc3\xa9(ascii 代码 130),则它将读取 \xc3\x9f(ascii 代码 225)。恐怕我错误地使用了中断,但我不知道该怎么做,所以这里的一点帮助将不胜感激。调试也没有帮助,因为中断执行得很好,没有错误,它只是返回缓冲区中的错误值。

\n\n

这是我用来读取文件的确切代码。我有前一个中断的句柄。

\n\n
      xor ax,ax\n      lea dx, buffer        \n      mov ah,3fh            \n      mov bx,handle         \n      mov cx,4096           \n      int 21h               \n
Run Code Online (Sandbox Code Playgroud)\n\n

谢谢!

\n\n

编辑

\n\n

我发现了问题,但不知道如何解决。结果,读取为 225 的字符不是 \xc3\xa9,而是 \xc3\xa1。根据我找到的每个 ASCII 表,\xc3\xa1 的代码应该是 160...但在 Unicode 中它是 225...这很奇怪,因为我特别告诉记事本将其保存为 ANSI,而不是 ASCII。 ..

\n

Ray*_*hen 5

您正在混淆代码页。

\n\n

MS-DOS 使用代码页 437,其中 \xc3\xa9 是代码 130。但是 ANSI 模式下的记事本使用代码页 1252,其中 \xc3\xa9 是代码 233。

\n\n

ASCII 只定义到 127,因此不存在 130 或 160 的 ASCII 图表。扩展 ASCII 没有标准化,因此不同的人以不同的方式扩展它。特别是,MS-DOS 和 Windows 使用不同的代码页,这些代码页实际上是不同的扩展 ASCII 表。

\n\n

如果您要使用 MS-DOS 来操作文件,则使用代码页 437。如果您要使用 Windows 来操作文件,则使用代码页 1252。(或者更好,使用 Unicode .)

\n\n

但是你无法让一个文件在 MS-DOS 和 Windows 中得到相同的解释,就像你无法写一本可以在英语和法语中得到相同解释的书一样。

\n