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

Assembly 8086汇编Int 21h和扩展ASCII字符,assembly,ascii,dos,x86-16,Assembly,Ascii,Dos,X86 16,我需要一些人帮我做作业。我需要处理一个ASCII格式的纯文本文件,并返回每个代码中有多少个字符(有多少个a,多少个b,等等)。它现在几乎可以完美地工作 我现在的问题是,如果文件上有扩展ASCII字符,当我使用3fh服务中断时,它不能很好地读取它们 例如,如果文件有一个ß(ascii代码130),它将读取一个ß(ascii代码225)。恐怕我使用的中断是错误的,但我不知道该怎么办,所以在此提供一点帮助将不胜感激。调试也没有帮助,因为中断执行得很好,没有错误,它只是返回缓冲区中的错误值 这正是我用来

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

我现在的问题是,如果文件上有扩展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…

您混淆了代码页

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

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

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


但是,您无法在MS-DOS和Windows中对文件进行相同的解释,就像您无法编写一本可以用英语和法语进行相同解释的书一样。

功能3fh不进行任何文件数据的解释或处理。如果有130,你应该得到130,如果有225,你应该得到225。你如何知道文件是否不包含字符225,而是包含字符130?您是否可以将该文件保存在不同的代码页/编码中?要么坚持使用ASCII(查找ASCII字符/代码列表),要么使用已知的编码(甚至可能是UTF8),要么不要尝试解释字符代码,只需对不同的字符/代码进行计数即可。@dhcarmona使用Notepad2这样的编辑器:-它允许您选择文本编码来保存和选择所需的任何编码,直到为该字符获得正确的代码为止。你的代码看起来不错。看看那篇文章:你正在混合两种编码。MS-DOS使用代码页437(其中,é是代码130),但ANSI模式下的记事本使用代码页1252(其中,é是代码233)。您能演示如何操作吗?如何选择要以编程方式使用的代码页?(特别针对方框图字符)如果要为MS-DOS程序编写
é
,请编写130。如果要为Windows程序编写
é
,请使用233。这个动作(决定是写130还是写233)就是“选择一个代码页”。代码页1252没有方框图字符。谢谢,但我实际上如何告诉我的程序使用该页?如果你想要代码页437,那么当你需要é时,写一个130。将数字130放入缓冲区并写入。这不是你“告诉”节目的东西。这只是你做的事。这就像问“我如何告诉我的程序用法语打印消息?”你就这么做了。在缓冲区里放一条法语信息,然后打印出来。我明白了。非常感谢你!