Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
1. ЗАДАНИЕ НА СРС
Разработать двухмодульную программу реассемблирования машинного кода команды микропроцессора типа Intel 8088. (Под термином "реассемблирование" будем понимать процедуру, обратную процедуре ассемблирования, - преобразование машинного кода команды в исходный оператор на языке Ассемблера.
Головной модуль, содержащий:
- описание строковой переменной-результата SCOD длиной 80 байт и переменной LN типа integer, равной фактической длине строки-результата;
- вызов процедуры реассемблирования с параметрами SCOD и LN;
- вывод результата оформить в виде Паскаль-программы. Процедуру реассемблирования машинной команды оформить в виде внешней Ассемблер-процедуры с параметрами SCOD и LN, а исходные данные (машинную команду) определить внутри нее в виде 16-ричной константы в поле памяти с именем MCOD.
Подмножество системы команд и способов адресации выбран в соответствии с вариантом задания, полагаем первый из операндов хранящимся в регистре, а второй - в оперативной памяти. В варианте задания указано множество команд ADD.
2. КРАТКОЕ ОПИСАНИЕ АЛГОРИТМА.
Из основного модуля в процедуру передаются следующие параметры: машинный код команды, строка для записи исходного текста команды и переменная в которой будет возвращаться длина строки. В процедуре проводится побитовый анализ байтов машинного кода в результате чего определяется команда, тип операции, и операнды. После этого формируется текст команды и возвращается в основной модуль, где производится вывод.
3. ТЕКСТ ПРОГРАММЫ.
3.1 ОСНОВНОЙ МОДУЛЬ (PAS)
program SRS_4;
{$F+}
{$L laba4_ra}
Procedure Reasm(Var s:string;Var ln:word; mc1:word; mc2:word);external;
Var
s:string;
mcode1,mcode2:word;
ln:word;
Begin
mcode1:=999;
mcode2:=12;
Reasm(s,ln,mcode1,mcode2);
writeln(s);
End.
3.2 ПРОЦЕДУРА РЕАССЕМБЛИРОВАНИЯ
.8086
Public Reasm
CODE segment
assume cs:CODE,DS:code
Reasm Proc far
push bp
mov bp,sp
push ds
push cs
pop ds
les di,[bp+14]
push di
inc di
cld
mov ax,[bp+8]
mov bx,[bp+6]
push ax
and ah,0fch
jz is_add
cmp ah,38h
je is_cmp
cmp ah,88h
je is_mov
exit:
mov ax,di
pop di
sub ax,di
stosb
les di,[bp+10]
stosw
pop ds
pop bp
ret 12
is_add:
mov ax,'DA'
stosw
mov ax,' D'
stosw
jmp Skip_Reasm1
is_cmp:
mov ax,'MC'
stosw
mov ax,' P'
stosw
jmp Skip_Reasm1
is_mov:
mov ax,'OM'
stosw
mov ax,' V'
stosw
Skip_Reasm1:
pop ax
push ax
test ah,2
jnz Reg_Rm
Rm_Reg:
call Get_Rm
mov al,','
stosb
pop ax
call Get_Reg
jmp exit
Reg_Rm:
push bx
call Get_Reg
mov al,','
stosb
pop bx
pop ax
call Get_Rm
jmp exit
Reasm Endp
Get_Reg Proc
;Входные данные -AX:команда и адресный байт
;ES:DI - текущая позиция строки
mov bx,offset Reg
ror al,1
ror al,1
ror al,1
test ah,1
jnz is_word
;Работаем с байтами
mov ah,'L'
test al,0100b
jz skip_Reg1
mov al,'H'
Skip_Reg1:
and al,011b
xlat
stosw
ret
is_word:
and al,0111b
mov ah,al
ror ah,1
and ah,011b
xlat
stosb
mov al,ah
add bx,8
xlat
stosb
ret
Get_Reg endp
Get_Rm Proc
push ax
mov ah,al
and al,0c0h
cmp al,0c0h
jne Skip_1
pop ax
mov dh,al
and al,11000111b
and dh,00000111b
rol dh,1
rol dh,1
rol dh,1
or al,dh
jmp Get_Reg
Skip_1:
push bx
mov dl,al
rol dl,1
rol dl,1
mov al,ah
and al,111b
or dl,dl
jne Skip_2
cmp al,110b
jne Skip_2
mov dl,2
jmp Get_offset
Skip_2:
mov al,'['
stosb
mov dh,ah
test dh,0100b
jnz Skip_3
B_I:
mov ax,'XB'
test dh,10b
jz Skip_4
mov ah,'P'
Skip_4:
stosw
mov ax,'[]'
stosw
and dh,1
Skip_3:
test dh,10b
jz Skip_6
mov ax,'XB'
test dh,1
jne Skip_11
mov ah,'P'
jmp Skip_11
Skip_6:
mov ax,'IS'
test dh,1
je Skip_11
mov al,'D'
Skip_11:
stosw
mov al,']'
stosb
Get_offset:
pop bx
or dl,dl
je Skip_10
mov al,'['
stosb
cmp dl,1
jne Skip_5
mov bh,bl
Skip_5:
mov cl,dl
sub ch,ch
rol cl,1
mov dx,bx
mov bx,offset Hex_table
sub ah,ah
Loop_offset:
mov al,0fh
push cx
mov cl,4
rol dx,cl
pop cx
and al,dl
xlat
cmp al,'0'
je Skip_7
cmp al,'A'
jb Skip_8
or ah,ah
jne Skip_8
mov ah,al
mov al,'0'
stosw
jmp Skip_9
Skip_7:
or ah,ah
je Skip_9
Skip_8:
mov ah,1
stosb
Skip_9:
loop Loop_offset
dec di
or ah,ah
je Skip_10
mov al,']'
inc di
stosb
Skip_10:
pop ax
ret
Get_Rm endp
Reg db 'ACDBSBSD'
db 'XXPI'
Hex_Table db '0123456789ABCDEF'
CODE ends
END
4 РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ И ХАРАКТЕРИСТИКИ
РАБОТЫ ПРОГРАММЫ.
Тестовые примеры:
входные данные:
выходные данные:
входные данные:
выходные данные:
В ходе тестирования не было выявлено каких либо ошибок в работе программы. Следует заметить, что данная программа так же распознаёт и команды подмножеств CMP и ADD.
Дата публикования: 2015-10-09; Прочитано: 226 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!