Изучение микропроцессора серии К580, страница 12

Программа последовательно вызывает подпрограммы с 1 по 5, после чего выполняет выход из каждой подпрограммы в порядке вложенности (сначала из 5, затем из 4 и т.д.) Если убрать инструкцию RET по адресу 050, то выхода из подпрограммы не произойдет, и будет выполняться инструкция по следующему адресу.

Выполнение индивидуального задания – вычисление произведения двух 8-разрядных чисел старшими разрядами вперед с индикацией сомножителей и произведения

Схема алгоритма работы программы при вычислении произведения представлена на рис. 3

 


 


Рис. 3. Схема алгоритма произведения чисел старшими разрядами вперед со сдвигом суммы.

Описание алгоритма индикации

1.  Производится инициализация путем вывода служебных данных в служебные порты.

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

3.  Реализуется задержка путем декрементирования записанных в регистровой паре данных и проверки на равенство нулю.

4.  Производится индикация восьмеричных разрядов произведения по тому же принципу, что и в п.2.

В программе объединены задания по вычислению произведения двух чисел и индикации. Листинг готовой программы приведен в таблице 11.

Таблица 11.

Адреса (L)

Команды

Мнемоника команд

Комментарии

000

041

LXI H

 ;Инициализация начального адреса памяти адресом операнда А: 000 200

001

200

B2

002

000

B3

003

116

MOV С, M

 ;Загрузка первого сомножителя в С

004

043

INX H

005

136

MOV E, M

 ;Загрузка второго сомножителя в Е

006

056

MVI L

 ;Очистка регистра L

007

000

B2

010

026

MVI D

 ;Загрузка в D переменной-счетчика = 8

011

010

B2

012

175

MOV A, L

 ;Загрузка младшей части частичного произведения в аккумулятор

013

303

JMP

 ;Безусловный переход на «заплатку»

014

050

B2

 ;на адрес 000 050

015

000

B3

016

174

MOV A, H

 ;Загрузка старшей части частичного произведения в аккумулятор

017

027

RAL

020

147

MOV H, A

021

173

MOV A, E

022

007

RLC

023

137

MOV E, A

024

322

JNC

 ;Если сдвинутый разряд = 1, складываем частичное произведение с A

025

030

B2

026

000

B3

027

011

DAD B

 ;Сложение 16-разрядных чисел

030

025

DCR D

 ;Декремент счетчика

031

302

JNZ

 ;Проверка условия выхода из цикла

032

012

B2

 ;Если Z=0 – переход на адрес 000 012

033

000

B3

034

174

MOV A, H

 ;Загрузка старшей части частичного произведения в аккумулятор

035

062

STA

 ;Сохранение в памяти по адресу 000 202

036

202

B2

037

000

B3

040

175

MOV A, L

 ;Загрузка младшей части частичного произведения в аккумулятор

041

062

STA

 ;Сохранение в памяти по адресу 000 203

042

203

B2

043

000

B3

;Вычисление произведения окончено

044

303

JMP

;Безусловный переход на адрес 000 220

045

220

B2

046

000

B3

047

050

067

STC

 ;Установка флага C

051

077

CMC

 ;Инверсия – C = 0

052

027

RAL

053

157

MOV L, A

054

303

JMP

 ; Безусловный переход обратно – на адрес

055

016

B2

 ; 000 016

056

000

B3

057

060

171

MOV A, C

;Подпрограмма1

061

303

JMP

;Безусловный переход на «заплатку» –  

062

100

B2

;на адрес 000 100

063

000

B3

064

205

ADD L

;Прибавляем к 300 смещение – число

065

157

MOV L, A

066

176

MOV A, M

;Считываем из памяти в аккумулятор код цифры

067

311

RET

070

171

MOV A, C

;Подпрограмма2 – сдвиг на 3 разряда вправо

071

017

RRC

072

017

RRC

073

017

RRC

074

117

MOV C, A

075

311

RET

100

056

MVI L

;300->L

101

300

B2

102

346

ANI

;Логическое умножение на маску - 007

103

007

B2

;Чтобы оставить один восьмеричный разряд

104

303

JMP

;Безусловный переход по адресу 000 064

105

064

B2

106

000

B3

;Индикация

220

076

MVI A

;Инициализация

221

200

B2

;200->A

222

323

OUT

;Вывод в служебный порт

223

003

PORT

224

323

OUT

;Вывод в служебный порт

225

007

PORT

226

041

LXI H

;200->L, 000->H

227

200

B2

230

000

B3

231

116

MOV C, M

232

367

RST 6

233

323

OUT

;Вывод первого сомножителя

234

004

PORT

;Вывод младшего разряда

235

377

RST 7

236

367

RST 6

237

323

OUT

;Вывод среднего разряда

240

005

PORT

241

377

RST 7

242

346

ANI

;Логическое умножение на маску - 003

243

003

B2

244

117

MOV C, A

245

367

RST 6

246

323

OUT

;Вывод старшего разряда

247

006

PORT

;Вывели первый сомножитель

250

041

LXI H

;201->L, 000->H

251

201

B2

252

000

B3

253

116

MOV C, M

254

367

RST 6

255

323

OUT

;Вывод второго сомножителя

256

000

PORT

;Вывод младшего разряда

257

377

RST 7

260

367

RST 6

261

323

OUT

;Вывод среднего разряда

262

001

PORT

263

377

RST 7

264

346

ANI

;Логическое умножение на маску - 003

265

003

B2

266

117

MOV C, A

267

367

RST 6

270

323

OUT

;Вывод старшего разряда

271

002

PORT

;Вывели второй сомножитель

272

303

JMP

;Безусловный переход на следующую часть программы – по адресу 000 350

273

350

B2

274

000

B3

300

077

;Цифра 0

300

006

;Цифра 1

300

133

;Цифра 2

300

117

;Цифра 3

300

146

;Цифра 4

300

155

;Цифра 5

300

175

;Цифра 6

300

007

;Цифра 7

350

001

LXI B

;Задержка и вывод произведения

351

377

B2

;Установка в 1 всех бит регистровой пары BC

352

377

B3

;377->B, 377->C

353

013

DCX B

354

170

MOV A, B

355

376

CPI

;Сравнение старшего разряда с 000

356

000

B2

357

302

JNZ

;Если Z=0 – переход по адресу 000 353

360

353

B2

361

000

B3

362

041

LXI H

;202->L, 000->H

363

202

B2

364

000

B3

365

116

MOV C, M

366

367

RST 6

367

323

OUT

;Вывод 3 разряда

370

004

PORT

371

377

RST 7

372

367

RST 6

373

323

OUT

;Вывод 4 разряда

374

005

PORT

375

377

RST 7

376

346

ANI

;Логическое умножение на маску - 003

377

003

B2

1000

117

MOV C, A

1001

367

RST 6

1002

323

OUT

Вывод 5 разряда

1003

006

PORT

1004

041

LXI H

;203->L, 000->H

1005

203

B2

1006

000

B3

1007

116

MOV C, M

1010

367

RST 6

1011

323

OUT

;Вывод 0 разряда

1012

000

PORT

1013

377

RST 7

1014

367

RST 6

1015

323

OUT

;Вывод 1 разряда

1016

001

PORT

1017

377

RST 7

1020

346

ANI

;Логическое умножение на маску - 003

1021

003

B2

1022

117

MOV C, A

1023

367

RST 6

1024

323

OUT

;Вывод 2 разряда

1025

002

PORT

1026

166

HLT