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

时间:2012-09-07 23:22:49

标签: assembly ascii dos x86-16

我需要一些帮助。我需要以ASCII格式处理纯文本文件,并返回每个代码的字符数(有多少个,有多少个,等等)。它现在几乎完美无缺。

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

例如,如果文件具有é(ascii代码130),则它读取ß(ascii代码225)。我担心我正在使用中断错误,但我不知道该怎么做,所以在这里给予一点帮助将不胜感激。调试也没有帮助,因为中断执行得很好而没有错误,它只是在缓冲区中返回错误的值。

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

      xor ax,ax
      lea dx, buffer        
      mov ah,3fh            
      mov bx,handle         
      mov cx,4096           
      int 21h               

谢谢!

修改

我发现了问题,但不知道如何解决它。事实证明,这个角色读作225不是é,而是á。根据我发现的每个ASCII表,á的代码应该是160 ...但它在Unicode中是225 ...这很奇怪,因为我特意告诉记事本将其保存为ANSI,而不是ASCII ...... / p>

1 个答案:

答案 0 :(得分:3)

您感到困惑的是代码页。

MS-DOS使用代码页437,其中é是代码130.但ANSI模式下的记事本使用code page 1252,其中é是代码233。

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

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

但是你无法在MS-DOS和Windows中获得相同的文件解释方式,就像你不能写一本可以用英语和法语解释相同的书一样。