Глава 1 (продолжение 1)
И так рассмотрим далее работу процедуры menu_byte. А эта процедура выводит всего лишь адрес одной ячейки и ее содержание. Да! Всего одной ячейки! Адрес ячейки будет передан через параметр. Но этот код внутри процедуры будет повторяться столько раз (возвращаться на метку start), пока не будет выведено содержание и адрес всех ячеек памяти адрес которых начинается с svalue и заканчивается адресом evalue.
При выводе возникает необходимость побитового вывода значения определенных ячеек памяти. Эта процедура определяет в каком виде выводить значение ячейки памяти
Вверх
start:
;выбор двоичный или шестнадцатиричный вывод содержимого ячейки
;вывод адреса ячейки
;сдвигаем курсор вправо на 6 позиций перед выводом значения ячейки
;вывод значения ячейки
exit_mbp:
cmp ah,evalue
pop dx
И так рассмотрим эту процедуру.
menu_byte proc
;выбор двоичный или шестнадцатиричный вывод содержимого ячейки
После сохранения в стеке регистров ax и dx,
поместили в dh и в tek_el адрес читаемой ячейки, который был передан через параметр - переменную svalue. Далее сравниваем содержимое dh с величинами 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 10h, 12h, 14h, 33h.
Почему именно эти величины (а это адреса ячеек) выбраны? Потому, что именно по этим адресам расположены значения,
каждый из 8-бит которых обозначает определенную опцию, которую надо показать и объяснить пользователю (для ясности смотри работу самой программы).
Если совпадение обнаружено, то прыжок на метку bin_el. В метке bin_el два вызова функций и прыжок на exit_mbp:
Ну вызов функции перевода каретки нам известен. А процедура print_el_bin
(процедура вывода адреса и значения ячейки в 16-ричном виде, затем значение будет выведено в двоичном виде так, что выводится сначала номер бита, затем значение бита, и так все 8 бит) будет рассмотрена ниже.
cmp ah,evalue
pop dx
В этом коде значение переменной svalue инкременируется и далее сравниваются значения переменных svalue и evalue (начальный и конечный адреса для копирования), и если они равны, то выход из процедуры menu_byte - данные скопированы полностью. В противном случае прыжок на метку start и вывод следующей ячейки памяти компа. То есть проверяется выведены ли все данные, если нет то на start, если да выход из процедуры.
Если в серии сравнений не нашлось подтверждения, то программа не делает прыжка на метку bin_el, а продолжается дальше. Помним, что значение, которое содержится в настоящий момент в переменной tek_el -
адрес ячейки. Переведем этот адрес в 16-ричное значение при помощи вызова процедуры filter и выведем на экран при помощи процедуры print_h_el, предварительно сдвинув курсор на 2 позиции вправо:
call filter ;конвертируем
Далее сдвинем курсор еще на 6 позиций для удобства восприятия и прочитаем при помощи процедуры readSR значение, которое содержится в ячейке по ранее выведенному адресу, переведем его в 16-ричное значение и выведем на экран, при помощи все тех же процедур filter и print_h_el:
;сдвигаем курсор вправо на 6 позиций перед выводом значения ячейки
;вывод шестнадцатиричного значения ячейки
То есть выводим в нужную позицию на экране адрес ячейки и выводим далее в нужную позицию 16-ричное значение, содержащееся по этому адресу.
Далее метка exit_mbp, проверка все ли данные выведены, если да - то выход, если нет - на метку start.
cmp ah,evalue
pop dx
Здесь сравниваются начальный svalue и конечный evalue адреса памяти для вывода. Если начальный адрес ячейки (а он все время инкременировался) сравнялся с конечным адресом, то выход из процедуры. Если еще не сравнялся - то на метку start.
Итак нам предстоит еще рассмотреть подробнее процедуры вывода двоичного (print_el_bin) и 16-ричного (print_h_el) представления чисел. А так же процедуры readSR и filter. Которые вызываются из рассмотренной нами процедуры meny_byte.
Резюме:
Итак мы сейчас рассмотрели процедуру menu_byte, которой передали через параметр адрес ячейки в памяти, и она вывела и адрес ячейки и ее содержимое на экран.
Выводит данные эта процедура в основном при помощи процедур вывода двоичного
(print_el) и 16-ричного (print_h_el) представления чисел. А так же процедуры readSR и filter. Которые вызываются из рассмотренной нами процедуры meny_byte. Нам еще предстоит рассмотреть работу этих четырех процедур, которые были вызваны в рассмотренной процедуре menu_byte.
Хорошая процедура menu_byte.
Назад |
Начало урока |
Вверх |
Вперед
;процедура вывода адреса и значения ячейки по этому адресу в дампе *************
;входные параметры
;svalue - адрес
push dx
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 ;выводим адрес чит яч
call cursor_position ;опред полож курсора
add kolonka,6h ;увеличиваем номер текущей колонки на 2
call print_position ;сдвигаем курсор
;*****************************************************************
call readSR ;читаем
call filter ;конвертируем
call print_h_el ;выводим значение чит яч
call corretka
;****************************************
inc ah
mov svalue,ah
jbe start
pop ax
ret
call print_el_bin ;вывод значения в 2-ичном виде
jp exit_mbp
call print_position
call corretka
call print_el_bin;вывод значения в 2-ичном виде
jp exit_mbp
push dx
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
;*************************************************************
call print_el_bin
jp exit_mbp
После вызова процедуры print_el_bin прыгаем на метку exit_bmp.
inc ah
mov svalue,ah
jbe start
pop ax
ret
call cursor_position ;опред полож курсора
add kolonka,02h ;увеличиваем номер текущей колонки на 2
call print_position ;сдвигаем курсор
;***************************************************************
call print_h_el ;выводим адрес читаемой ячейки
call cursor_position ;опред полож курсора
add kolonka,6h ;увеличиваем номер текущей колонки на 2
call print_position ;сдвигаем курсор
;*****************************************************************
call readSR ;прочитаем
call filter ;конвертируем в 16-ричное знач
call print_h_el;выводим на экран
call corretka
;****************************************
inc ah
mov svalue,ah
jbe start
pop ax
ret
Эта процедура выводит всего лишь адрес одной ячейки и ее содержание. Да! Всего одной ячейки! Адрес ячейки будет передан через параметр. Но этот код внутри процедуры будет повторяться столько раз (возвращаться на метку start), пока не будет выведено содержание и адрес всех ячеек памяти адрес которых начинается с svalue и заканчивается адресом evalue.
После каждого вывода ячейки, процедура инкременирует svalue и сравнивает ее с evalue.
Если не равны, то считывается и выводится следующая ячейка. Так пока на будут выведены все данные.
Содержание