<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://emuverse.ru/w/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A%2F%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_12-91%2F%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B</id>
	<title>Радио-86РК/Радио 12-91/Перемещаемые программы - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://emuverse.ru/w/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A%2F%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_12-91%2F%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B"/>
	<link rel="alternate" type="text/html" href="https://emuverse.ru/w/index.php?title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_12-91/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B&amp;action=history"/>
	<updated>2026-04-30T13:48:02Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://emuverse.ru/w/index.php?title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_12-91/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B&amp;diff=2935&amp;oldid=prev</id>
		<title>Barsik: исправил опечатки и форматирование в исходнике</title>
		<link rel="alternate" type="text/html" href="https://emuverse.ru/w/index.php?title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_12-91/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B&amp;diff=2935&amp;oldid=prev"/>
		<updated>2020-02-18T05:06:48Z</updated>

		<summary type="html">&lt;p&gt;исправил опечатки и форматирование в исходнике&lt;/p&gt;
&lt;a href=&quot;https://emuverse.ru/w/index.php?title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_12-91/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B&amp;amp;diff=2935&amp;amp;oldid=1232&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Barsik</name></author>
	</entry>
	<entry>
		<id>https://emuverse.ru/w/index.php?title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_12-91/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B&amp;diff=1232&amp;oldid=prev</id>
		<title>Panther: http://retro.h1.ru/RK86/Programm/MovePrg.html</title>
		<link rel="alternate" type="text/html" href="https://emuverse.ru/w/index.php?title=%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE-86%D0%A0%D0%9A/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_12-91/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B&amp;diff=1232&amp;oldid=prev"/>
		<updated>2008-12-10T12:11:11Z</updated>

		<summary type="html">&lt;p&gt;http://retro.h1.ru/RK86/Programm/MovePrg.html&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{ДИ|Автор= Е. ЕРЕМИН | Источник= http://retro.h1.ru/RK86/Programm/MovePrg.html}}&lt;br /&gt;
&lt;br /&gt;
С способность сохранять работоспособность при&lt;br /&gt;
перемещении из одной области памяти в другую является важным достоинством программы,&lt;br /&gt;
особенно если речь идет о системной программе. Обладающий этим свойством фрагмент&lt;br /&gt;
может быть легко и без проблем включен в любое место любой программы, с минимальными&lt;br /&gt;
усилиями переделан для работы на другом компьютере с той же системой команд&lt;br /&gt;
процессора.&lt;br /&gt;
&lt;br /&gt;
Для достижения перемещаемости используют различные&lt;br /&gt;
приемы: размещают в определенной области памяти стандартную таблицу переходов&lt;br /&gt;
, формируют специальную таблицу коррекции BITMAP , применяют особые процедуры&lt;br /&gt;
модификации адресов в командах перехода. Можно, однако заранее позаботиться&lt;br /&gt;
о перемещаемости разрабатываемой программы и получить в результате код мало&lt;br /&gt;
зависящий или, в идеальном случае, совсем не зависящий от места расположения&lt;br /&gt;
в памяти компьютера. Некоторые приемы, позволяющие достичь этого, описаны ниже.&lt;br /&gt;
&lt;br /&gt;
Предполагается, что читатель знаком с основными&lt;br /&gt;
принципами работы микропроцессора КР580ВМ80 и имеет перед собой таблицу с системой&lt;br /&gt;
его команд.&lt;br /&gt;
&lt;br /&gt;
В качестве примера перемещаемой программы рассмотрим&lt;br /&gt;
фрагмент определяющий количество байт в машинной команде. Такая задача часто&lt;br /&gt;
возникает в различного рода дизассемблирующих программах, и разработанная подпрограмма&lt;br /&gt;
может представлять самостоятельный интерес. Исходный текст,&lt;br /&gt;
размещение кодов в памяти и комментарии приведены. Отметим, что адреса команд&lt;br /&gt;
приведены для удобства изложения, в рассматриваемой программе они не используются.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; ПОДПРОГРАММА ОПРЕДЕЛЕНИЯ КОЛИЧЕСТВА БАЙТ В КОМАНДЕ&lt;br /&gt;
; ВХОД: HL - АДРЕС КОМАНДЫ&lt;br /&gt;
; ВЫХОД:В - ЧИСЛО БАЙТ В КОНАНДЕ (0-КОМАНДЫ НЕТ)&lt;br /&gt;
;	С - НАЛИЧИЕ АДРЕСА В КОНАНДЕ (0-НЕТ, 1-ДА)&lt;br /&gt;
;	D - КОД КОНАНДЫ&lt;br /&gt;
; 	HL - СОХРАНЯЕТСЯ АДРЕС КОНАНДИ&lt;br /&gt;
; ВЫЗОВ ПОДПРОГРАННЫ NB ПО ОТНОСИТЕЛЬНОНУ АДРЕСУ&lt;br /&gt;
0120 		ORG 120Н&lt;br /&gt;
0120	110100 		LXI D,1 	; СМЕЩЕНИЕ ДЛЯ АДРЕСА П/П&lt;br /&gt;
0123 	CDZZZZ 		CALL ХХХХ 	; ВЫЗОВ П/П (СМ. ПРИМЕЧАНИЕ)&lt;br /&gt;
0126 	С9 		RET&lt;br /&gt;
; ПОДПРОГРАММА NB (КОЛИЧЕСТВО БАЙТ)&lt;br /&gt;
;&lt;br /&gt;
0127 	010001 		LXI В,100Н&lt;br /&gt;
012А 	7Е 		MOV А,Н 	; КОД КОНАНДЫ&lt;br /&gt;
012В 	57 		MOV D,A 	; СОХРАНИТЬ В D&lt;br /&gt;
012С 	B7 		ORA А&lt;br /&gt;
012D 	С8 		RZ 		; ВЫХОД ПРИ NOP (В=1, С=0)&lt;br /&gt;
012Е 	17 		RAL 		; ПРОВЕРКА НА СОВПАДЕНИЕ&lt;br /&gt;
012F 	17 		RAL 		; ДВУХ СТАРШИХ БИТОВ&lt;br /&gt;
0130 	89 		ADC С 		; 	7=&amp;gt;1,  6=&amp;gt;CY,&lt;br /&gt;
0131 	E601 		AHI 1 		;	1 БИТ+CY+0 (ИЗ РЕГ.С)&lt;br /&gt;
0133 	C0 		RNZ 		; 	3F&amp;lt;КОД&amp;lt;С0&lt;br /&gt;
0134 	7А 		MOV A.D&lt;br /&gt;
0135 	E6E7 		AHI 0E7H&lt;br /&gt;
0137 	FE02 		CPI 2&lt;br /&gt;
0139 	С8 		RZ 		; 	STAX И LDAX (B=1, C=0)&lt;br /&gt;
013A 	7A 		MOV A,D&lt;br /&gt;
013В 	E6CF 		ANI 0CFH&lt;br /&gt;
013D 	FEC1 		CPI 0C1H&lt;br /&gt;
013F 	C8 		RZ 		; 	POP (B=1, C=0)&lt;br /&gt;
0140 	0603 		MVI B,3&lt;br /&gt;
0142 	FE01 		CPI 1&lt;br /&gt;
0144 	С8 		RZ 		; 	LXI (B=3, C=0)&lt;br /&gt;
0145 	0С 		INR С&lt;br /&gt;
0146 	7А 		MOV A,D&lt;br /&gt;
0147 	FEC3 		CPI 0С3Н&lt;br /&gt;
0149 	С8 		RZ 		; 	JMP (B=3, C=1)&lt;br /&gt;
014A 	FECD 		CPI 0CDH&lt;br /&gt;
014C 	C8 		RZ		; 	CALL (B=3, C=1)&lt;br /&gt;
014D 	0D 		DCR С&lt;br /&gt;
014E 	41 		MOV В,С&lt;br /&gt;
014F 	E6CF 		ANI 0CFH&lt;br /&gt;
0151 	FECD 		CPI 0CDH 	; 	КОДЫ DD-FD (B=0, C=0)&lt;br /&gt;
0153 	С8 		RZ 		; 	НЕТ КОМАНД&lt;br /&gt;
0154 	04 		INR В&lt;br /&gt;
0155 	E607 		ANI 7&lt;br /&gt;
0157 	FE05 		CPI 5&lt;br /&gt;
0159 	С8 		RZ 		; 	DCR, DCX, PUSH (B=1, C=0)&lt;br /&gt;
015A 	FE07 		CPI 7&lt;br /&gt;
015C	C8 		RZ 		; 	RST, СДВИГ И Т.Д. (В=1, С=0)&lt;br /&gt;
015D 	04 		INR В&lt;br /&gt;
015E 	FE06 		CPI 6 		; 	MVI, ADI, SUI, ORI&lt;br /&gt;
0160 	C8 		RZ 		; 	и т.д. (B=2, C=0)&lt;br /&gt;
0161 	04 		INR В&lt;br /&gt;
0162 	0С 		INR С&lt;br /&gt;
0163 	FE02 		CPI 2 		; 	УСЛОВНЫЕ ПЕРЕХОДЫ, SHLD.&lt;br /&gt;
0165 	C8 		RZ 		; 	LHLD, STA, LDA (В=3, С=1)&lt;br /&gt;
0166 	7А 		MOV A,D&lt;br /&gt;
0167 	Е6С7 		ANI 0С7Н&lt;br /&gt;
0169 	FEC4 		CPI 0C4H 	; 	УСЛОВНЫЙ ВЫЗОВ&lt;br /&gt;
016В 	С8 		RZ 		; 	ПОДПРОГРАММЫ (В=З, С=1)&lt;br /&gt;
016С 	0D 		DCR С&lt;br /&gt;
016D 	41 		MOV В,С&lt;br /&gt;
016Е 	7A 		MOV A,D&lt;br /&gt;
016F 	Е6С7 		AHI 0C7H 	; 	КОДЫ 10-30, 08-З8 (В=0, С=0)&lt;br /&gt;
0171 	С8 		RZ 		; 	НЕТ КОМАНД&lt;br /&gt;
0172 	04 		INR В&lt;br /&gt;
0173 	FEC0		CPI 0C0H&lt;br /&gt;
0175 	C8 		RZ 		; 	ВОЗВРАТ ПО УСЛОВИЯМ (В=1, С=0)&lt;br /&gt;
0176 	7А 		MOV A,D&lt;br /&gt;
0177 	FE40 		CPI 40H&lt;br /&gt;
0179 	D8 		RС 		; 	КОД&amp;lt;40(В=1, С=0)&lt;br /&gt;
017A 	FEE0 		CPI 0Е0Н&lt;br /&gt;
017C 	D8 		RNС 		; 	КОД&amp;gt;ВF (В=1, С=0)&lt;br /&gt;
017D 	FEC9 		CPI 0С9Н&lt;br /&gt;
017F	С8 		RZ 		; 	RET (B=1, C=0)&lt;br /&gt;
0180 	04 		INR В&lt;br /&gt;
0181 	E6F7 		ANI 0F7H&lt;br /&gt;
0183 	FED3 		CPI 0D3H&lt;br /&gt;
0105 	C8 		RZ 		; 	IH, OUT (B=2, C=0)&lt;br /&gt;
0106 	41 		MOV В,С 	; 	КОДЫ D9, СВ (В=О, С=0)&lt;br /&gt;
0187 	С9 		RET 		; 	НЕТ КОМАНД&lt;br /&gt;
 	; ПРИМЕЧАНИЕ :&lt;br /&gt;
 	; С АДРЕСА ZZZZ (МЕТКА ХХХХ) ПРЕДВАРИТЕЛЬНО&lt;br /&gt;
 	; ЗАНОСЯТСЯ СЛЕДУЮЩИЕ КОМАНДЫ:&lt;br /&gt;
 	; ZZZZ 	ЕЗ ХХХХ:XTHL 	; ВЫЧИСЛЕНИЕ АБСОЛЮТООГО&lt;br /&gt;
 	; 	EB 	XCHG 	; АДРЕСА НАЧАЛА П/П&lt;br /&gt;
 	; 	19 	DAD D 	; (СМЕЩЕНИЕ ЗАДАНО В DE)&lt;br /&gt;
 	; 	ЕВ 	XCHG 	; С СОХРАНЕНИЕН РЕГИСГРА HL&lt;br /&gt;
 	; 	ЕЗ 	XTHL&lt;br /&gt;
 	; 	D5 	PUSH D 	; АДРЕС НАЧАЛА П/П В СТЕК&lt;br /&gt;
 	; 	С9 	RET 	; ПЕРЕХОД К ПОДПРОГРАММЕ&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описываемый фрагмент состоит из собственно подпрограммы&lt;br /&gt;
определения количества байт в машинной команде, назовем ее NB, и обращения к&lt;br /&gt;
ней. Обращение находится в адресах 120Н—126Н, а далее, начиная с адреса 127Н&lt;br /&gt;
(хотя адрес и не имеет значения), расположена подпрограмма NB, с которой и&lt;br /&gt;
начнем анализ.&lt;br /&gt;
&lt;br /&gt;
Характерной чертой подпрограммы является полное&lt;br /&gt;
отсутствие условных переходов, замененных из соображений перемещаемости возвратом&lt;br /&gt;
по условию. Проверка в этом случае происходит в следующей последовательности:&lt;br /&gt;
задаются выходные значения регистров В и С, соответствующие той или иной группе&lt;br /&gt;
команд; выделяются характерные для этой группы биты; операциями ANI или СРI&lt;br /&gt;
устанавливаются признаки и при выполнении необходимого условия происходит выход&lt;br /&gt;
из подпрограммы. В противном случае анализ кода продолжается аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим несколько примеров. Команда 127 заносит&lt;br /&gt;
в ВС константу, соответствующую однобайтовой операции, и если в ОЗУ по адресу,&lt;br /&gt;
записанному в регистре HL, находится NOP (код 0), то происходит выход из подпрограммы&lt;br /&gt;
(адреса 12СН и 12DH). Затем выделяется вся средняя часть таблицы команд микропроцессора&lt;br /&gt;
КР580ВМ80 (коды в диапазоне 40H—BFH), содержащая однобайтовые команды. Это сделать&lt;br /&gt;
труднее, так как проверить сразу два условия по принятой методике нельзя. Внимательное&lt;br /&gt;
изучение кодов команд показывает, однако, что можно обойтись и одной проверкой:&lt;br /&gt;
при попадании в указанный диапазон два старших бита кода различны, а в противном&lt;br /&gt;
случае они одинаковы (читатели могут убедиться в этом самостоятельно). Для сравнения&lt;br /&gt;
старших битов производятся два циклических сдвига влево через бит переноса CY.&lt;br /&gt;
При этом седьмой (старший) бит оказывается в нулевом бите аккумулятора, а шестой&lt;br /&gt;
попадает в CY. По команде ADC С (адрес 130Н) интересующие нас биты складываются,&lt;br /&gt;
и если они были различны, дают единицу (не забывайте, что в регистре С записан&lt;br /&gt;
0, и он не влияет на результат сложения). Если же при сложении в младшем бите&lt;br /&gt;
получился 0, то анализ необходимо продолжить. Команды 134—139 «распознают» операции&lt;br /&gt;
LDAX и STAX, в коде которых характерными битами являются три младших (с 0 по&lt;br /&gt;
2) и три старших (с 5 по 7). Трем младшим соответствует комбинация 010, а трем&lt;br /&gt;
старшим — 000. Нетрудно убедиться, что после сброса битов 3 и 4 (команда 135)&lt;br /&gt;
результат А-2 гарантирует, что мы имеем дело именно с этой группой команд.&lt;br /&gt;
&lt;br /&gt;
Дальнейший анализ происходит аналогично. Следует&lt;br /&gt;
только иметь в виду, что перед переходом к выявлению команды с другим количеством&lt;br /&gt;
байт необходимо каждый раз предварительно изменять выходные параметры в регистрах&lt;br /&gt;
В и С. Если коду не соответствует команда микропроцессора КР580ВМ80, то в регистровую&lt;br /&gt;
пару ВС подпрограмма выдает 0.&lt;br /&gt;
&lt;br /&gt;
Таким образом, мы убедились, что достаточно сложная&lt;br /&gt;
в логическом отношении программа не содержит ни одного явно заданного адреса,&lt;br /&gt;
а значит, полностью перемещаема. Как же к ней обратиться, если команда CALL&lt;br /&gt;
требует задать абсолютный адрес подпрограммы? Один из возможных вариантов обращения&lt;br /&gt;
использован в нашем примере (адреса 120Н—126Н). По пред полагаемому адресу рабочей&lt;br /&gt;
области памяти (в таблице он заменен символами ZZZZ, ему соответствует метка&lt;br /&gt;
Х XXX) должен быть предварительно занесен небольшой фрагмент приведенный в примечании&lt;br /&gt;
таблице. При обращении к нему происходит вычисление абсолютного адреса начала&lt;br /&gt;
подпрограммы по смещению заданному в регистровой паре DE (в нашем случае адрес&lt;br /&gt;
определяется как 126+1=127).&lt;br /&gt;
&lt;br /&gt;
Коды рассмотренной программы можно перемещать&lt;br /&gt;
по памяти без единого изменения, при этом работоспособность программы полностью&lt;br /&gt;
сохраняется. Требуется, правда, выделить 7 байтов в рабочей области, адреса&lt;br /&gt;
которых заданы «жестко», но, представляется, это незначительная плата за полную&lt;br /&gt;
перемещаемость программы (особенно удобно, если указанные 7 команд размещены&lt;br /&gt;
в ПЗУ).&lt;br /&gt;
&lt;br /&gt;
Автор желает успеха начинающим программистам и&lt;br /&gt;
надеется, что описанные приемы разработки перемещаемых программ будут полезны&lt;br /&gt;
владельцам «Радио-86РК», «Микроши» и других микрокомпьютеров на процессоре КР580ВМ80.&lt;br /&gt;
&lt;br /&gt;
Е. ЕРЕМИН, г. Пермь.&lt;br /&gt;
&lt;br /&gt;
Отсканировано с журнала Радио № 12 1991 г.&amp;lt;br /&amp;gt;&lt;br /&gt;
Отредактировано Лесных Ю.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Радио-86РК/Публикации|66]]&lt;/div&gt;</summary>
		<author><name>Panther</name></author>
	</entry>
</feed>