Skip to content

Вывод на экран Assembler

Сегодня мы рассмотрим тему «Вывод на экран Assembler» и разберем программу, которая сможет выводить на экран нашей консоли числа. Для этого нам потребуется изучить несколько новых процедур, а также познакомится с подключаемыми библиотеками и системными файлами.

Вспомним о процедурах

Для начала, я напомню вам, что когда мы изучали с вами процедуры Assembler, то я, подводя итоги, написал, что для процедур с параметрами необходим прототип. Да, это так, но есть одно но: если эта процедура не является стандартной, и не описана где нибудь в подключаемой библиотеки.

Так вот, ранее изученная процедура ExitProcess, а также те процедуры, которые мы сегодня с вами изучим(WriteConsoleA, wsprintf) являются стандартными(на самом деле такого термина нет, но думаю так понятнее), и для них не нужно писать прототип.

Вывод на экран

А теперь перейдем к коду:

.386
.model flat,stdcall
option casemap:none
include ..\INCLUDE\kernel32.inc 
include ..\INCLUDE\user32.inc 
includelib ..\LIB\kernel32.lib 
includelib ..\LIB\user32.lib

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

BSIZE equ 15   ; так задается константа BSIZE

.data
ifmt db "%d", 0     ;строка формата
buf db BSIZE dup(?) ;буфер
msg dd 123456       ;то что мы выводим
stdout dd ?         
cWritten dd ?

Далее будет не очень понятно пока не увидим в действии, но все же попробую объяснить. Первое, что мы делаем, объявляем константу BSIZE со значением 15. Затем в разделе .data , там где объявляются переменные, задаем несколько переменных, которые потребуются как параметры для наших дальнейших процедур.

Стоит отметить переменную buf: запись dup(duplication) говорит о подряд идущих байт, которые выделяются под переменную buf размерностью BSIZE(15). А знак вопроса говорит, что значения байт заранее не определено.

Итак, пока не все понятно, поэтому идем дальше, тут у вас должен сложиться пазл:

.code
start:
invoke GetStdHandle, -11 ; дескриптор вывода
mov stdout,eax           ; по умолчанию помещается в eax
invoke wsprintf, ADDR buf, ADDR ifmt, msg
invoke WriteConsoleA, stdout, ADDR buf, BSIZE, ADDR cWritten, 0

invoke ExitProcess,0  
end start

Для того, чтобы вывести что нибудь на экран нужно знать дескриптор вывода. Процедура GetStdHandle считывает адрес дескриптора экрана, и по умолчанию записывает его в регистр eax. После, мы записываем это значение из регистра в переменную stdout.

Дальше мы используем процедуру wsprintf. Она нужна для того, чтобы вывести наше сообщение(именно число) в понятном для нас формате, то есть эта процедура преобразования машинного языка в человеческий формат. Для этого используется переменная ifmt.

Ну и за сам вывод отвечает процедура WriteConsoleA. Она принимает 5 параметров, и последним всегда должен идти 0.

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

Запуск программы

А сейчас я покажу вам как все это реализовать на практике, после написания кода.
Я создал файл fifth.asm и поместил его в папку BIN. Затем я открываю командную строку, и перехожу в папку BIN с помощью команды cd C:\Users\Никита\BIN (у вас будет другой путь, скорее всего)
Далее компилирую наш файл, прописывая команду amake.bat fifth, если код правильный, то будет как на фото:

Assembler-4

Как мы видим, все скомпилировалось без ошибок, но ничего не вывелось на экран. Для того, чтобы наша программа выполнилась, нужно после компиляции запустить файл с расширением .exe(он создается автоматически после правильной компиляции). Прописываем в командной строке fifth.exe, у вас должно получится нечто подобное:
Assembler-5

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

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

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

3 комментария

  1. Вовка Вовка

    Странно, ничего не выводится. Практический скопипастил, указал правда только абсолютный путь в include, без этого не компилировалось, а так больше никаких измений в коде. Короче exe есть, запускаю, а в консоли ничего, может что дописать, добавить надо?

  2. Nikiqq Nikiqq

    А устанавливали MASM32 из нашего урока ( http://codetown.ru/assembler/ustanovka-masm32/ ) ? Если да, то относительные пути должны были сработать, и какая windows у вас стоит?

  3. Сергей Сергей

    Интересно, автор еще присутствует на сайте?
    Огромное спасибо!
    А можно немного изменить пример?
    У меня число находится в EDX
    Как его вывести вместо «msg»?

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

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