8086 Assembly Int 21h и разширени ASCII знаци

Имам нужда от помощ с една задача. Трябва да обработя обикновен текстов файл в 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, не е é, а á. Кодът за á трябва да е 160 според всяка ASCII таблица, която намерих... но е 225 в Unicode... Което е странно, тъй като изрично казвам на Notepad да го запази като ANSI, а не ASCII...


person dhcarmona    schedule 07.09.2012    source източник
comment
Използвате MS-DOS? Леле ти от миналото ли си?   -  person Michael-O    schedule 08.09.2012
comment
Всичко над 127 не е ASCII....   -  person dda    schedule 08.09.2012
comment
@Michael-O да, това е курс по сглобяване.   -  person dhcarmona    schedule 08.09.2012
comment
@dda Знам, това е разширен ASCII, за символи на езици, различни от английски. Но все пак, ако въведа ръчно ALT+130 за прекъсване 21/08h, то разпознава é.   -  person dhcarmona    schedule 08.09.2012
comment
Функцията 3fh не извършва интерпретация или обработка на файлови данни. Ако има 130, трябва да получите 130, ако има 225, трябва да получите 225.   -  person Alexey Frunze    schedule 08.09.2012
comment
Как да разберете дали файлът не съдържа char 225, а вместо това 130? Може ли да запазите този файл в друга кодова страница/кодиране?   -  person Sedat Kapanoglu    schedule 08.09.2012
comment
@AlexeyFrunze Тогава може би записвам текстовия файл погрешно... Използвам добрия стар Windows notepad и го записвам във формат ANSI. Грешно ли го правя?   -  person dhcarmona    schedule 08.09.2012
comment
@ssg Знам, че има 130, защото използвах ALT+130, за да го напиша. Въпреки че е много вероятно да греша, защото признавам, че не знам почти нищо за кодова страница/кодиране. Всичко, което знам е, че използвам Notepad и го записвам като ANSI кодиране.   -  person dhcarmona    schedule 08.09.2012
comment
Или се придържайте към ASCII (намерете списък с ASCII знаци/кодове) или използвайте познати кодировки (може би дори UTF8), или не се опитвайте да интерпретирате кодовете на знаците, просто пребройте различни знаци/кодове, тъй като от вас се иска само да ги преброите.   -  person Alexey Frunze    schedule 08.09.2012
comment
@AlexeyFrunze Чувствам се много изкушен да направя каквото казвате и просто да ги преброя, дори ако програмата отпечата ß вместо é... Учителят обаче поиска да покажем правилния знак. Използвам таблицата, която намерих в link и няколко други сайта, и както казах, когато вляза символа чрез всяко друго прекъсване го открива правилно...   -  person dhcarmona    schedule 08.09.2012
comment
@dhcarmona използва редактор като Notepad2: flos-freeware.ch/notepad2.html - тя ви позволява да изберете кодиране на текста, за да го запазите, и да изберете всяко кодиране, което искате, докато получите правилния код за този знак. вашият код изглежда добре. и вижте тази статия: joelonsoftware.com/articles/Unicode.html   -  person Sedat Kapanoglu    schedule 08.09.2012
comment
Редактирах въпроса с нещо, което намерих...   -  person dhcarmona    schedule 08.09.2012
comment
Смесвате две кодировки. MS-DOS използва кодова страница 437 (където é е код 130), но Notepad в режим ANSI използва кодова страница 1252 (където é е код 233).   -  person Raymond Chen    schedule 08.09.2012
comment
@RaymondChen О, разбирам... Да, току-що последвах предложението на ssg и използвах Notepad2, за да запазя файла в DOS-OEM кодиране. Сега работи с моята програма за асемблиране, но не мога да видя текста на Windows. Изглежда, че не мога да получа и двете, но се чувствам по-добре сега, когато знам какво се случва. Благодаря много на всички вас!!   -  person dhcarmona    schedule 08.09.2012
comment
Ако искате текстът да се вижда в Windows, тогава трябва да използвате кодова страница на Windows. Това е като да кажеш чат на някой, който говори френски, така че той да си помисли, че говориш за котка. Ако искате да ви разберат, трябва да говорите френски.   -  person Raymond Chen    schedule 08.09.2012
comment
@RaymondChen Вероятно трябва да направите отговора въз основа на коментарите.   -  person Alexey Frunze    schedule 08.09.2012
comment
@dhcarmona, къде е връзката между DOS и асемблирането? Няма такъв. ASM съществува много преди DOS.   -  person Michael-O    schedule 08.09.2012
comment
@dhcarmona Няма такова нещо като разширен ASCII. Всичко с кодова точка над 127 не е ASCII.   -  person dda    schedule 09.09.2012


Отговори (1)


Вие обърквате кодовите страници.

MS-DOS използва кодова страница 437, където é е код 130. Но Notepad в режим ANSI използва кодова страница 1252, където é е код 233.

ASCII се дефинира само до 127, така че няма такова нещо като ASCII диаграма за 130 или 160. Разширеният ASCII не е стандартизиран, така че различните хора го разширяват по различни начини. По-специално, MS-DOS и Windows използват различни кодови страници, които на практика са различни разширени ASCII таблици.

Ако ще използвате MS-DOS, за да манипулирате вашия файл, тогава използвайте кодова страница 437. Ако ще използвате Windows, за да манипулирате вашия файл, тогава използвайте кодова страница 1252. (Или по-добре, използвайте Unicode.)

Но не можете да накарате файл да се интерпретира еднакво както в MS-DOS, така и в Windows, по същия начин не можете да напишете книга, която може да се интерпретира еднакво и на английски, и на френски.

person Raymond Chen    schedule 08.09.2012
comment
Можете ли да покажете как се прави това? Как мога да избера коя кодова страница да използвам програмно? (специално за знаци за рисуване на кутия) - person ori6151; 19.10.2019
comment
Ако искате да напишете é за MS-DOS програма, напишете 130. Ако искате да напишете é за Windows програма, използвайте 233. Това действие (решаване дали да напишете 130 или 233) е избор на кодова страница. Кодова страница 1252 няма знаци за чертане на кутия. - person Raymond Chen; 19.10.2019
comment
Благодаря, но как всъщност да кажа на програмата си да използва тази страница? - person ori6151; 19.10.2019
comment
Ако искате кодова страница 437, тогава напишете 130, когато имате нужда от é. Поставете числото 130 в буфера си и го напишете. Това не е нещо, което казвате на програмата. Това е просто нещо, което правите. Все едно да питате Как да кажа на моята програма да отпечатва съобщения на френски? Просто го направи. Поставете съобщение на френски в буфера и го отпечатайте. - person Raymond Chen; 19.10.2019
comment
о разбирам го Много благодаря! - person ori6151; 19.10.2019