Назад | Начало урока | Вперед
Содержание

Глава 1 (продолжение 1)

И так рассмотрим далее работу процедуры menu_byte. А эта процедура выводит всего лишь адрес одной ячейки и ее содержание. Да! Всего одной ячейки! Адрес ячейки будет передан через параметр. Но этот код внутри процедуры будет повторяться столько раз (возвращаться на метку start), пока не будет выведено содержание и адрес всех ячеек памяти адрес которых начинается с svalue и заканчивается адресом evalue.

При выводе возникает необходимость побитового вывода значения определенных ячеек памяти. Эта процедура определяет в каком виде выводить значение ячейки памяти

Вверх

;процедура вывода адреса и значения ячейки по этому адресу в дампе *************
;входные параметры
;svalue - адрес

menu_byte proc
push ax
push dx

start:

mov dh,svalue ;помещаем в dh адрес читаемой ячейки
mov tek_el,dh ;адрес читаемой ячейки в tek_el

;выбор двоичный или шестнадцатиричный вывод содержимого ячейки
cmp dh,0Ah
je bin_el ;двоичный вывод
cmp dh,0Bh
je bin_el ;двоичный вывод
cmp dh,0Ch
je bin_el ;двоичный вывод
cmp dh,0Dh
je bin_el ;двоичный вывод
cmp dh,0Eh
je bin_el ;двоичный вывод
cmp dh,10h
je bin_el2 ;двоичный вывод
cmp dh,12h
je bin_el ;двоичный вывод
cmp dh,14h
je bin_el ;двоичный вывод
cmp dh,33h
je bin_el ;двоичный вывод
;*************************************************************
;сдвигаем курсор вправо на 2 позиции перед выводом адреса ячейки
call cursor_position ;опред полож курсора
add kolonka,02h ;увеличиваем номер текущей колонки на 2
call print_position ;сдвигаем курсор
;***************************************************************

;вывод адреса ячейки
call filter ;конвертируем
call print_h_el ;выводим адрес чит яч

;сдвигаем курсор вправо на 6 позиций перед выводом значения ячейки
call cursor_position ;опред полож курсора
add kolonka,6h ;увеличиваем номер текущей колонки на 2
call print_position ;сдвигаем курсор
;*****************************************************************

;вывод значения ячейки
call readSR ;читаем
call filter ;конвертируем
call print_h_el ;выводим значение чит яч
call corretka
;****************************************

exit_mbp:

mov ah,svalue
inc ah
mov svalue,ah

cmp ah,evalue
jbe start

pop dx
pop ax
ret

bin_el:
call corretka
call print_el_bin ;вывод значения в 2-ичном виде
jp exit_mbp
bin_el2:
mov stroka,36
call print_position
call corretka
call print_el_bin;вывод значения в 2-ичном виде
jp exit_mbp
menu_byte endp
;******************************************************************************

И так рассмотрим эту процедуру.

menu_byte proc

push ax
push dx
start:
mov dh,svalue ;помещаем в dh адресс читаем ячейки
mov tek_el,dh ;адресс чит ячейки в tek_el

;выбор двоичный или шестнадцатиричный вывод содержимого ячейки
cmp dh,0Ah
je bin_el
cmp dh,0Bh
je bin_el
cmp dh,0Ch
je bin_el
cmp dh,0Dh
je bin_el
cmp dh,0Eh
je bin_el
cmp dh,10h
je bin_el2
cmp dh,12h
je bin_el
cmp dh,14h
je bin_el
cmp dh,33h
je bin_el
;*************************************************************

После сохранения в стеке регистров ax и dx, поместили в dh и в tek_el адрес читаемой ячейки, который был передан через параметр - переменную svalue. Далее сравниваем содержимое dh с величинами 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 10h, 12h, 14h, 33h.

Почему именно эти величины (а это адреса ячеек) выбраны? Потому, что именно по этим адресам расположены значения, каждый из 8-бит которых обозначает определенную опцию, которую надо показать и объяснить пользователю (для ясности смотри работу самой программы).

Если совпадение обнаружено, то прыжок на метку bin_el. В метке bin_el два вызова функций и прыжок на exit_mbp:

bin_el:
call corretka
call print_el_bin
jp exit_mbp

Ну вызов функции перевода каретки нам известен. А процедура print_el_bin (процедура вывода адреса и значения ячейки в 16-ричном виде, затем значение будет выведено в двоичном виде так, что выводится сначала номер бита, затем значение бита, и так все 8 бит) будет рассмотрена ниже.
После вызова процедуры print_el_bin прыгаем на метку exit_bmp.

exit_mbp:
mov ah,svalue
inc ah
mov svalue,ah

cmp ah,evalue
jbe start

pop dx
pop ax
ret

В этом коде значение переменной svalue инкременируется и далее сравниваются значения переменных svalue и evalue (начальный и конечный адреса для копирования), и если они равны, то выход из процедуры menu_byte - данные скопированы полностью. В противном случае прыжок на метку start и вывод следующей ячейки памяти компа. То есть проверяется выведены ли все данные, если нет то на start, если да выход из процедуры.

Если в серии сравнений не нашлось подтверждения, то программа не делает прыжка на метку bin_el, а продолжается дальше. Помним, что значение, которое содержится в настоящий момент в переменной tek_el - адрес ячейки. Переведем этот адрес в 16-ричное значение при помощи вызова процедуры filter и выведем на экран при помощи процедуры print_h_el, предварительно сдвинув курсор на 2 позиции вправо:

;сдвигаем курсор вправо на 2 позиций перед выводом адреса ячейки
call cursor_position ;опред полож курсора
add kolonka,02h ;увеличиваем номер текущей колонки на 2
call print_position ;сдвигаем курсор
;***************************************************************

call filter ;конвертируем
call print_h_el ;выводим адрес читаемой ячейки

Далее сдвинем курсор еще на 6 позиций для удобства восприятия и прочитаем при помощи процедуры readSR значение, которое содержится в ячейке по ранее выведенному адресу, переведем его в 16-ричное значение и выведем на экран, при помощи все тех же процедур filter и print_h_el:

;сдвигаем курсор вправо на 6 позиций перед выводом значения ячейки
call cursor_position ;опред полож курсора
add kolonka,6h ;увеличиваем номер текущей колонки на 2
call print_position ;сдвигаем курсор
;*****************************************************************

;вывод шестнадцатиричного значения ячейки
call readSR ;прочитаем
call filter ;конвертируем в 16-ричное знач
call print_h_el;выводим на экран
call corretka
;****************************************

То есть выводим в нужную позицию на экране адрес ячейки и выводим далее в нужную позицию 16-ричное значение, содержащееся по этому адресу.

Далее метка exit_mbp, проверка все ли данные выведены, если да - то выход, если нет - на метку start.

exit_mbp:
mov ah,svalue
inc ah
mov svalue,ah

cmp ah,evalue
jbe start

pop dx
pop ax
ret

Здесь сравниваются начальный svalue и конечный evalue адреса памяти для вывода. Если начальный адрес ячейки (а он все время инкременировался) сравнялся с конечным адресом, то выход из процедуры. Если еще не сравнялся - то на метку start.

Итак нам предстоит еще рассмотреть подробнее процедуры вывода двоичного (print_el_bin) и 16-ричного (print_h_el) представления чисел. А так же процедуры readSR и filter. Которые вызываются из рассмотренной нами процедуры meny_byte.

Резюме:

Итак мы сейчас рассмотрели процедуру menu_byte, которой передали через параметр адрес ячейки в памяти, и она вывела и адрес ячейки и ее содержимое на экран.
Эта процедура выводит всего лишь адрес одной ячейки и ее содержание. Да! Всего одной ячейки! Адрес ячейки будет передан через параметр. Но этот код внутри процедуры будет повторяться столько раз (возвращаться на метку start), пока не будет выведено содержание и адрес всех ячеек памяти адрес которых начинается с svalue и заканчивается адресом evalue.
После каждого вывода ячейки, процедура инкременирует svalue и сравнивает ее с evalue.
Если не равны, то считывается и выводится следующая ячейка. Так пока на будут выведены все данные.

Выводит данные эта процедура в основном при помощи процедур вывода двоичного (print_el) и 16-ричного (print_h_el) представления чисел. А так же процедуры readSR и filter. Которые вызываются из рассмотренной нами процедуры meny_byte. Нам еще предстоит рассмотреть работу этих четырех процедур, которые были вызваны в рассмотренной процедуре menu_byte.

Хорошая процедура menu_byte.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz