Уважаемые читатели, вслед за выводом чисел на экран мы поговорим о том как выводят строки, а также затронем массивы в Assembler. Урок будет небольшим и очень понятным.
Немного информации…
Прежде чем перейти к листингу сегодняшней темы, все же стоит отметить: как таковых массивов в Assembler нет, есть нечто похожее. И это нам, программистам, удобнее всего называть как массив. Обычно понятия массивов используют в таких языках как C++, Си и т.д.
В наших следующих статьях мы будем разбирать ассемблеровские вставки для C++, а сегодня мы просто ознакомимся с последовательностью символов.
Основная программа
Начнем:
.386 .model flat, stdcall option casemap:none include ..\INCLUDE\user32.inc include ..\INCLUDE\kernel32.inc includelib ..\LIB\kernel32.lib includelib ..\LIB\user32.lib BSIZE equ 15
Те, кто уже не первую статью читают, знают, что все эти строки нужны, так как мы работаем на masm32, а также подключаем стандартные библиотеки.
Идем дальше:
.data buf BYTE BSIZE dup(?) stdout DWORD ? cWritten DWORD ? CRLF WORD ? first BYTE " CodeTown.ru - practical examples for programming!" second BYTE " Join us!"
В разделе переменные мы объявляем уже знакомые нам переменные для вывода на экран(первые 3 строчки в разделе data).
Далее идет переменная CRLF, она нам понадобится для перевода строки. Как она работает вы увидите чуть дальше.
А вот затем идет объявления так называемых массивов (массивы first и second), в данном случае массивы у нас строковые, и каждый символ занимает 1 байт, об этом говорит запись BYTE после имени массивов. В кавычках мы записали некоторый текст. По сути так объявляются массивы, и ничего сложного в понимании нет.
Далее мы выведем на экран наши массивы:
.code start: invoke GetStdHandle, -11 mov stdout, eax mov esi, offset first ;берем адрес 1 элемента mov edi, offset second ; массивов для вывода invoke WriteConsoleA, stdout, esi, 50, ADDR cWritten, 0 mov CRLF, 0d0ah invoke WriteConsoleA, stdout, ADDR CRLF, 2, ADDR cWritten,0 ; переводим каретку на новую строку invoke WriteConsoleA, stdout, edi, 10, ADDR cWritten, 0 invoke ExitProcess, 0 end start
Вывод осуществляется практически как и в предыдущей статье, за исключением одного: команда offset, ранее нам незнакомая, берет адрес 1 символа в массиве, и затем, мы записываем его в соответствующий регистр, это нужно чтобы при выводе мы могли указать адрес массива.
В функции WriteConsoleA записываем регистр, который содержит этот адрес, а затем записываем число, сколько символов хотим вывести, в данном примере для 1 массива это 50, а для второго 10.
И еще кое что: вы, наверное, заметили, что мы трижды использовали функцию вывода. Так вот, во 2 функции мы как раз используем переменную CRLF, которую по сути и выводим. Предварительно в эту переменную мы записали 0d0ah, это говорит Assembler, что мы хотим перейти на новую строку.
Повторим запуск программы
После того как мы записали код, и сохранили его в файл с расширением .asm(у меня это sixth.asm), посмотрим как он сработал:
Открываем командную строку, переходим в папку BIN(напомню, что файл нужно поместить туда, где хранится файл запуска amake.bat) с помощью команды cd BIN.
Далее прописываем amake.bat sixth(вы, естественно, напишите свое имя файла). А затем, запускаем файл sixth.exe
И вот, что должно выйти:
Если вы не совсем поняли как запускать файлы .asm, то советую вам посмотреть наши предыдущие статьи по Assembler, там более подробно рассказано об этом.
На этом мы закончим, ваши вопросы оставляйте в комментариях. У нас есть еще много того, о чем можно говорить, и в будущем примеры только усложнятся.
Скачать исходники
Будьте первым, кто оставит комментарий