Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Исследование различных структур данных



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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.016 с)...