Исходный файл не были собраны ассемблер

Обновлено: 06.07.2024

В этом документе кратко описан процесс установки учебной среды на основе ассемблера MASM под ОС Windows, а также порядок работы с ней.

Установка MASM

Скачайте архив c MASM с сайта arch32.cs.msu.su.

Распакуйте архив в каталог C:\masm32 (необходимо использовать именно такой путь). Убедитесь, что в каталоге C:\masm32 оказались каталоги bin , lib , include .

Создайте где-либо в удобном месте рабочий каталог для ваших программ, например, C:\asm или D:\study\sem2 . Рабочий стол Windows или папка «Мои документы» не являются подходящими местами для рабочего каталога — проследите, чтобы в полном пути к каталогу не было русских букв или пробелов. Далее таким каталогом будет считаться C:\work .

Скачайте файл prompt.bat и положите его в ваш рабочий каталог.

Простейшая программа

Для следующего шага вам потребуется текстовый редактор, пригодный для работы с программным кодом. Заметим, что Microsoft Word или встроенный в Windows редактор WordPad являются текстовыми процессорами и для работы с программным кодом непригодны. Редактор Notepad (Блокнот) подходит для работы с текстовыми файлами (plain text), но неудобен в качестве программистского редактора — в нем отсутствует подсветка синтаксиса и другие стандартные для таких редакторов функции.

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

Примечание: Если вы решили скачать Notepad2, при первом запуске установите ширину табуляции (Tabulator width) в значение 8 при помощи меню Settings > Tab Settings.

Создайте в вашем рабочем каталоге файл hello.asm следующего содержания:

Примечание: В Notepad2 при сохранении введите имя файла hello.asm , и подсветка синтаксиса включится автоматически.

Эта программа выводит пять раз строчку “Hello World” на экран. Для вывода текста используется макрос outstrln , который определен в файле console.inc .

Трансляция и запуск программы

Дважды щелкните по файлу prompt.bat , который вы скачали на шаге установки. Откроется окно командной строки. Убедитесь, что все сделано правильно, набрав команду dir и нажав Enter . Вы должны увидеть, что в текущем каталоге (вашем рабочем каталоге) находятся файлы hello.asm и prompt.bat :

Примечание для тех, кто никогда прежде не работал с командной строкой. Взаимодействие с ней устроено следующим образом: командная строка выводит приглашение (в примере выше это C:\work> ), далее пользователь вводит команду (выше — dir ) и нажимает клавишу Enter , после чего на экране появляется вывод команды, то есть результат ее работы.

Для запуска программы требуется ее оттранслировать. Первый шаг — запуск ассемблера MASM, который построит по исходному тексту програмы объектный файл:

Аргумент /c инструктирует ассемблер выполнить только трансляцию в объектный файл, без компоновки (которую мы выполним чуть позже). Аргумент /coff указывает формат объектного файла — COFF (Common Object File Format).

В рабочем каталоге появится файл hello.obj . Запустите компоновщик:

Аргумент /subsystem:console говорит компоновщику, что нужно построить консольное Windows-приложение.

В рабочем каталоге появится файл hello.exe . Это исполняемый файл, который уже можно запустить:

Как это устроено

Командный файл prompt.bat запускает окно командной строки и задает переменные окружения так, чтобы программы ml и link были доступны без указания пути к ним, а пути к include- и lib-файлам MASM также были известны.

Пути заданы жестко, поэтому и требовалось распаковать архив в строго определенный каталог.

Командный файл для упрощения запуска

Когда вам надоест каждый раз набирать три команды для трансляции и запуска программ, создайте такой командный файл (назвать его можно, например, mkr.bat — то есть make/run):

Использовать его можно будет следующим образом:

Несколько комментариев по устройству этого командного файла:

Команда @echo off отключает дублирование каждой исполняемой команды в окне командной строки.

Аргумент /nologo при вызове ассемблера и компоновщика убирает строчку “Copyright (C) Microsoft”, захламляющую экран.

%1 меняется на аргумент, который передан командному файлу, то есть имя программы на ассемблере (выше — hello.asm ).

n1 меняется на тот же аргумент, но без расширения (выше — hello ).

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

Файл mkr.bat можно или копировать в каждый каталог, где вы планируете размещать исходные тексты программ на ассемблере, или поместить его в каталог C:\masm32\bin , и тогда выполнять его будет можно из любого каталога, при условии, что вы запустили командную строку при помощи prompt.bat .

То, что получилось в итоге — это простейшая система программирования, состоящая из транслятора (ассемблера MASM), текстового редактора (Notepad2 или иного, если вы его предпочли) и примитивной системы сборки на единственном командном файле.

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

Подскажите, где ошибка?
Сколько примеров не смотрел-
Я использую GUI Turbo Assembler Ver. 2.1
Если можете-дайте ссылки на сайты, где показываются примеры именно для GUI Turbo Assembler, т.к. те примеры, которые я находил-выдавали ошибку на последней команде.

Добавлено через 1 час 11 минут


Source file has not been been assembled. Check log for more information

Вот, что выдаётся при компиляции проекта, однако, опять же, в LOG'е информации нету.

>>> Welcome to GUI Turbo Assembler Ver: 2.1 | Developed by : Lakhya Jyoti Nath | MCA 2K15, Tezpur University,IN | Built on : 10th October 2013, 04:42:37 Hrs. <<<

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Подключение файлов (include) в GUI Turbo assembler
Для написания программ на ассемблере использую IDE GUI Turbo assembler. По заданию необходимо.


Компиляция, компоновка и запуск программ в GUI Turbo Assembler
Доброго времени суток! Для создания программы на TASM выбрал &quot;GUI Turbo Assembler&quot;. Написал такой.

Как отладить программу, созданную в GUI Turbo Assembler?
Com файл создаеться,с GUI turbo asembler запускаеться консолька.С папки где лежит он не.

Ищу компилятор GUI Turbo Assembler и IDA PRO на русском русифицированную
не могу найти компилятор GUI Turbo Assembler и IDA PRO на русском русифицированную Помогите найти.

Вы пытаетесь запустить 16-битный/ДОС Трупоассемблер из-под индусской гуёвой оболочки? Успехов.
P.S. Я скачал этот GUI Turbo Assembler - одного взгляда на потроха хватило. Запустите под чистым ДОСом, или хотя бы в DOSBOX. Один из самых простых способов вывести текст в Windows - ShowMessage или как там его из функций Windows AP. В стандартных исходниках этот пример должен входить. Удачи. Ничего. Все ассемблеры, кроме FASM'a, после директивы end перестают парсить исходник - можешь проверить. Ничего. Все ассемблеры, кроме FASM'a, после директивы end перестают парсить исходник - можешь проверить. непомню когда и из-за чего, но масмец ругался на лишний end в конце. более не делаю так.

Its is assembled successfully. I have tried it myself


Найти ошибку зацикливается ввод (при компиляции GUI, а при компиляции CONSOLE - работает)
При вводе элементов размера массива идет зацикливание и полное зависание, что может быть не так.


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

"Сбой при преобразовании в COFF" при компиляции простейшего проекта
Доброго времени суток! Подскажите, пожалуйста, неопытной девушке, что нужно сделать! Код.

Ошибка при компиляции файла
Пытаюсь подключить graphics, но без успешно! Код, вроде, без ошибок, поэтому не знаю в чем.

Ошибка при компиляции файла
Собираюсь делать клиент для галактики знакомств(Чат). Сам код: unit Unit1; interface uses .


Assembler. Ошибка компиляции (новичок)
Доброго времени суток! Только начал изучать Assembler. Читал книгу - списал код) - ошибка.

Ассемблер рассматривает любые входные или выходные данные в качестве потока байтов. Есть три стандартных файловых потока:

стандартный ввод ( stdin );

стандартный вывод ( stdout );

стандартная ошибка ( stderr ).

Файловый дескриптор

Файловый дескриптор стандартных файловых потоков:

Файловый указатель

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

Системные вызовы обработки файлов

В следующей таблице кратко описаны системные вызовы, связанные с обработкой файлов:

Необходимые шаги для использования системных вызовов:

поместите номер системного вызова в регистр EAX;

сохраните аргументы системного вызова в регистрах EBX, ECX и EDX;

вызовите соответствующее прерывание ( 80h );

результат обычно возвращается в регистр EAX.

Создание и открытие файла

Для создания и открытия файла выполняются следующие шаги:

поместите системный вызов sys_creat() — номер 8 в регистр EAX;

поместите имя файла в регистр EBX;

поместите права доступа к файлу в регистр ECX.

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

Открытие существующего файла

Для открытия существующего файла выполняются следующие шаги:

поместите системный вызов sys_open() — номер 5 в регистр EAX;

поместите имя файла в регистр EBX;

поместите режим доступа к файлу в регистр ECX;

поместите права доступа к файлу в регистр EDX.

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

Среди режимов доступа к файлам чаще всего используются:

только чтение ( 0 );

только запись ( 1 );

Чтение файла

Для чтения данных из файла выполняются следующие шаги:

поместите системный вызов sys_read() — номер 3 в регистр EAX;

поместите файловый дескриптор в регистр EBX;

поместите указатель на входной буфер в регистр ECX;

поместите размер буфера, т.е. количество байтов для чтения, в регистр EDX.

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

Запись в файл

Для записи в файл выполняются следующие шаги:

поместите системный вызов sys_write() — номер 4 в регистр EAX;

поместите файловый дескриптор в регистр EBX;

поместите указатель на выходной буфер в регистр ECX;

поместите размер буфера, т.е. количество байтов для записи, в регистр EDX.

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

Закрытие файла

Для закрытия файла выполняются следующие шаги:

поместите системный вызов sys_close() — номер 6 в регистр EAX;

поместите файловый дескриптор в регистр EBX.

В случае ошибки, системный вызов возвращает код ошибки в регистр EAX.

Обновление файла

Для обновления файла выполняются следующие шаги:

поместите системный вызов sys_lseek() — номер 19 в регистр EAX;

поместите файловый дескриптор в регистр EBX;

поместите значение смещения в регистр ECX;

поместите исходную позицию для смещения в регистр EDX.

Исходная позиция может быть:

началом файла — значение 0 ;

текущей позицией — значение 1 ;

концом файла — значение 2 .

В случае ошибки, системный вызов возвращает код ошибки в регистр EAX.

Существуют следующие формы комбинирования программ на языках высокого уровня с ассемблером:

Встроенный ассемблер

При написании ассемблерных вставок используется следующий синтаксис:

_asm КодОперации операнды ; // комментарии

КодОперации задает команду ассемблера,
операнды – это операнды команды.
В конце записывается ;, как и в любой команде языка Си.
Комментарии записываются в той форме, которая принята для языка Си.
Если требуется в текст программы на языке Си вставить несколько идущих подряд команд ассемблера, то их объединяют в блок:

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

Для компоновки и запуска программы создаем проект как описано в разделе Создание консольных приложений .
Проект будет содержать 1 файл исходного кода с расширением cpp.
Результат выполнения программы:

Связь ассемблера и Си

Использование внешних процедур

Для связи посредством внешних процедур создается многофайловая программа. При этом в общем случае возможны два варианта вызова:

  • программа на языке высокого уровня вызывает процедуру на языке ассемблера;
  • программа на языке ассемблера вызывает процедуру на языке высокого уровня.

Рассмотрим более подробно первый вариант.
В таблице ниже представлены основные соглашения по передаче параметров в процедуру.
В программах, написанных на языке ассемблера, используется соглашение передачи параметров stdcall . Однако по сути получение и передача параметров в языке ассемблера производится явно, без помощи транслятора.
При связи процедуры, написанной на языке ассемблера, с языком высокого уровня, необходимо учитывать соглашение по передаче параметров.

Соглашение Параметры Очистка стека Регистры
Pascal (конвенция языка Паскаль) Слева направо Процедура Нет
C (конвенция С) Справа налево Вызывающая программа Нет
Fastcall (быстрый или регистровый вызов) Слева направо Процедура Задействованы три регистра (EAX,EDX,ECX), далее стек
Stdcall (стандартный вызов) Справа налево Процедура Нет

Конвенция Pascal заключается в том, что параметры из программы на языке высокого уровня передаются в стеке и возвращаются в регистре АХ/ЕАХ, — это способ, принятый в языке PASCAL (а также в BASIC, FORTRAN, ADA, OBERON, MODULA2), — просто поместить параметры в стек в естественном порядке. В этом случае запись

Процедура some_proc , во-первых, должна очистить стек по окончании работы (например, командой ret 16 ) и, во-вторых, параметры, переданные ей, находятся в стеке в обратном порядке:

Этот код в точности соответствует полной форме директивы proc .
Однако можно использовать упрощенную форму, которую поддерживают все современные ассемблеры:

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

Конвенция С используется, в первую очередь, в языках С и C++, а также в PROLOG и других. Параметры помещаются в стек в обратном порядке, и, в противоположность PASCAL-конвенции, удаление параметров из стека выполняет вызывающая процедура.
Запись some_proc(a,b,c,d)
будет выглядеть как

push d
push с
push b
push a
call some_proc@16
add esp ,16 ; освободить стек

Вызванная таким образом процедура может инициализироваться так:

Трансляторы ассемблера поддерживают и такой формат вызова при помощи полной формы директивы proc с указанием языка С:

Регистр EВР используется для хранения параметров, и его нельзя изменять программно при использовании упрощенной формы директивы proc .
Преимущество по сравнению с PASCAL-конвенцией заключается в том, что освобождение стека от параметров в конвенции С возлагается на вызывающую процедуру, что позволяет лучше оптимизировать код программы. Например, если необходимо вызвать несколько функций, принимающих одни и те же параметры подряд, можно не заполнять стек каждый раз заново, и это — одна из причин, по которой компиляторы с языка С создают более компактный и быстрый код по сравнению с компиляторами с других языков.

Смешанные конвенции
Существует конвенция передачи параметров STDCALL , отличающаяся и от C , и от PASCAL -конвенций, которая применяется для всех системных функций Win32 API. Здесь параметры помещаются в стек в обратном порядке, как в С, но процедуры должны очищать стек сами, как в PASCAL.
Еще одно отличие от С-конвенции – это быстрое или регистровое соглашение FASTCALL . В этом случае параметры в функции также передаются по возможности через регистры. Например, при вызове функции с шестью параметрами

первые три параметра передаются соответственно в ЕАХ , EDX , ЕСХ , а только начиная с четвертого, параметры помещают в стек в обычном обратном порядке:

В случае если стек был задействован, освобождение его возлагается на вызываемую процедуру.
В случае быстрого вызова транслятор Си добавляет к имени значок @ спереди, что искажает имена при обращении к ним в ассемблерном модуле.

Возврат результата из процедуры

Чтобы возвратить результат в программу на С из процедуры на ассемблере, перед возвратом управления в вызываемой процедуре (на языке ассемблера) необходимо поместить результат в соответствующий регистр:

Тип возвращаемого значения Регистр
unsigned char al
char al
unsigned short ax
short ax
unsigned int eax
int eax
unsigned long int edx:eax
long int edx:eax

Пример Умножить на 2 первый элемент массива (нумерация элементов ведется с 0).

;Вызываемая функция file2.asm
.586
. MODEL FLAT , C
. CODE
MAS_FUNC PROC C mas: dword , n: dword
mov esi ,mas
mov eax , [ esi +4]
shl eax , 1
ret
MAS_FUNC ENDP
END

Чтобы построить проект в Microsoft Visual Studio Express 2010, совместив в нем файлы, написанные на разных языках программирования, выполняем следующие действия.

Проект на двух языках программирования

Создание проекта начинается с выбора меню Файл -> Создать -> Проект.

Аналогично проекту, содержащему 1 язык программирования, создаем пустой проект консольного приложения и задаем имя проекта.




Добавляем в дерево проекта два файла исходного кода:

  • вызывающая процедура на языке C++;
  • вызываемая процедура на языке ассемблера.

Для этого выбираем по правой кнопке мыши Файлы исходного кода -> Добавить -> Создать элемент и задаем имя файла программы на языке С++.

casmprj7

Второй добавляемый файл исходного кода будет иметь расширение .asm, которое необходимо указать явно.

Важно, чтобы файлы программ на C++ и ассемблере имели не только разные расширения, но и имена. В случае совпадающих имен файлов возникнет ошибка при компоновке проекта, поскольку оба файла будут иметь одно и то же имя объектного файла.

Набираем код программы для файлов вызывающей и вызываемой процедур соответственно на C++ и ассемблере.


Подключаем инструмент Microsoft Macro Assembler. По правой кнопке мыши для проекта выбираем Настройки построения.

В появившемся окне ставим галочку в строке masm.


Выбираем меню Свойства для файла на языке ассемблера по правой кнопке мыши и выбираем для этого файла инструмент Microsoft Macro Assembler.


Выполняем построение проекта, выбрав меню Отладка -> Построить решение.

Запуск построения проекта


Результат построения отображается в нижней части окна проекта.

Результат построения проекта


Запуск проекта на выполнение осуществляется через меню Отладка -> Начать отладку.

Результат выполнения

Результат выполнения программы

Перед вызовом процедуры всегда нужно сохранять содержимое регистров ebp , esp , а перед выходом из процедуры – восстанавливать содержимое этих регистров. Это делается компилятором языка Си. Остальные регистры нужно сохранять при необходимости (если содержимое регистра подвергается изменению в вызванной процедуре, а далее может использоваться в вызывающей программе) Это может быть сделано с помощью команды pusha .
Передача аргументов в процедуру на ассемблере из программы на Си осуществляется через стек. При этом вызывающая программа записывает передаваемые параметры в стек, а вызываемая программа извлекает их из стека.

Работа с аргументами вещественного типа

При вызове функции с аргументами вещественного типа конфигурация проекта ничем не отличается от описанной выше. Для передачи аргументов необходимо указать их тип.

тип Си Количество байт Тип аргумента ассемблера
float 4 dword
double 8 qword

Возвращаемое вещественное значение по умолчанию располагается в вершине стека сопроцессора st(0).

Читайте также: