Как создать hex файл из asm

Обновлено: 07.07.2024

Так вот есть ассмблеровский код. Хочу преобразовать его в объектный код и воткнуть между hex. end в scm.
Насколько я понимаю, входной Integer и выходной string находятся в регистре ESI. То есть мне надо сначала записать в него, а потом считать. Как это можно сделать? Допустим есть локальная переменная 1@ : Integer. 4 байта. Как в scm можно получить адрес памяти этой переменной, а потом на ассемблере записать 4 байта, начиная с этого адреса в регистр. И как записать из регистра в память игры.
Надеюсь я правильно описал суть проблемы.

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

Во-вторых, переносить большую функцию в хекс, неразумно. Правильней было бы написать длл и использовать функцию из нее через load_dll, get_proc_address, call.

Alien Member --> Registered: 12-10-2008 Posts: 564

эх. вся проблема в том, что я ассемблер не знаю совсем:cry:Ладно, буду учиться делать dll-ки

Если не знаешь ассемблер, тогда тем более проще делать это через длл

Alien Member --> Registered: 12-10-2008 Posts: 564

В СБ есть опкод, определяющий адрес процедуры

Чтобы потом можно было вызвать ее

А для функций такого нет. Есть только опкод

, который обращается к функции уже по найденному адресу. А как мне найти этот адрес?

в любом опкоде можно вместо числа использовать переменную

странно что ты этого не знаешь
не забудь использовать локальные переменные

Alien Member --> Registered: 12-10-2008 Posts: 564

конешно я это знаю. я не знаю опкода, определяющего адрес функции. Или здесь тоже 0AA4 подойдет?

0AA4 работает и для процедур и для функций.

Alien Member --> Registered: 12-10-2008 Posts: 564

А у меня не рабоает ни для того, ни для другого.

Правда, я не уверен, что длл правильно собираю.

В mylib забыл exports

Alien Member --> Registered: 12-10-2008 Posts: 564

Все, спасибо, разобрался=)

Den_spb Member --> From: Ленинград Registered: 23-11-2008 Posts: 941 Website

То есть грубо говоря длл - это отдельная программа, загружаемая по команде из скрипта - скрипт передает в длл какие-то исходные данные, а длл возвращает результат для продолжения работы скрипта? Правильно я понял?

Alien Member --> Registered: 12-10-2008 Posts: 564

dll - dynamic link library
Динамическая подключаемая библиотека. В ней находятся процедуры и функции, которые можно вызывать из любой программы

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

Последние посетители 0 пользователей онлайн

HAKAS

Нигде. Замените ОУ. 318 косячная модель, похоже. ПараФинн OPA134.ms14

Soundoverlord

IMXO

Вот я себе один раз сохранил, и теперь есть где найти ответ: Типовая схема включения для "MOC3081M, MOC3082M, MOC3083M 6-Pin Zero-Cross Optoisolators Triac Driver Output" Резистор R: "A calculation for the current limiting resistor R is shown below for a typical 220 volt application: Assume the line voltage is 220 volts RMS. Also assume the maximum peak repetitive drive current (normally for a 10 micro second maximum time interval is 1 ampere). One should select a standard resistor value >311 ohms -- 330 ohms. R=220V*1.41/1A=311ohm Обычно ставят 330 Ом Резистор Rg: "The gate resistor Rg (also shown in Figure 7) is only necessary when the internal gate impedance of the triac or SCR is very high which is the case with sensitive gate thyristors. These devices display very poor noise immunity and thermal stability without Rg. The value of the gate resistor in this case should be between 100 and 500. The circuit designer should be aware that use of a gate resistor increases the required trigger current (Igt) since Rg drains off part of Igt. Use of a gate resistor combined with the current limiting resistor R can result in an unintended delay or phase shift between the zero-cross point and the time the power triac triggers." Т.е. его ставят при большом сопротивлении управляющего электрода, чтобы исключить помехи. Есть такое понятие как Оff-state leakage current (Ток утечки в выключенном состоянии) который, например равен до 0,5мА, ну и резистор выбирается из расчета, чтобы напряжение на управляющем электроде не превысило 0,1-0,2в те 0,2/0,0005=400ом. Обычно ставят 330-360ом.

имеется различная мощность. например для бриг 001с (третья ревизия) в ттх имеется: потребляемая мощность - 150 вт. выходная номинальная мощность 2х50 вт. и пиковая мощность на канал (максимальная мощность) 75 вт. можно разделить каждый канал по полосам (нч,сч,вч) но все равно - выходная останется 2х50. можно разделить на входе усилителя и на выходе поставить систему 2.1 или 5.1, но перепрыгнуть потребляемую мощность в 150 вт не получится.если быть более точным - получится, но не на долго. пока не выйдет волшебный дым, без которого, как известно, не работает ни одно электрическое или электронное устройство. как видно - речь идет о банальном суммировании. в данном случае речь идет о сопротивлении - 4 ома(1и 3 ревизия. 2 ревизия - 8 ом )

Следуя пожеланиям читателей, мы будем вести разработку проектов в более современной и удобной программе: Atmel Studio 6.

Atmel Studio 6. Создание HEX-файла

У нее есть один существенный недостаток, который не позволяет воспользоваться этой программой на относительно слабых машинах. Это программа очень ресурсоемкая и она будет сильно тормозить на слабых компьютерах с двухъядерным процессором младших моделей и 2 гигабайтами ОЗУ. Сразу скажу, владельцы старых моделей компьютеров не будут забыты и для них будут выпущены обзоры по программам WinAVR и AVR Studio 4, чтобы они не чувствовали себя в чем-то ущемленными. Эти программы очень слабо нагружают процессор и требуют намного меньше памяти для работы.

Немного Вас отвлеку, прочитайте еще статью интересную про машину Тесла.

В результате остается одна рабочая область (кликните для увеличения картинки):

Atmel Studio 6. Создание HEX-файла

Для того, чтобы создать прошивку, то есть тот самый HEX файл, мы должны написать код, скомпилировать его и “собрать” проект. После этого у нас в папке с проектом, появится нужный нам файл с расширением *.HEX. Давайте разберем, как это делается на практике. Погнали!

Для создания проекта мы нажимаем в левом верхнем углу кнопки File => New => Project:

Atmel Studio 6. Создание HEX-файла

И видим следующее окно:

Atmel Studio 6. Создание HEX-файла

Здесь нам нужно выбрать СС++ и GCC C Executable Project:

Atmel Studio 6. Создание HEX-файла

Atmel Studio 6. Создание HEX-файла

Так как имя файла мне не нравится, то меняем его на Studio_6_Lesson_ 1. Путь для сохранения проекта я оставил по умолчанию. В данном случае в папке 6.2 у нас создастся папка с названием Studio_6_Lesson_ 1. В ней и будут находиться все необходимые нам файлы, имеющие отношение к нашему проекту:

Atmel Studio 6. Создание HEX-файла

Ну а теперь жмем ОК. Что мы видим дальше? А дальше открывается следующее окно:

Atmel Studio 6. Создание HEX-файла

Ну а потом выбираем наш МК Attiny 2313:

Atmel Studio 6. Создание HEX-файла

Здесь же можно вкратце ознакомиться с характеристиками на данную модель МК, узнать объем Flash памяти, ОЗУ, и EEPROM памяти. Также здесь можно скачать даташит на данную модель МК и ознакомиться со всеми характеристиками этого микроконтроллера.

После того как выбрали, жмем ОК. Перед нами открывается рабочее окно программы (для увеличения кликните мышкой)

Atmel Studio 6. Создание HEX-файла

А вот и самое главное окно:

Atmel Studio 6. Создание HEX-файла

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

Что же мы видим здесь?

Итак, давайте разберем, что же обозначают все остальные строчки. Читаем комментарий, идущий после кода в каждой строчке. Комментарии у нас отделяются от кода, двумя символами знака деления(//). Правильно же это называется прямой двойной слэш.

Что же мы видим? Смотрим строку под номером 9. С нее начинается сама программа:

Эту строчка должна присутствовать абсолютно в любом проекте на любом МК AVR Mega и Tiny. Смысл этих команд я написал в комментариях, идущих после команды.

Atmel Studio 6. Создание HEX-файла

Здесь я хочу сделать небольшое отступление и разобрать отличия Atmel Studio 6.2 от той же WinAVR. В шестой студии есть очень удобная функция. Называется она автоподставления команд. Проявляется это в том, что как только мы начали набирать команду известную Студии, она сама предложит нам все возможные варианты команд на выбор, какие только есть в её памяти по нескольким первым буквам.

Atmel Studio 6. Создание HEX-файла

Нам достаточно нажать лишь клавиши ТАВ или ENTER и команда у нас подставится автоматически.

Разбираем строчку №10

Atmel Studio 6. Создание HEX-файла

Этой строчкой мы объявлем библиотеку задержек

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

Идем дальше. Смотрим строчку №11:

Atmel Studio 6. Создание HEX-файла

Этой командой мы “говорим” МК, что у нас в программе будет использоваться функция задержек работы микроконтроллера , или иначе говоря, режима холостой работы. В это время не будут выполняться никакие другие действия. На какое-то заданное время, МК, условно говоря, для нас как-бы зависнет.

Идем дальше. Мы видим строчку int main(void) //Основное тело программы под строкой №13:

Atmel Studio 6. Создание HEX-файла

После нее, собственно, и начинается наша основная программа. Мы видим в строке 14 фигурную скобку, открывающую место под программу, и такую же, только повернутую в другую сторону скобку, закрывающую место под программу уже в строке 19. Эти скобки предназначены для основного тела программы. Также мы видим соединяющую их вертикальную черту, показывающую нам, что они одно целое.

Также можно увидеть и фигурные скобки для while. Открывающая скобка находится в строке 16, а закрывающая в строке 18.

Давайте напишем программу для мигания одним светодиодом. Для этого добавляем строчки:

PORTB=0b0000000 0; //Притягиваем все 8 выводов порта В к 0

DDRB=0b11111111 ; // Конфигурируем все выводы порта В на выход

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

Далее идет собственно программа (кликните для увеличения):

Atmel Studio 6. Создание HEX-файла

PORTB=0b0000000 1; //Подаем на порт В0 логическую единицу (зажигаем светодиод)

Итак мы видим, что крайняя справа у нас стоит единичка. Как мы помним из выше сказанного, это значит что мы на порт В0 вывели 1, или по другому говоря, на этом выводе у нас сейчас +5 вольт.

_delay_ms(500); //Ждем 500 миллисекунд (0.5 секунды)

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

Что означают ниже приведенные две строчки кода, вы наверное уже догадались сами:

PORTB=0b0000000 0; //Подаем на порт В0 логический ноль (гасим светодиод)

_delay_ms(500); //Ждем 500 миллисекунд (0.5 секунды) Мы подаем ноль на ножку В0 и затем ждем пол секунды.

Но такая программа у нас длилась бы всего секунду, а что потом? А потом нам нужно вернуться к началу нашего бесконечного цикла, который мы объявляем командой While:

Atmel Studio 6. Создание HEX-файла

while(1) //Начинаем бесконечный цикл

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

И наконец, в конце нашей программы мы видим две фигурные скобки, по одной на каждый цикл программы, основной и бесконечный через While, читаем комментарий к последней скобке:

> //Возвращаемся к началу выполняемого тела программы, к строке 13

Уфф))… программа вроде бы написана, но как скормить этот код микроконтроллеру ? Он же не понимает код, написанный в понятных нам словах и командах? А для этого нам нужно сначала скомпилировать прошивку. Делается это следующим образом.
Кликаем Build=>Compile и прошивка у нас будет скомпилирована.

Atmel Studio 6. Создание HEX-файла

Жмем Build=>Build Studio_6_Lesson_ 1 и считаем количество ошибок)), а они при самостоятельном написании первой программы скорее всего будут у начинающих кодеров.

Atmel Studio 6. Создание HEX-файла

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

Atmel Studio 6. Создание HEX-файла

Atmel Studio 6. Создание HEX-файла

В той папке, где лежит проект, у нас находится исходник на СИ

Atmel Studio 6. Создание HEX-файла

Все, теперь этот файл можно скармливать как любому программатору для МК AVR, так и программе Proteus, если вы вдруг захотите перед сборкой конкретного устройства посмотреть, как это будет выглядеть в эмуляторе. Работу в эмуляторе Proteus можно прочитать в этой статье.

Специально для любознательного парня, который задал вопрос в комментариях.

Цель - сгенерировать *.hex файл, который потом можно залить в микроконтроллер через любую программу-загрузчик, я пользуюсь программой UniProf.

Запускаем AVR Studio

2. Запускаем AVR Studio:

VR Studio new project

3. Выбираем "New Project":

выбираем язык

4. Выбираем язык написания программы:

задаем имя проекта

5. Заполняем поле "Project Name" и жмем "Finish":

6. Меняем настройки проекта под наши нужды:


Выбираем микроконтроллер для которого планируем писать программу (по умолчанию стоит ATmega128):

Запускаем AVR Studio

сохраняем настройки

пишем программу

7. Пишем программу в пустом окошке:

запускаем проект

8. Жмем кнопку "Build":

hex файл

9. Идем в папку, в которую сохранились файлы проекта и видим там:

Результат: получили *.hex файл проекта.
Теперь подключаем программатор, и записываем программу в микроконтроллер.
Удачи всем!

При попытке скомпилировать

При попытке скомпилировать исходник в этой проге получаю ошибки :

Build started 30.11.2010 at 21:18:52
make: Makefile: No such file or directory
make: *** No rule to make target `Makefile'. Stop.
Build failed with 2 errors and 0 warnings.

как с этим бороться??

Путь к программе на кирилице!

". как и все американское ПО данная программа не очень любит взаимодействие с кириллицей. Это значит что установку WinAVR следует выполнять в папку с названием только из латинских букв или цифр. "

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