Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2018, 11:13   #1
Dimas_mmf
Новичок
Джуниор
 
Регистрация: 04.06.2018
Сообщений: 1
По умолчанию Сложение и вычитание двухбайтовых операндов с разными способами адресации

Есть программа, которая выполняет следующую операцию: x(2)+y(2)-z(2), где в скобочках указана размерность в байтах, операнды передаются через стек или память программы. При этом операнда x адресуется способом ST_R2 (номер банка регистров (в первом байте) и номер регистра из этого банка (во втором байте), в котором размещен операнд - все данные об операнде в двух байтах), операнда y - константа, операнда z - PR_DIR (адрес операнда, т.е. в ПП помещается адрес операнда в РПД). Подскажите как можно упростить эту программу, сохранив способы адресации.
Код:
Y equ 0x00ff	;задаем константу Y
	
mov 20H, #02H	;номер банка
mov 21H, #01H	;номер регистра
mov 11H, #0x01	;записываем старший байт Х в регистр адрес которого был указан выше
mov 12H, #0x0f	;записываем младший байт Х в следующий регистр

mov 31H, #0xff

mov sp, #50h	;устанавливаем указатель стэка

jmp main		

myfun:
pop B			;
mov 08H, B		;достаем значение адреса возврата из myfun
pop B			;и сохраняем в 0 регистр 1 банка старший байт адреса
mov 09h,B		;сохраняем в 1 регистр 1 банка младший байт адреса
pop B			;достаем из стека младший байт X
mov A, B		;
add A, #low(Y)	;складываем его с младшим байтом Y
mov 05H, A		;сохраняем результат
pop B			;достаем из стека старший байт X
mov A, B		;
addc A, #high(Y);складываем его со старшим байтом Y
mov 06H, A		;сохраняем результат
mov A, #0		;
addc A, #0		;получаем третий байт результата
mov 07H, A		;сохраняем результат

mov 01H, sp		;сохраняем текущий указатель стэка

mov DPL, 09H		;
mov DPH, 08H		;получаем из памяти программ адресс старшего байта Z
mov a, #00h			;	
movc A, @A + DPTR	;
add A, #1			;
mov sp, A			;
pop B				;
mov 0EH, B			;младший байт Z записываем в 6 регистр 1 банка
pop B				;
mov 0FH, B			;старший байт Z записываем в 7 регистр 1 банка

mov sp, 01H			;возвращаем значение стэка

mov A, 05H			;
subb A, 0EH			;отнимаем младший байт Z от младшего байта результата
push 0e0h			;заносим младший байт результата в стек
mov 05h, A			;

mov A, 06H			;
subb A, 0FH			;отнимаем старший байт Z от среднего байта результата
push 0e0h			;заносим средний байт результата в стек
mov 06H, A			;

mov A, 07H			;
subb A, #0			;получаем старший байт результата
push 0e0h			;заносим старший байт результата в стек
mov 07H, A			;

mov A,dpl			;
add A, #01h			;высчитываем новой адрес возврата, который отличается от старого на один байт
push 0e0h			;
mov A,dph			;и заносим его в стек
addc A, #00h		;
push 0e0h			;

ret					;возвращаемся из myfun

main:
mov A, 20h			;расшифровываем адресс регистра с данными
mov B, #8			;
mul AB				;
add A, 21H			;
mov 00H, A			;
mov a, @r0			;получаем из регистра старший байт данных
push 0e0h			;и отпровляем значение в стек
mov a, #1			;
add A, r0			;переходим к следующему байту данных
mov r0, A			;
mov a, @r0			;получаем из регистра младший байт данных
push 0e0h			;и отпровляем значение в стек

acall myfun			;вызов myfun
db 0x31				;запись адресса старшего байта z в РПД  в память программ

pop B				;достаем результат из стека
mov 02H,B			;сохраняем в 2 регистр 0 банка старший байт результата
pop B				;достаем результат из стека
mov 01H,B			;сохраняем в 1 регистр 0 банка младший байт результата
pop B				;достаем результат из стека
mov 00H,B			;сохраняем в 0 регистр 0 банка младший байт результата
end
Dimas_mmf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск файлов в каталоге, заданном разными способами ukdug179 Помощь студентам 2 27.09.2016 14:23
Анимированное заполнение ячеек таблицы StringGrid разными способами dubsteppaman Помощь студентам 15 06.04.2015 13:59
Задача «Сложение и вычитание в Зс» FoX1488 Паскаль, Turbo Pascal, PascalABC.NET 0 07.10.2013 17:44
Сложение и вычитание на Ассемблере verpl Помощь студентам 1 05.04.2013 14:45
Скорость заполнения памяти разными способами. Alexcomeback Общие вопросы C/C++ 2 20.05.2009 23:14