Если условие выполняется, то содержимое счетчика команд меняется на величину (Смещения). Мнемоника проверяемых условий:
Условие | Объяснение | Проверяемые флаги |
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
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения 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