Как получить листинг программы

Если условие выполняется, то содержимое счетчика команд меняется на величину (Смещения). Мнемоника проверяемых условий:

Условие Объяснение Проверяемые флаги
NEQ не равно Z=0
EQ равно Z=1
GT больше Z=0 и N=0
GEQ больше или равно (не меньше) N=0
LT меньше N=1
LEQ меньше или равно (не больше) Z=1 или N=1
HI выше C=1 и Z=0
HIS, C выше или тоже самое C=1
LO, NC ниже, переноса нет C=0
LOS ниже или тоже самое C=0 или Z=1
NOV нет переполнения. V=0
OV переполнение V=1
NTC бит теста не установлен TC=0
TC бит теста установлен. TC=1
NBIO входной сигнал BIO нулевой BIO=0
UNC безусловный
Инструкция. Мнемоника Действие
ADDB ADDB XARn, #7bit #7bit — 7-битовая константа без знака XARn = XARn + #7bit
ADRK ADRK XARn, #8bit #7bit — 8-битовая константа без знака XARn = XARn + #8bit
ADDK addk (.unit) cst, dst .unit =.S1,.S2 cst+dst => dst
SUB SUBU sub (.unit) src1, src2, dst .unit =.L1,.L2, S1, S2 src1=src2 => dst
ABS abs (.unit) src, dst .unit =.L1,.L2 abs(src) => dst
B b (.unit) label .unit = S1, S2
CMPEQ cmpeq (.unit) src1, src2, dst .unit =.L1,.L2 1 => dst при src1=src2
CMPGT CMPGTU cmpgt (.unit) src1, src2, dst .unit =.L1,.L2 1 => dst при src1>src2
CMPLT CMPLTU cmplt (.unit) src1, src2, dst .unit =.L1,.L2 1 => dst при src1
MPY MPYU mpy (.unit) src1, src2, dst .unit =.M1,.M2 src1*src2 => dst
MV mv (.unit) src, dst .unit =.L1,.L2, S1,.S2,.D1,.D2 src => dst
MVK mvk (.unit) cst, dst .unit =.S1,.S2 cst => dst
NEG neg (.unit) src, dst .unit =.L1,.L2,.S1,.S2 =src => dst
NOP nop
STB STH STW stb (.unit) src, *+baseR[offserR] .unit =.D1,.D2 src => baseR[offsetR]
LDB LDH LDW ldb (.unit) *+baseR[offserR], dst .unit =.D1,.D2 baseR[offsetR] => dst
AND and (.unit) src1, src2, dst .unit =.L1,.L2, S1, S2 src1 AND src2 => dst
OR or (.unit) src1, src2, dst .unit =.L1,.L2,.S1,.S2 src1 OR src2 => dst
XOR xor (.unit) src1, src2, dst .unit =.L1,.L2, S1, S2 src1 XOR src2 => dst
NOT not (.unit) srt, dst .unit =.L1,.L2,.S1,.S2
SHL shl (.unit) src2, src1, dst .unit =.S1,.S2 (src2 на src1) => dst
SHR shr (.unit) src2, src1, dst .unit =.S1,.S2 (src2 на src1) => dst
Инструкция Мнемоника Действие
ABSSP ABSDP abssp (.unit) src, dst .unit =.S1,.S2 absdp(src) => dst
ADDSP ADDDP addsp (.unit) src1, src2, dst .unit =.L1,.L2 src1+src2 => dst
SUBSP SUBDP subsp (.unit) src1, src2, dst .unit =.L1,.L2 src1+src2 => dst
CMPEQSP CMPEQDP cmpeqsp (.unit) src1, src2, dst .unit =.S1,.S2 1 => dst при src1=src2
CMPGTSP CMPGTDP cmpgtsp(.unit) src1, src2, dst .unit =.S1,.S2 1 => dst при src1>src2
CMPLTSP CMPLTDP cmpltsp (.unit) src1, src2, dst .unit =.S1,.S2 1 => dst при src1
MPYSP MPYDP mpysp (.unit) src1, src2, dst .unit =.M1,.M2 src1*src2 => dst
SPINT spint (.unit) src, dst .unit =.L1,.L2 src1 => dst
INTSP intsp (.unit) src, dst .unit =.L1,.L2 src1 => dst
DPINT dpint (.unit) src, dst .unit =.L1,.L2 src1 => dst
INTDP intdp (.unit) src, dst .unit =.L1,.L2 src1 => dst
DPSP dpsp (.unit) src, dst .unit =.L1,.L2 src1 => dst
SPDP spdp (.unit) src, dst .unit =.L1,.L2 src1 => dst
Читайте также:
С помощью каких программ можно произвести загрузку файлов в глобальной сети интернет

Листинг программы показывает исходные инструкции и объектный код, который они производят. Чтобы получить файл листинга, вызовите ассемблер с опцией — L. Листинг печатается постранично. Незаполненную строку и строку заголовка, имеют наверху каждая страница распечатки. Любой заголовок, определенный.title директивой, печатается в строке заголовка.

Код Жизни. Тестовые программы CL. Как получить МНОГО

4 СПОСОБА РЕАЛЬНО ЗАРАБОТАТЬ ПРОГРАММИСТУ

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

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

Пример показывает листинг ассемблера.

Источник: studopedia.su

Листинг исходного текста программы с помощью github?

У меня есть программа на github. Нужно (желательно автоматически и быстро) сделать полный листинг исходного кода в формате html или odt, pdf для подачи заявки в патентное бюро. Можно ли это сделать при помощи самого github?

Отслеживать
46.4k 16 16 золотых знаков 56 56 серебряных знаков 97 97 бронзовых знаков
задан 4 мар 2015 в 6:16
908 1 1 золотой знак 6 6 серебряных знаков 17 17 бронзовых знаков

Написал скрипт для Python, который решает эту задачу без github. Как наберу 50 «чатлов», выложу его здесь.

6 мар 2015 в 7:43
6 мар 2015 в 8:15

У меня в проекте 30 файлов, что, все копироватьвставлять? А если я завтра код исправлю, что, опять все заново? Или старательно выискивать исправления и синхронизировать листинг? P.S. А когда я говорил о патенте на код?

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

6 мар 2015 в 12:42

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Мой ответ — никак. Можно использовать дополнительный скрипт, например такой

#! /usr/bin/python3 import os from subprocess import call def get_filepaths(directory): «»» This function will generate the file names in a directory tree by walking the tree either top-down or bottom-up. For each directory in the tree rooted at directory top (including top itself), it yields a 3-tuple (dirpath, dirnames, filenames). «»» file_paths = [] # List which will store all of the full filepaths. # Walk the tree. for root, directories, files in os.walk(directory): files = [f for f in files if not f[0] == ‘.’ and not f == ‘getlisting.py’] directories[:] = [d for d in directories if not d[0] == ‘.’] for filename in files: # Join the two strings in order to form the full filepath. filepath = os.path.join(root, filename) fileName, fileExtension = os.path.splitext(filepath) if fileExtension==’.py’ or fileExtension==’.ui’: file_paths.append(filepath) # Add it to the list. return file_paths # Self-explanatory. files = get_filepaths(«.») listing = open(«listing.tex»,»w», encoding=’cp1251′) listing.write(r»»»documentclass usepackage[russian] usepackage»»») listing.write(r»»» usepackage % Include the listings-package usepackage usepackage «»») listing.write(r»»»usepackage[left=2cm, top=2cm, right=0.5cm, bottom=20mm,»»») listing.write(r»»»nohead, nofoot] «»») listing.write(r»»» renewcommand*contentsname begin «»») listing.write(r»»» begin newcommand<HRule><rule<linewidth>> % Defines a new command for the horizontal lines, change thickness here center % Center everything on the page %—————————————————————————————- % HEADING SECTIONS %—————————————————————————————- textsc<LARGE Национальная Академия Наук>\[1.5cm] % Name of your university/college textsc<Large Институт Автоматики и Информационных Технологий>\[0.5cm] % Major heading such as course name textsc<large Лаборатория>\[3cm] % Minor heading such as course title %—————————————————————————————- % TITLE SECTION %—————————————————————————————- HRule \[0.4cm] < huge bfseries Листинг исходного текста>\[0.4cm] % Title of your document < huge bfseries программных средств>\[0.4cm] % Title of your document HRule \[1.5cm] %—————————————————————————————- % AUTHOR SECTION %—————————————————————————————- % If you don’t want a supervisor, uncomment the two lines below and remove the section above Large emph\ с.н.с. И.И. textsc\[3cm] % Your name %—————————————————————————————- % LOGO SECTION %—————————————————————————————- includegraphics\[1cm] % Include a department/university logo — this will require the graphicx package %—————————————————————————————- %—————————————————————————————- % DATE SECTION %—————————————————————————————- <large today>\[3cm] % Date, change the today to a set date if you want to be precise vfill % Fill the rest of the page with whitespace end «»») listing.write(r»»» tableofcontents clearpage»»») listing.write(r»»» section «»») for f in files: fileName, fileExtension = os.path.splitext(f) if fileExtension == ‘.py’: listing.write(r»»» subsection<protecturl<«»»+f+»»»>> «»») listing.write(r»lstinputlisting[language=Python, breaklines=true]») listing.write(r»») listing.write(«n») listing.write(r»»» section «»») for f in files: fileName, fileExtension = os.path.splitext(f) if fileExtension == ‘.ui’: listing.write(r»»» subsection<protecturl<«»»+f+»»»>> «»») listing.write( r»lstinputlisting[language=XML, breaklines=true]») listing.write(r»») listing.write(«n») listing.write(r»»» end»»») listing.close() call([«pdflatex», «listing.tex»])
Отслеживать
ответ дан 7 мар 2015 в 14:08
908 1 1 золотой знак 6 6 серебряных знаков 17 17 бронзовых знаков

  • python
  • python-3.x
  • github
    Важное на Мете
Читайте также:
Как установить программа mysql

Похожие

Подписаться на ленту

Лента вопроса

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

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник: ru.stackoverflow.com

Изучение листинга ассемблирования, генерируемого компилятором C++ — часть 1

Компилятор VC++ может создать текстовый файл, показывающий ассемблерный код, сгенерированный для файла C/C++ file. Этот файл позволяет узнать, какой вид кода генерирует компилятор. Файл дает хорошее представление о ряде принципов, таких как обработка исключений, таблицы вызова и т.д. Элементарного знания языка ассемблера достаточно для понимания вывода файла листинга. Цель данной статьи (первой в серии из двух статей) – показать, как файл листинга помогает понять внутренние механизмы компилятора C++.

Установка файла листинга

Можно установить параметры компилятора C/C++ для генерации файла листинга в диалоговом окне «Настройки проекта VC6», как показано ниже.

В VC++.NET можно установить тот же параметр в диалоговом окне «Свойства проекта».

Компилятор генерирует следующие разные типы листинга:

1. Только ассемблерный код (.asm)
2. Ассемблерный код и машинный код. (.cod)
3. Ассемблерный код вместе с исходным кодом. (.asm)
4. Ассемблерный код вместе с машинным и исходным кодом. (.cod)

Просмотр файла листинга

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

#include

int main(int argc, char* argv[])
printf(«Hello World!»);
return 0;
>

1. Листинг только ассемблера (/FA)

Листинг ассемблирования помещается в файл с расширением .asm в промежуточном каталоге. Например, если имя файла — main.cpp, то в промежуточном каталоге появится файл main.asm. Ниже приведен фрагмент кода главной функции из файла листинга:

• Строки, начинающиеся с ; , являются комментариями
• PUBLIC _main означает, что функция _main используется совместно с другими файлами (в отличие от статических функций). У статических функций нет префикса.
• CONST SEGMENT указывает начало сегмента данных CONST. Компилятор VC++ помещает в эту секцию постоянные данные, такие как строки. Видно, что строка «Hello World» помещается в сегмент CONST. Изменение любых данных в сегменте вызывает генерацию исключения нарушения доступа. Подробнее об этом позже.
• _TEXT SEGMENT отмечает начало другого сегмента. Компилятор помещает весь код в этот сегмент.
• _argc$ = 8 и _argv$ = 12 указывают стековые положения аргументов argc и argv. В данном случае это значит, что если прибавить 8 к указателю стека (регистр ESP процессора), то получится адрес параметра argc. Для адреса возврата будет смещение 4.
• _main PROC NEAR указывает на начало функции _main. Заметьте, что у функций C (функций, объявленных с extern «C») в начале имени ставится _, у функции C++ имя декорируется.
• Видно, что компилятор проталкивает адрес строки «Hello World» в стек и вызывает функцию printf. После окончания вызова функции указатель стека увеличивается на 4 (так как printf имеет соглашение о вызовах C).
• EAX – регистр, хранящий возвращаемое значение функции. EAX подвергается операции «исключающее или» сам с собой. (Это быстрый способ привести регистр к нулю.) Причина состоит в том, что содержимое оригинального кода возвращает 0 из функции main.
• Наконец, ret 0 – команда возврата из функции. Числовой аргумент 0, идущий за командой ret, указывает число, на которое надо увеличить указатель стека.

Читайте также:
Программа бонус ростелеком платная или нет

Это был листинг только ассемблера. Посмотрим, как выглядят три остальных листинга.

2. Ассемблер с исходным кодом (/FAs)

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

3. Ассемблер с машинным кодом (/FAc)

Листинг показывает коды команд вместе с мнемониками команд. Этот листинг обычно генерируется в файле .cod. В данном примере листинг окажется в файле main.cod.

4. Ассемблер, машинный и исходный код (/FAsc)

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

Были рассмотрены все четыре типа листинга, генерируемые компилятором. Обычно нет необходимости смотреть на машинный код. Большей частью ассемблер с исходником (/FAs) – самый полезный листинг.

Посмотрев разные типы листингов и как генерировать листинги, узнаем, какую полезную информацию можно собрать из листинга.

Сегмент Const

Компилятор поместил постоянную строку «Hello World» в сегмент CONST. Последствия этого показаны на следующем пробном приложении.

#include

char* szHelloWorld = «Hello World»;

int main(int argc, char* argv[])
printf(szHelloWorld);

szHelloWorld[1] = ‘o’;
szHelloWorld[2] = ‘l’;
szHelloWorld[3] = ‘a’;
szHelloWorld[4] = »’;

printf(szHelloWorld);

return 0;
>

Сначала это пробное приложение печатает «Hello World», пытается преобразовать строку «Hello» в «Hola'» и в конце печатает измененную строку. Скомпонуем и запустим приложение. Оно аварийно завершит работу с исключением нарушения доступа и строкой szHelloWorld[2] = ‘l’;.

char* szHelloWorld = «Hello World»;
char szHelloWorld[] = «Hello World»;

На этот раз приложение успешно запустится. Изучение листинга показывает причину.

1. В первом случае данные «Hello World» помещаются в сегмент CONST, являющийся неизменяемым сегментом

2. Во втором случае данные помещаются в сегмент _DATA, являющийся сегментом для чтения и записи

Источник: www.cyberguru.ru

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