Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
13_CРС_СП_МУ.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
379.9 Кб
Скачать

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]