Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Сложение и вычитание двухбайтовых операндов с разными способами адресации
Есть программа, которая выполняет следующую операцию: 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