Ассемблер Intel 8080

  • Автор теми Автор теми lynster
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 11.03.2009
Повідом.: 37
Ассемблер Intel 8080

Нужен совет! Есть задача следующего вида:
___________(H)___(0904)
(A)*03h-(B)-( )--->( )
___________(L)___(0905)
H - Старший байт;
L - Младший байт.

И вот не могу понять, как отнять от (А) умноженного на 3 регистр (В), если допустить такой вариант, что при умножении дважды вылазит 1 во флаг переноса, соответственно старший байт будет не во флаге а в отдельном регистре, т.е. как от числа из двух бай, хранящегося в двух регистрах отнять однобайтное число?
 
может быть я не прав, но вроде нужно сделать из однобайтового двухбайтовое число и отнимать
 
Я вот и не могу понять как объединить старший и младший байт числа, чтоб оно корректно вычлось, а не только из младшего или только из старшего байта:confused:
 
ты скажи толком что тебе надо сделать?
 
Нужно регистр А умножить на 3, потом вычесть регистр В и еще вычесть из старшего байта Н, а из младшего - L. Просто с учетом того, что при умножении А на 3 число может быть 2-байтное, а не 1-байтное. Не знаю как понятней написать :) Задание такое по лабе дали...
 
ну вот так например:
Код:
; исходные данные
	mvi	a,001h
	mvi	b,002h
	lxi	h,00304h

; сохраняем hl и вычисляем hl=a*3
	push	h
	mov	l,a
	mov	e,a
	xra	a
	mov	h,a
	mov	d,a
	dad	h
	dad	d
; вычисляем de=hl-b
	xra	a	
	mov	a,l
	sbb	b
	mov	e,a
	mov	a,h
	sbi	000h
	mov	d,a
; восстанавливаем hl и вычисляем h=d-h
	pop	h
	mov	a,d
	sub	h
	mov	h,a
; вычисляем l=e-l
	mov	a,e
	sub	l
	mov	l,a
; результат в HL

не ХРТТ случаем? :)
 
ну так што, разобрался?
 
Та частично, всетаки со стеками мы еще не работали. Ладно, сегодня еще у препода уточно, что делать, потом выложу, что ж он всетаки хочет получить :) Всеравно спасибо большое :)
 
Останнє редагування:
Та частично, всетаки со стеками мы еще не работали. Ладно, сегодня еще у препода уточно, что делать, потом выложу, что ж он всетаки хочет получить :) Всеравно спасибо большое :)

Для спасибо есть кнопочка специальная в виде весов под аватаром ;)
 
Для спасибо есть кнопочка специальная в виде весов под аватаром ;)
Если честно, то не знал:)

Кстати, если интересно прога оказывается выглядит так:
MVI H, BA
MVI L, C0
MVI B, AC
MVI A, FF
MOV E,A
RAL
MOV C,A
MVI A,00
RAL
MOV D,A
MOV A,C
ADD E
MOV C,A
MOV A,D
ACI 00
MOV E,A
MOV A,C
SUB B
MOV B,A
MOV A,E
SBI 00
MOV E,A
MOV A,B
SUB L
MOV D,A
MOV A,E
SBB H
MOV C,A
HLT

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

Кстати, если интересно прога оказывается выглядит так:
MVI H, BA
MVI L, C0
MVI B, AC
MVI A, FF
MOV E,A
RAL
MOV C,A
MVI A,00
RAL
MOV D,A
MOV A,C
ADD E
MOV C,A
MOV A,D
ACI 00
MOV E,A
MOV A,C
SUB B
MOV B,A
MOV A,E
SBI 00
MOV E,A
MOV A,B
SUB L
MOV D,A
MOV A,E
SBB H
MOV C,A
HLT

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

вникать не охота, но на первый взгляд это тоже самое, за исключением того, что последний шаг не вычитание из старшего/младшего байта результата значений H/L по отдельности, а просто вычитание значения HL из результата. Т.е. либо ты неправильно сформулировал задачу, либо это не решение твоей задачи ;)

чтобы тот вариант что я привел выполнял то-же самое, нужно исправить последний шаг таким образом:
Код:
; восстанавливаем hl и вычисляем hl=de-hl
	pop	h
	mov	a,e
	sub	l
	mov	l,a
	mov	a,d
	sbb	h
	mov	h,a
; результат в HL

По поводу оптимальности, сразу режет глаза вот это:
Код:
MVI A,00
RAL

смысла в этом нет, тут можно было просто поставить XRA A и все.
Ну и загружать по отдельности регистры H и L тоже неэффективно:
Код:
MVI H, BA
MVI L, C0

вместо этого можно загрузить сразу оба регистра одной инструкцией lxi h,0BAC0h

PS: кстати в товоем варианте числовые константы указаны некорректно - шестнадцатиричные константы должны начинаться с цифры и заканчиваться буквой h. Либо если ассемблер поддерживает си-синтаксис, то шестнадцатиричное число должно начинаться с 0x, например 0xBAC0.
Ну и еще так, для общего развития - в ассемблере Z80 шестнадцатиричные значения начинаются с символа #, например ld hl,#BAC0
 
Останнє редагування:
По поводу оптимальности, сразу режет глаза вот это:

Код:
MVI A,00
RAL
смысла в этом нет, тут можно было просто поставить XRA A и все.
Ну спорить не буду, просто так нам сказали вылавливать признак переноса в старший байт. А так посмотреть, то я вообще не пойму, чему хотят научить, если даже синтаксис и мнемонику нам другие дают. Там даже толком никто не знает, то ли мы работаем на I8080 то ли на К580ВМ1 :) Ну в любом случае что-то новое всеравно узнал, и на этом спасибо =)
 
Ну спорить не буду, просто так нам сказали вылавливать признак переноса в старший байт.

какой признак переноса вылавливать если ты туда 0 загрузил? 0 куда не двигай единица в перенос не вылезет :)
по сути эти две твои инструкции из значимых результатов дают только обнуление регистра A и сброс бита переноса. И то и другое выполняется инструкцией XRA A - одним выстрелом двух зайцев

Там даже толком никто не знает, то ли мы работаем на I8080 то ли на К580ВМ1 :) Ну в любом случае что-то новое всеравно узнал, и на этом спасибо =)

если серьезно с этим работать будешь, я бы советовал мнемоники Z80 изучать, на базе Z80 есть процессоры посовременнее. Мобилы на них например одно время делали. А 8080 это имхо труп.
 
Назад
Зверху Знизу