Sadda.ru Ironetcart Андроид Ассемблер MASM32 Linux Все статьи Table of Contents


 

API-функция CharToOem и строки ассемблера

  Макс Петров май 2013

      Windows (русскоязычная) использует кодировку Win1251, консоль - DOS. Поскольку ассемблерную программу мы набираем все же под Windows, определяемые в ней символьные строки на кириллице в память компьютера попадут в кодировке Win1251 и в консоли будут выглядеть нечитаемо. API-функция Windows CharToOem предназначена для перевода кодировки строки Win1251 в DOS, ее удобно использовать при организации вывода в консоль кириллических символов.

      В отличие от кириллицы, числовые значения, сопоставляемые цифрам и латинским символам, одинаковы в обеих кодировках, поэтому, если в консоль выводится только латиница и числа, функцию CharToOem использовать не нужно.

      Функция определяется следующим образом:
      Function CharToOem Lib "user32" Alias DWORD "CharToOemA" (DWORD lpszSrc, DWORD lpszDst).
Функция содержится в библиотеке Windows user32, в секцию директив ассемблерной программы перед ее вызовом помещаем указания на соответствующие файлы прототипов (user32.inc) и библиотек (user32.lib). По выполнении функция возвращает в регистр EAX значение длиной 4 байта: старшие 3 байта равны нулю, младший байт равен 1, если адреса источника и приемника не совпадают, при их совпадении - 0.

      Передаваемые функции параметры:
      lpszSrc - (long pointer string zero Source) адрес заканчивающейся нулем строки-источника;
      lpszDst - (long pointer string zero Destination) адрес строки-приемника.

      Есть особенность в обработке строк ассемблером, эту особенность надо учитывать при использовании функции CharToOem. Ассемблер никак не отграничивает в исполняемом коде строки символов друг от друга или от числовых переменных. В конце строки ассемблер не пишет условного байта, указывающего на ее завершение. Возможность обращаться в ассемблерной программе к каждой символьной переменной в отдельности (по ее имени) связана с тем, что MASM32 вычисляет по объявлению размер каждой символьной переменной, при компиляции подставляет, если на то есть необходимость, в исполняемый код соответствующие значения длины строки.

      Функция CharToOem требует, чтобы строка-источник оканчивалась нулем (string zero, по-другому null-terminated). Если мы этой функции передадим в качестве источника адрес из нашего сегмента данных, она поведет себя соответственно - будет перекодировать, начиная с переданного ей адреса, в сегменте данных все, в том числе и числовые переменные любой размерности, вплоть до первого встретившегося ей нуля. Microsoft MSDN называет функцию CharToOem опасной - небрежно включенная в код, она наверняка вызовет аварийное завершение программы.

      В то же время строке-приемнику заканчиваться нулем не обязательно - достаточно лишь того, чтобы строка-источник вмещалась в приемник, то есть приемник должен иметь размер не менее, чем строка-источник.

      Пример правильного определения строки-источника перед вызовом API-функции CharToOem:

; можно так: var1 byte " Привет, мир!", 0 ; или так: var1 byte " Привет, мир!" var2 byte 0 ; оканчивает предыдущую строку.

      Заметим, что создавать специальную строку-приемник при использовании функции CharToOem не обязательно. Источником и приемником может выступать одна и та же символьная переменная, например:

invoke CharToOem, ADDR msg1, ADDR msg1

     


Добавить комментарий

E-mail:
*


Контрольные цифры:



Ассемблер MASM32

      Простейшая программа на ассемблере (beeper)
      Переменные и типы данных ассемблера
      Регистры процессора IA32
      Консоль ввода-вывода
      API-функция CharToOem и строки ассемблера
      API-функция ReadConsoleInput
      API-функция PeekConsoleInput
      События консоли (таблица)
      Системы счисления, тэги ассемблера, перевод чисел
      Отрицательные числа
      Инкремент и декремент
      Деление (DIV, IDIV)
      VKDEBUG
      Макросы ассемблера
      Воспоминание об Альгамбре на системном динамике
      Командная строка
      Пузырьковая сортировка. Эстафета шариков
      Сортировка расческой
      Быстрая сортировка

     


© Max Petrov При использовании материалов ссылка на sadda.ru обязательна