Как сделать программу на assembler

Рассмотрим синтаксические особенности ассемблера AVR на примере небольшой тестовой программы для микроконтроллера ATmega8, приведенной ниже. Программа формирует на выводе PB2 импульсы с частотой следования ≈ 2.5 Гц при частоте внутреннего RC-генератора 1 МГц.

1. ; Тестовая программа для ATmega8.

2. // Светодиод подключен к выводу PB0 микроконтроллера.

3. /* Биты конфигурации:

Low Fuse High Fuse

BODLEVEL = 1 RSTDISBL = 1

BODEN = 1 WDTON = 1

SUT1 = 1 SPIEN = 1

SUT0 = 0 CKOPT = 1

CKSEL3 = 0 | EESAVE = 1

CKSEL2 = 0 |_ RC-генератор BOOTSZ1 = 1

CKSEL1 = 0 | 1 МГц BOOTSZ0 = 1

CKSEL0 = 1 | BOOTRST = 1 */

4. .nolist ;подключение стандартного заголовочного файла

5. . include «m8def.inc»

7. . equ PAUSE = 50000 ;задержка времени

8. . equ LED = PB2 ;вывод для подключения светодиода

9. .def temp = R16 ;регистр для промежуточных операций

10. .def buffer = R17 ;регистр для чтения порта

Как написать программу на Assembler часть 2

13. rjmp initial ;0xC01F

14. rjmp 0 ;rjmp service_INT0 ;внешнее прерывание 0 0xCFFE

15. rjmp 0 ;rjmp service_INT1 ;внешнее прерывание 1 0xCFFD

16. rjmp 0 ;rjmp service_OC2 ;совпадение TCNT2 и OCR2 0xCFFC

17. rjmp 0 ;rjmp service_OVF2 ;переполнение TCNT2 0xCFFB

18. rjmp 0 ;rjmp service_ICP1 ;захват в ICP1 0xCFFA

19. rjmp 0 ;rjmp service_OC1A ;совпадение TCNT1 и OCR1A 0xCFF9

20. rjmp 0 ;rjmp service_OC1B ;совпадение TCNT1 и OCR1B 0xCFF8

21. rjmp 0 ;rjmp service_OVF1 ;переполнение TCNT1 0xCFF7

22. rjmp 0 ;rjmp service_OVF0 ;переполнение TCNT0 0xCFF6

23. rjmp 0 ;rjmp service_SPI ;прерывание от модуля SPI 0xCFF5

24. rjmp 0 ;rjmp service_URXC ;получение байта по USART 0xCFF4

25. rjmp 0 ;rjmp service_UDRE ;опустошение UDR в USART 0xCFF3

26. rjmp 0 ;rjmp service_UTXC ;передача байта по USART 0xCFF2

27. rjmp 0 ;rjmp service_ADCC ;прерывание от АЦП 0xCFF1

28. rjmp 0 ;rjmp service_ERDY ;завершение записи в EEPROM 0xCFF0

29. rjmp 0 ;rjmp service_ACI ;прерывание от компаратора 0xCFEF

30. rjmp 0 ;rjmp service_TWI ;прерывание от модуля TWI 0xCFEE

31. rjmp 0 ;rjmp service_SPMR ;завершение выполнения spm 0xCFED

33. initial: ldi temp, low (RAMEND) ;0xE50F

34. out SPL,temp ;0xBF0D

35. ldi temp, high (RAMEND) ;0xE004

36. out SPH,temp ;0xBF0E

37. cbi PORTB,LED ;0x98C2

38. sbi DDRB,LED ;0x9ABA

39. ldi temp,1«LED ;0xE004

40. main: in buffer,PORTB ;0xB318

41. eor buffer,temp ;0x2710

42. out PORTB,buffer ;0xBB18

43. rcall delay ;0xD001

44. rjmp main ;0xCFFB

45. delay: ldi XH, high ( PAUSE ) ;0xECB3

46. ldi XL, low ( PAUSE ) ;0xE5A0

47. sbiw XH:XL,1 ;0x9711

48. brne PC-1 ;0xF7F1

В строках 1…3 приведено 3 возможных варианта оформления комментариев. Комментарий в строке 1, начинающийся со знака “;”, распознается любым ассемблером и поэтому является наиболее предпочтительным. Комментарии в строках 2 и 3 подобны тем, которые используются в нотациях языков высокого уровня. Последний из них дает возможность выделить сразу несколько строк (маркерами начала и конца фрагмента текста является “/*” и “*/” соответственно).

Как написать программу на Assembler часть 1

В строке 5 директивой .include к программе подключается стандартный заголовочный файл «m8def.inc». Необязательные директивы .nolist и .list (строки 4 и 6 соответственно) запрещают вывод содержимого подключаемого файла в файл листинга.

Все директивы допускается размещать в одной строке. Так, например, можно было бы записать
.nolist .include «m8def.inc» .list

Несмотря на это, желательно придерживаться правильного стиля программирования, в соответствии с которым в одной строке должна быть расположена только одна директива ассемблера.

Объявление констант находится в строках 7 и 8. Константе LED присваивается номер линии ввода-вывода PB2 = 2, описание которой находится в заголовочном файле. В строках 9 и 10 двум рабочим РОНам назначаются пользовательские имена.

Секция рабочего кода открывается директивой .cseg в строке 11. Директива .org 0 (строка 12) устанавливает начальный адрес в памяти программ. В строке 13 должна находиться инструкция перехода на метку начала основной программы initial.

Метка представляет собой адрес в пределах секции кода или данных. В ассемблере AVR она должна быть записана в начале строки и завершаться в конце двоеточием.

Конечно, адрес в команде может быть указан и явно. В данном примере его можно задать безошибочно (rjmp 0x20 вместо rjmp initial). Но, это возможно только потому, что директива .org 0x20 (строка 32) заставляет компилятор поместить команду в строке 33 по адресу 32-го слова FLASH-памяти программ.

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

На месте каждого неиспользуемого в программе прерывания желательно поставить “заглушки” в виде команды возврата rjmp 0 или reti, как это сделано в строках 14…31.

В строках 33…39 производится инициализация ресурсов микроконтроллера. Любая программа обязательно должна начинаться с установки начального значения указателя стека (если он имеется). В строках 33…36 в SPH:SPL заносится значение RAMEND = 0x045F (вершина стека перемещается в самый верх SRAM). Для выделения младшего и старшего полубайтов константы RAMEND используются встроенные функции low(RAMEND)=0x5F и high(RAMEND)=0x04 соответственно.

Читайте также:
Что такое программа вайбер

Далее разряд LED в регистре данных порта B сбрасывается на 0 (стока 37), а сама линия управления светодиодом настраивается на вывод (стока 38). В строке 39 в регистр temp заносится константа 1

ldi temp,(1«PB0)|(1«PB5) или ldi temp,(1«PB0)+(1«PB5) ;temp

out DDRB,temp ;DDRB

Код в строках 40…44 представляет собой тело основной программы. В регистр buffer считывается текущее состояние порта данных PORTB (строка 40).

Далее между содержимым buffer и temp производится операция “Исключающее ИЛИ” (строка 41), после чего модифицированное содержимое buffer снова выводится в порт (строках 42). В результате такого действия логический уровень на линии PB2 изменится на противоположный. В строке 43 происходит вызов подпрограммы задержки времени delay (≈200 мс), а в строке 44 расположена инструкция перехода на метку main. Так образуется основной цикл программы, в котором происходит постоянное повторение операторов в строках 40…44: инвертирование уровня на выводе LED, задержка, затем снова инвертирование и т.д.

Внутри подпрограммы delay в регистровую пару XH:XL заносится число PAUSE = 50000, определяющее длительность задержки времени (строки 45, 46). В строке 47 из содержимого XH:XL вычитается 1. Команда условного перехода в строке 48 проверяет, значение флага Z из SREG. Если Z = 1 (результат предыдущей операции не равен нулю), то управление передается на строку 47. Так будет повторяться до тех пор, пока не выполнится условие XH:XL = 0 (т.е. пока не пройдет 50000 циклов вычитания). Команда выхода ret в строке 49 возвращает управление в то место основной программы, с которого произошел вызов delay.

Отдельно стоит обратить внимание на встроенную в ассемблер переменную PC в строке 48. Она представляет собой текущее содержимое программного счетчика. Адрес PC-1 будет указывать на предыдущее слово в памяти программ микроконтроллера. В данном случае в этом слове находится команда sbiw XH:XL,1. Использовать PC очень удобно для программных переходов в небольших пределах.

Однако здесь всегда необходимо помнить, что у микроконтроллеров AVR имеются команды, которые имеют размер в 2 16-разрядных слова программ (lds Rd,k, jmp k и др.), из-за чего при вычислении смещения необходимо будет добавлятьотнимать к PC значение 2 вместо 1 на каждую такую инструкцию.

Справа, в листинге приведен машинный код, который будет сгенерирован после компиляции программы.

  • Принцип работы Ассемблера в AVR Studio
  • Синтаксис Ассемблера AVR Studio
  • Директивы Ассемблера AVR Studio
  • Содержимое заголовочного файла AVR Studio
  • Структура программы на Ассемблере в AVR Studio
  • Макросы в Ассемблере AVR Studio
  • Программирование математических операций на Ассемблере в AVR Studio
  • Знаковые целые числа в Ассемблере AVR Studio
  • Преобразование чисел. Изменение масштаба числовых величин в ассемблере AVR Studio

Источник: webhamster.ru

Русские Блоги

Создание, эксплуатация и отладка программы на ассемблере

Эксперимент 1 Сборка, запуск и отладка программ на ассемблере

1. Цель эксперимента

  • Знаком со средой разработки на ассемблере.
  • Освоить использование программного обеспечения EMU8086.
  • Понимать структуру программы на ассемблере и отлаживать простую программу.
  • Понять смысл режима адресации.

1.EMU8086использование

(1) Запустите программу EMU8086, и появится диалоговое окно, показанное на рисунке ниже. Вы можете выбрать новый для создания новой программы на языке ассемблера или открыть пример кода, чтобы прочитать пример программы.

Рисунок 1.1 Окно запуска программы Рисунок 1.1 Окно запуска программы

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

Рисунок 1.2 Окно выбора шаблона программы

(2) ВыборEXEШаблон, нажмитеokПоявляется интерфейс редактирования исходного кода, как показано ниже:

Рисунок 1.3 Окно редактирования исходной программы, созданной шаблоном Рисунок 1.3 Окно редактирования исходной программы, созданной шаблоном

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

После редактирования нажмите кнопку «Сохранить», чтобы сохранить исходный файл сборки с расширением .asm. Шаблон предоставляет формат исходного кода полного определения сегмента. Если вы хотите использовать упрощенный формат определения сегмента, вы можете работать, как показано в интерфейсе выбора шаблона, чтобы создать пустой шаблон.

Рисунок 1.4 Создание пустой шаблонной диаграммы

Выберите пустое рабочее пространство и нажмите кнопку ОК, чтобы открыть окно, показанное ниже.

Рисунок 1.5 Окно редактирования исходной программы, созданное пустым шаблоном Рисунок 1.5 Окно редактирования исходной программы, созданное пустым шаблоном

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

Рисунок 1.6. Введите и сохраните исходную программу в пустом окне редактирования и сохраните

(3) Компиляция и работа программы

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

Рисунок 1.7 Окно статуса компиляции Рисунок 1.7 Окно статуса компиляции

Рисунок 1.8 Рабочий каталог и список сгенерированных файлов Рисунок 1.8 Рабочий каталог

Нажмите кнопку запуска в окне состояния ассемблера, чтобы запустить исполняемый файл.

Рисунок 1.9 Информация о текущем состоянии программы

Читайте также:
На каком языке программы Андроид

Рисунок 1.10 Окно вывода программной симуляции Рисунок 1.10 Окно вывода программной симуляции

(4) Отладка программы

Нажмите кнопку эмуляции на рисунке 1.6, чтобы начать отладку программы. Конкретные методы отладки см. В разделе «Использование программного обеспечения эмуляции Emu8086» (поставляется вместе с пакетом сжатия программного обеспечения).

Рисунок 1.11 Окно моделирования и отладки Рисунок 1.11 Окно моделирования и отладки

Рисунок 1.12 Окно отображения исходного кода Рисунок 1.12 Окно отображения исходного кода

Под руководством файла «Emu8086 Simulation Software Usage Method», пожалуйста, поймите функции и методы использования каждой команды меню и функциональной кнопки в окне отладки имитации на рисунке 1.11, а также изучите использование средств отладки и методов отладки программ на языке ассемблера.

2.Экспериментальные требования

(1) Серьезно изучить функции и использование программы моделирования Emu8086;

(2) Овладеть процессом создания и отладки программы на языке ассемблера 8086;

(3) Овладеть использованием основных инструкций и утверждений псевдоинструкций;

(4) Понять режим адресации и преобразование логических и физических адресов.

(5) Запишите процесс эксперимента и результаты, заполните и отправьте отчет об эксперименте. Формат отчета об эксперименте см. В шаблоне отчета об эксперименте.

3. Экспериментальные результаты

Сохраните адрес сегмента кода сегмента в DS и ES

Добавьте данные 7777h в AX и 1111h в переменную dvar и сохраните результат в ax

Данные последнего регистра

Короткий адрес сегмента данных начинается с 0710

4. Экспериментальное резюме

В этом эксперименте я знаком со средой разработки на языке ассемблера, освоил использование EMU8086, как создать программу на языке ассемблера, как просмотреть данные в регистре и данные в памяти, одношаговую операцию и установить точки останова. Я написал простую программу, основанную на учебнике, в которой были определены байтовые переменные, переменные слова, переменные двойного слова и константы, а в сегмент кода добавлены такие инструкции, как mov, add и dec. Прямая адресация, немедленная адресация, относительная адресация регистра и другие методы адресации также используются в инструкциях.

Я также столкнулся с различными проблемами в эксперименте, поэтому программное обеспечение не может распознать «?». Когда я определяю переменную в разделе данных программы, введите? Когда вы получаете ошибку, вы должны заменить ее на 0. Еще одна проблема array db 2 dup(2,3,2 dup(4)) , При определении таких переменных, правильный результат должен состоять в том, чтобы определить 8 байт пространства, данные — 02, 03, 04, 04, 02, 03, 04, 04, но результат этой операции программного обеспечения — 02, 03, 02, 02 , 03, 02, не распознал dup (4) в скобках, это программное обеспечение не может выполнить такое вложенное определение.

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

приложение

; multi-segment executable file template.

Источник: russianblogs.com

Ассемблер под windows для чайников часть 1

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

Прежде всего замечу, что в названии главы есть некоторая натяжка, т.к. технологии трансляции и в MS DOS, и в Windows весьма схожи. Однако программирование в MS DOS уходит в прошлое. Рис.1.1.1. Схема трансляции ассемблерного модуля. Двум стадиям трансляции (Рис.1.1.1) соответствуют две основные программы: ассемблер ML.EXE и редактор связей LINK.EXE 7 (или TASM32.EXE и TLINK32.EXE в Турбо Ассемблере).

Пусть файл с текстом программы на языке ассемблера называется PROG.ASM, тогда, не вдаваясь в подробный анализ, две стадии трансляции будут выглядеть следующим образом: c:masm32binml /c /coff PROG.ASM — в результате появляется модуль PROG.OBJ, а также c:masm32binlink /SUBSYSTEM:WINDOWS PROG.OBJ — в результате появляется исполняемый модуль PROG.EXE. Как Вы, я надеюсь, догадались /с и /coff являются параметрами программы ML.EXE, a /SUBSYSTEM:WINDOWS является параметром для программы LINK.EXE.

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

Установив стандарт на структуру объектного модуля, мы получаем возможность: а) использовать уже готовые объектные модули, б) стыковать между собой программы, написанные на разных языках. Но самое прекрасное здесь то, что если стандарт объектного модуля распространить на разные операционные системы, то можно использовать модули, написанные в разных операционных системах 8 . Чтобы процесс трансляции сделать для Вас привычным, рассмотрим несколько простых, «ничего не делающих» программ.

На Рис. 1.1.2 представлена «ничего не делающая» программа. Назовем ее PROG1. Сразу отмечу на будущее: команды микропроцессора и директивы макроассемблера будем писать заглавными буквами. Итак, чтобы получить загружаемый модуль, выполним следующие команды: или для Турбо Ассемблера Примем пока параметры трансляции программ как некую данность и продолжим наши изыскания.

Часто удобно разбить текст программы на несколько частей и объединять эти части еще на 1-й стадии трансляции. Это достигается посредством директивы INCLUDE. Например, один файл будет содержать код программы, а константы, данные (определение переменных) и прототипы внешних процедур помещаются в отдельные файлы. Часто такие файлы записывают с расширением .INC.

Читайте также:
Программа которая создает загрузочный диск

Именно такая разбивка демонстрируется в следующей программе (Рис.1.1.3). Программа на Рис. 1.1.3 также достаточно бессмысленна (как и все программы данной главы), но зато демонстрирует удобства использования директивы INCLUDE. Напомню, что мы не останавливаемся в книге на очевидных командах микропроцессора. Замечу только по поводу команды IDIV.

В данном случае команда IDIV осуществляет операцию деления над операндом, находящемся в паре регистров EDX:EAX. Обнуляя EDX, мы указываем, что операнд целиком находится в регистре EAX. Трансляция программы осуществляется так, как это было указано ранее для ассемблеров MASM и TASM. Замечание о типах данных.

В данной книге Вы встретитесь в основном с тремя типами данных (простых): байт, слово, двойное слово. При этом используются следующие стандартные обозначения. Байт — BYTE или DB, слово — WORD или DW, двойное слово — DWORD или DD. Выбор, скажем, в одном случае DB, а в другом BYTE, продиктован лишь желанием автора несколько разнообразить изложение.

7 Программу LINK.EXE называют также компоновщиком или просто линковщиком. 8 Правда, весьма ограниченно, т.к. согласование системных вызовов в разных операционных системах может весьма сильно различаться.

Объединение модулей далее производится элементарно: Для работы с библиотекой в пакете TASM имеется программа — библиотекарь TLIB.ЕХЕ. Создание библиотеки, состоящей из модуля PROG2.OBJ, производится по команде В результате на диске появится библиотека LIB1.LIB. Далее компонуем модуль PROG1.OBJ с этой библиотекой: В результате получается загружаемый модуль PROG1.EXE.

Вообще, стоит разобраться с командной строкой TLINK32 более подробно. В расширенном виде 11 эта строка выглядит следующим образом: OBJFILES — один или несколько объектных файлов (через пробел). Первый главный модуль. EXEFILE — исполняемый модуль.

Редакторы. Хотя сам я никогда не использую специализированные редакторы для написания программ на ассемблере, полноты ради кратко расскажу о двух известных мне редакторах. Начну с редактора QEDITOR.EXE, который поставляется вместе с пакетом MASM32. Сам редактор и все сопутствующие ему утилиты написаны на ассемблере. Анализ их размера и возможностей действительно впечатляет.

Например, сам редактор имеет длину всего 27 Кб, а утилита, используемая для просмотра отчетов о трансляции — всего 6 Кб. Редактор вполне годится для работы с небольшими одномодульными приложениями. Для работы с несколькими модулями он не очень удобен. Работа редактора основана на взаимодействии с различными утилитами посредством пакетных файлов.

Например, трансляцию программ осуществляет пакетный файл ASSMBL.BAT, который использует ассемблер ML.EXE, а результат ассемблирования направляется в текстовый файл ASMBL.TXT. Далее для просмотра этого файла используется простая утилита THEGUN.EXE. Аналогично осуществляется редактирование связей.

Для дизассемблирования исполняемого модуля используется утилита DUMPPE.EXE, результат работы этой утилиты помещается в текстовый файл DISASM.TXT. Аналогично осуществляются и другие операции. Вы легко сможете настроить эти операции, отредактировав соответствующий пакетный файл с модификацией (при необходимости) используемых утилит (заменив, например, ML.EXE на TASM32.EXE и т.п.).

Вторая программа, с которой я хочу познакомить читателя, это EAS.EXE (Easy Assembler Shell). Редактор, а точнее оболочка, позволяет создавать и транслировать довольно сложные проекты, состоящие из ASM-,OВJ-,RC-,RES-,DEF-файлов. Программа позволяет работать как с TASM, так и MASM, а также с другими утилитами (отладчиками, редакторами ресурсов и т.д.).

Непосредственно в программе можно настроить компиляторы и редакторы связей на определенный режим работы путем задания ключей этих утилит. Отладчики позволяют исполнять программу в пошаговом режиме. В IV части книги мы более подробно будем рассматривать отладчики и дизассемблеры. Приведу несколько наиболее известных отладчиков 14 : CodeView (Микрософт), Turbo Debugger (Borland), Ice.

Дизассемблеры переводят исполняемый модуль в ассемблерный код. Примером простейшего дизассемблера является программа DUMPPE.EXE, работающая в строковом режиме. Пример работы программы DUMPPE.EXE представлен на Рис. 1.1.11. Здесь дизассемблируется программа, приведенная на Рис.1.1.5.

Ну как, узнали нашу программу? Смысл обозначений будет ясен из дальнейшего изложения. Рис. 1.1.11. Пример дизассемблированш программы с помощью DUMPPE.EXE. Отмечу также дизассемблер W32Dasm, который подробно будет описан в последней части книги, и знаменитый дизассемблер IDA Pro. В части IV мы будем подробно рассматривать и сами дизассемблеры, и методику их использования.

Нех-редакторы позволяют просматривать и редактировать загружаемые модули в шестнадцатеричном виде. Их великое множество, к тому же отладчики и дизассемблеры, как правило, имеют встроенные НЕХ-редакторы. Отмечу только, весьма популярную в хакерских кругах программу HIEW.EXE. Эта программа позволяет просматривать загружаемые модули как в шестнадцатеричном виде, так и в виде ассемблерного кода. И не только просматривать, но и редактировать.

В пакетах MASM32 и TASM32 есть компиляторы ресурсов, которые будут описаны ниже. Это программы RC.EXE и BRC32.EXE соответственно. Обычно я пользуюсь редактором ресурсов из пакета ВС5 (Borland C++ 5.0) Простые ресурсы можно создавать в обычном текстовом редакторе. Язык описания ресурсов будет подробно рассмотрен далее. Источник

Источник: onecomp.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru