Skip to content

Вывод строковых массивов

Уважаемые читатели, вслед за выводом чисел на экран мы поговорим о том как выводят строки, а также затронем массивы в 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
И вот, что должно выйти:

sixth
Если вы не совсем поняли как запускать файлы .asm, то советую вам посмотреть наши предыдущие статьи по Assembler, там более подробно рассказано об этом.

На этом мы закончим, ваши вопросы оставляйте в комментариях. У нас есть еще много того, о чем можно говорить, и в будущем примеры только усложнятся.

Скачать исходники

Опубликовано вAssembler

Будьте первым, кто оставит комментарий

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

    Ваш e-mail не будет опубликован. Обязательные поля помечены *