Курсовая работа: Микропроцессорные средства и системы
4-й разряд | 3-й разряд | 2-й разряд | 1-й разряд | H |
4096 | 256 | 16 | 1 | H |
Таким образом, начальный и конечный адреса в десятичной системе будут :
A0EDH = 4096 * 10 + 256 * 0 + 16 * 14 + 1 * 13 + 1= 41198 ;
EF34H = 4096 * 14 + 256 * 15 + 16 * 3 + 1 * 4 +1 = 61237 .
61237 - 41198 = 20039.
20039 = 19 * 1024 + 583.
Итак, размер памяти будет 20039 байт или 19 кБ. 583 байт
Задача № 2
Символьная строка расположена в ОЗУ начиная с адреса 0006H. Известно, что под каждый символ отводится одна ячейка памяти. Число символов в строке = 731. Определить адрес для обращения к последнему символу строки.
Порядковый номер последней ячейки памяти в десятичной системе будет 731 + 6 = 737. Переведем 738 из десятичной системы в двоичную :
73710 = 0010111000012
Теперь переводим в 16 - теричную : 0010111000012 = 02E116
Ответ : адрес последнего символа 02E1H
Задача № 3
Составить программу на Ассемблере с комментариями :
Подсчитать число символов в строке, расположенной в области начиная с адреса 1000H и заканчивая адресом 2000H без учета пробелов, если известно, что каждый символ занимает одну ячейку памяти и пробел кодируется как 01H.
Максимальное число символов в строке 2000h -1000h=1000h=409610
После выполнения программы результат будет помещен в HL.
LXI SP,3000h ; указание вершины стека
LXI H,1000h ; адрес 1-го элемента => в HL
LXI D,1000h ; загрузка счетчика в D,E
XRA A ; обнуление аккумулятора
STA 2001h ; обнуление счетчика количества символов
STA 2002h ; обнуление счетчика количества символов
MVI B,01h ; код пробела => в В
LOOP:
MOV A,M ; загрузить символ из ячейки М в аккумулятор
CMP B ; проверка на код пробела
JNZ COUNT ; если не совпадает, переход к COUNT, иначе - дальше
INX H ; адрес следующего символа
DCX D ; уменьшить счетчик
JZ EXIT ; если счетчик = 0, на выход
JMP LOOP ; в начало цикла
COUNT:
PUSH H ; выгрузить содержимое HL в стек
LHLD 2001h ; загрузить HL содержимым счетчика количества символов
INX H ; увеличить счетчик на 1
SHLD 2001h ; сохранить счетчик количества символов в 2001h, 2002h
POP H ; восстановить в HL сохраненный адрес
RET ; возврат из подпрограммы
EXIT:
LHLD 2001h ; загрузить HL содержимым счетчика количества символов
END
Задача № 4
Составить программу на Ассемблере, направленную на решение математической функции :
Z = lg(x+1)
Натуральный и десятичный логарифмы одного и того же числа (в данном случае - выражения) связаны простым соотношением, позволяющим переходить от одного к другому :
lg x = Mlnx , где M = 1/ln10 = 0,434294481903252…
т.е., десятичный логарифм числа x = натуральному логарифму этого же числа, умноженному на постоянный множитель M = 0,434294481903252…, называемый модулем перехода от натуральных логарифмов к десятичным.
В соответствии с вышесказанным, lg (x+1) = 0,434294481903252…* ln(x+1)
Для вычисления ln(x+1) используем разложение в ряд :
ln(x+1) = x-x2/2+x3/3-x4/4+x5/5-x6/6+x7/7-x8/8+…
В результате алгоритм решения сводится к четырем арифметическим действиям : + ; - ; * ; /.
Перед выполнением арифметических действий над числами с плавающей запятой условимся первое число размещать в регистрах EHL, второе – в регистрах DBC; результат операции оставлять в EHL.
Формат представления чисел с плавающей запятой :
S | P | P | P | P | P | P | P | P | M | M | M | M | M | M | M | M | M | M | M | M | M | M | M |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
1-й байт | 2-й байт | 3-й байт |
Где : S – знак числа ( 1-отрицательный, 0-положительный ), P0…P7 – 8-битный смещенный порядок, M1 … M15 – мантисса . Скрытый бит целой части мантиссы в нормализованных числах содержит 1
1000h | X |
1001h | |
1003h | |
1003h |
X2 |
1004h | |
1005h | |
1006h |
X3 |
1007h | |
1008h | |
1009h |
X4 |
100Ah | |
100Bh | |
100Ch |
X5 |
100Dh | |
100Eh | |
100Fh |
X6 |
1010h | |
1011h | |
1012h |
X7 |
1013h | |
1014h | |
1020h |
Адрес ячейки с текущим XN |
1021h | |
1022h | Текущий N |
До начала вычислений число Х должно быть размещено в памяти по адресам 1000h-1002h.;начало цикла вычислений
CALC1:
LXI H,1003h ; сохранение адреса первой ячейки
SHLD 1020h ; для хранения XN
CALL LOAD ; Загрузка Х в EHL
;цикл вычисления XN
CALC2: CALL LOAD1 ;Загрузка Х в DBC CALL MULF ; Умножение чисел с плавающей точкой
MOV B,H ; HL=>BC
MOV C,L
LHLD 1020h ;загрузить адрес ячейки памяти для хранения Хn
MOV M,E ;Хn => в память
INX H
MOV M,B
INX H
MOV M,C
INX H
SHLD 1020h ;запомнить адрес ячейки памяти для следующего Хn
MOV H,B ;BC=>HL
MOV L,C
LDA 1021h ;содержимое ячейки => в аккумулятор
CPI 15h ;если получены все значения Хn,
JZ CALC3 ;переход на CALC3
JMP CALC2 ;иначе- в начало
CALC3:
LXI H,1022h ;
MVI M,01h ;загрузить в ячейку 1022h делитель
LXI H,1003h ;
SHLD 1020h ;содержимое HL => в память
;цикл вычисления XN/NCALC4: MOV B,H ; HL=>BC MOV C,L LHLD 1020h ;загрузить адрес ячейки памяти для хранения N MOV E,M ;Хn => в регистры INX H MOV B,M INX H MOV C,M SHLD 1020h ;запомнить адрес ячейки памяти для следующего Хn
MOV H,B ;BC=>HL
MOV L,C
PUSH H ;
LXI H,1022h ;N => в ячейку С
MOV C,M
POP H ;
MVI D,00h
MVI B,00h
CALL DIVF ; Деление чисел с плавающей точкой
MOV B,H ; HL=>BC
MOV C,L
LHLD 1020h ;загрузить адрес ячейки памяти для хранения Хn/N
DCX H ;
DCX H ;
MOV M,E ;Хn/N => в память
INX H
MOV M,B
INX H
MOV M,C
INX H
SHLD 1020h ;запомнить адрес ячейки памяти для следующего Хn/N
MOV H,B ;BC=>HL
MOV L,C
PUSH H ;
LXI H,1022h ;N => в ячейку С
MOV C,M ;инкремент N
INR C
MOV M,C
POP H ;
LDA 1021h ;содержимое ячейки => в аккумулятор
CPI 15h ;если получены все значения Хn,
JZ CALC5 ;переход на CALC5
JMP CALC4 ;иначе- в начало
CALC5:
LXI H,1003h ;
SHLD 1020h ;
;
CALC6:
LHLD 1020h ;загрузить адрес ячейки памяти для хранения N
MOV D,M ;Хn/N => в регистры D,B,C.
INX H
MOV B,M
INX H
MOV C,M
INX H
SHLD 1020h ;запомнить адрес ячейки памяти для следующего Хn/N
;
;вычисление ln(x+1)
CALC7: CALL LOAD ; Загрузка Х в EHL CALL SUBF ; Вычитание чисел с плавающей точкой CALL CALC8 ; загрузка Хn+1/N+1 в регистры D,B,C. CALL ADDF ; Сложение чисел с плавающей точкой CALL CALC8 ; загрузка Хn+1/N+1 в регистры D,B,C. CALL SUBF ; Вычитание чисел с плавающей точкой
CALL CALC8 ; загрузка Хn+1/N+1 в регистры D,B,C.
CALL ADDF ; Сложение чисел с плавающей точкой
CALL CALC8 ; загрузка Хn+1/N+1 в регистры D,B,C.
CALL SUBF ; Вычитание чисел с плавающей точкой
CALL CALC8 ; загрузка Хn+1/N+1 в регистры D,B,C.
CALL ADDF ; Сложение чисел с плавающей точкой
CALL CALC8 ; загрузка Хn+1/N+1 в регистры D,B,C.
MVI D,00h ; загрузка модуля пере-
MVI B,2Bh ; хода в DBC
MVI C,2Bh
CALL MULF ; Умножение ln(x+1) на модуль перехода к lg
JMP EXIT ; на выход
;;загрузка Хn+1/N+1 в регистры D,B,C.CALC8: PUSH H LHLD 1020h ;загрузить адрес ячейки памяти для хранения N MOV D,M ;Хn/N => в регистры D,B,C. INX H MOV B,M INX H MOV C,M INX H SHLD 1020h ;запомнить адрес ячейки памяти для следующего Хn/N
POP H ;
RET ;
;
EXIT:
HLT ; Останов
;
;
;
;Загрузка Х в EHLLOAD: LXI H,1000h ;загрузка в HL адреса порядка Х MOV E,M ;загрузка порядка Х в Е LHLD 1001h ;загрузка мантиссы в HL
RET ;
;Загрузка Х в DBC
LOAD1:
PUSH H ;выгрузка в стек HL
LXI H,1000h ;загрузка в HL адреса порядка Х
MOV D,M ;загрузка порядка Х в D
INX H ;
MOV B,M ;
INX H ;
MOV C,M ;загрузка мантиссы в BC
POP H ;загрузка из стека HL
RET ;
;Образование дополнительного кода числа в регистре HL
comp:
mov A,H ;
CMA ;
MOV H,A ;
MOV A,L ;
CMA ;
MOV L,A ;
INX H ;
RET ;
;Проверка знака и образование дополнительного кода
NEG:
MOV A,E ;
ORA E ;
JP NOTDK ;
CALL COMP ; Образование дополнительного кода числа в регистре HL
NOTDK: RET ;
;Сдвиг содержимого HL вправо на 1 бит:
SHIFT:
MOV A,H ;
RAR ;
MOV H,A ;
MOV A,L ;
RAR ;
MOV L,A ;
RET ;
;Обмен содержимого регистров EHL и DBC
SWAP:
PUSH B ;
XTHL ;
POP B ;
MOV A,D ;
MOV D,E ;
MOV E,A ;
RET ;
;Восстановление числа с плавающей точкой
REC:
MOV A,H ;
ADD A ;
MOV A,E ;
RAL ;
MOV E,A ;
MOV A,H ;
ORI 80H ;
MOV H,A ;
RET ;
;Преобразование числа в стандартный формат
PACK:
LDA SIGN ;
ADD A ;
MOV A,E ;
MOV D,A ;
RAR ;
MOV E,A ;
MOV A,H ;
ANI 7FH ;
MOV H,A ;
MOV A,D ;
RRC ;
ANI 80H ;
ORA H ;
MOV H,A ;
RET ;
;Сложение чисел с плавающей точкой
ADDF:
MOV A,D ;
XRA E ;
JP ADDF1 ;
MOV A,D ;
XRI 80H ;
MOV D,A ;
JMP SUBF ;
;
ADDF1:
MOV A,D ;
ORA B ;
ORA C ;
JZ ADDF8 ;
MOV A,E ;
ORA H ;
ORA L ;
JNZ ADDF2 ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
JMP ADDF8 ;
;
ADDF2:
MOV A,D ;
STA SIGN ;
CALL REC ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
CALL REC ; Восстановление числа с плавающей точкой
;
MOV A,E ;
SUB D ;
JNC ADDF3 ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
MOV A,E ;
SUB D ;
;
; В EHL большее число, в аккумуляторе разность потенциалов
ADDF3:
JZ ADDF6 ;
CPI 16 ;
JC ADDF4 ;
JMP ADDF7 ;
;
;Можно сдвигать мантиссу меньшего числа
ADDF4:
MOV E,A ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
ADDF5:
ORA A ;
CALL SHIFT ; Сдвиг содержимого HL вправо на 1 бит:
INR E ;
DCR D ;
JNZ ADDF5 ;
;
;В регистре Е общий порядок. Можно складывать мантиссы
ADDF6:
DAD B ;
JNC ADDF7 ;
INR E ;
JZ ADDF8 ;
ORA A ;
CALL SHIFT ; Сдвиг содержимого HL вправо на 1 бит:
;
ADDF7:
CALL PACK ; Преобразование числа в стандартный формат
;
ADDF8:
RET ;
;
;Вычитание чисел с плавающей точкой
SUBF:
MOV A,D ;
XRA E ;
JP SUBF1 ;
MOV A,D ;
XRI 80H ;
MOV D,A ;
JMP ADDF ; Сложение чисел с плавающей точкой
SUBF1:
MOV A,D ;
ORA B ;
ORA C ;
JZ SUBFA ;
MOV A,E ;
ORA H ;
ORA L ;
JNZ SUBF2 ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
MOV A,E ;
XRI 80H ;
MOV E,A ;
JMP SUBFA ;
SUBF2:
MOV A,E ;
STA SIGN ;
CALL REC ; Восстановление числа с плавающей точкой
CALL SWAP ; Обмен содержимого регистров EHL и DBC
CALL REC ; Восстановление числа с плавающей точкой
MOV A,D ;
SUB E ;
JNZ SUBF3 ;
MOV A,B ;
CMP H ;
JNZ SUBF3 ;
MOV A,C ;
CMP L ;
JNZ SUBF3 ;
MVI E,0 ;
LXI H,0 ;
JMP SUBFA ;
;
;операнды не равны, необходимо вычитать
SUBF3:
JNC SUBF4 ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC