Jump to content
IzzyForum
Sign in to follow this  
Енотыч

Кирилица в FASM

Recommended Posts

Продолжение предыдущей статьи на тему кириллических (да хоть китайских) символов.

Давайте взглянем правде в глаза, что все бренно и когда нибудь вам придется гуглить на тему как бороться с кодировками и во FASM. А если ты гуглишь про кодировки, то значит ты новичок. Добро пожаловать в статью. Итак - не нашел ни одного ответа на эту тему на первых двух страницах гугла. Если не нашел. Значит оставлю тут.

Цитата

format PE GUI
entry start

include 'includes\win32a.inc'
include 'includes\encoding\utf8.inc'

section '.data' data readable writeable
  _caption du "РаботаетЗБС", 0
  _lsize dd 256
  _username: du ?
 
section '.text' code readable executable
  start:
    invoke  GetUserNameW, _username, _lsize
    invoke  MessageBoxW, NULL, _username, _caption, MB_OK
    invoke  ExitProcess, 0
 
section '.idata' import data readable writeable
  library user32, 'USER32.DLL', advapi32, 'ADVAPI32.DLL', kernel32, 'KERNEL32.DLL'
  import user32, MessageBoxW, 'MessageBoxW'
  import advapi32, GetUserNameW, 'GetUserNameW'
  import kernel32, ExitProcess, 'ExitProcess'

Это пример программы из первой части, которая будем получать имя пользователя операционной системы, только на другом языке, почему я считаю что примеры на ассемблере наиболее понятны? Потому что там хоть как то объяснено как работает та или иная функция, откуда она появляется и че происходит когда наша программа не находит какую нибудь DLL, да изечка? Скока у тебя видосов про эти неприятности? Давай раскроем почему так.

Наша с вами программа разделена на четыре части. И начнем мы с последней и самой интересной:
 

Цитата

section '.idata' import data readable writeable
  library user32, 'USER32.DLL', advapi32, 'ADVAPI32.DLL', kernel32, 'KERNEL32.DLL'
  import user32, MessageBoxW, 'MessageBoxW'
  import advapi32, GetUserNameW, 'GetUserNameW'
  import kernel32, ExitProcess, 'ExitProcess'

Началом этой секции программы мы считаем этот зеленый заголовок. Он нам говорит что бы будем делать в этом блоке импорт библиотек (любых). Например тех которые находятся в папке "C:\Windows\System32" и являются стандартной библиотекой WinApi.
Таких как User32.dll, Advapi32.dll, Kernel32.dll импорт которых вы видите во второй строке...
А вот в последующих - фиолетовых строках вы можете увидеть импорт функций из этих библиотек - тех которые мы импортировали в программе на С++ из заголовка "windows.h", тут мы их берем напрямую без всяких лишних движений. Но на этот раз мы добавим еще к тому набору функцию ExitProcess - которая будет выключать нашу программу. Просто так - потому что захотелось.
 

Цитата

section '.text' code readable executable
  start:
    invoke  GetUserNameW, _username, _lsize
    invoke  MessageBoxW, NULL, _username, _caption, MB_OK
    invoke  ExitProcess, 0

Тут начинает выполнятся наша программа. Она будет как и статье о С++ на данном форуме, делать тоже самое - получать имя пользователя и выводить его в окошке!
Зеленый текст - объявляем секцию кода программы, который будет выполнятся.
start:  -  это как раз таки аналог функции wWinMain() из первой статьи
invoke  GetUserNameW, _username, _lsize  -  это таже самая функция которую мы использовали в прошлый раз, она принимает теже значения и заполняет переменную _username именем пользователя. далее мы вызываем функцию MessageBoxW которая выведет переменную _username внутри окошка, тоже самое как и в первой статье. уловили? аналогия думаю яснее некуда. у нас одна и так же программа, которая ничем не хуже предыдущей, просто немного на другом языке, в котором нам становится понятнее как оно работает. А в самом конце программы - мы можем вызвать функцию ExitProcess которая принимает ноль как параметр, что бы завершить нашу программу.
Если внимательно прочитать статью и заглянуть в импорты предыдущей секции - вы можете увидеть из какой библиотеки берется данная функция. И как бы все становится понятным.

А теперь давайте взглянем на следующую секцию в которой мы будем объявлять русскоязычные переменные!

Цитата

section '.data' data readable writeable
  _caption du "РаботаетЗБС", 0
  _lsize dd 256
  _username: du ?

Вот как то так... Помните я выделял красным символ L а тут я выделил красным символы - перед du русским текстом, а так же создал пустую переменную _username - которая равна ? (ничему) и имеет тип подобный WCHAR - DU. да да, именно так. все как в первой статье - действуем по аналогии. так же создадим третью переменную которая как и в первой статье у нас будет просто размером предполагаемого имени пользователя, которая пригодится в функции GetUserNameW которая таже самая функция, которую мы вызывали в предыдущей статье про С++. ясно?

А теперь просто завершающие штрихи -

Цитата

 

format PE GUI
entry start

include 'includes\win32a.inc'
include 'includes\encoding\utf8.inc'

 

Подключаем заголовки FASM и то что будем юзать в своей программе. Логично что нужно еще подключить заголовок для кодировки UTF-8, для текста на международных языках. и обозначим что главной функцией у нас будет start
Закончим на этом. Компилируем программу - запускаем ее. Профит. Полная поддержка кириллицы нам обеспечена.

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×