Assembler for newbies in Low level Programming

Ассемблер для новичков в низкоуровневом программировании.



Регистры под микроскопом.

Как мы уже знаем, регистр – это сверхскоростная ячейка памяти, расположенная внутри микропроцессора. Однако, как – же все таки они могут хранить информацию, и как вообще устроена система памяти в наших PC? Вот на этот вопрос я постараюсь ответить в сегодняшней рассылке.

Каким – же способом пришли к двоичному способу хранения информации? Решили люди использовать триггерные схемы, т.е. есть ток, нет тока, где 1 -это есть ток, а 0 - нет тока. Фишка основана на том, что если на один из выходов транзистора подать ток (на долю секунды,или несколько, не имеет значения, главное подать ток), то он начинать пропускать ток, следовательно ток в ячейке есть, а если еще раз подать на этот выход ток, то транзистор размыкается, т.е. перестает пропускать ток, . т.е один транзистор может хранить один бит информации, все очень просто! Т.е. считаем сколько у нас может быть бит информации в ОЗУ(RAM она-же) к примеру:256 мегабайт*1024*1024*8, получим 2 147 483 648 бит. Неслабо однако!

Регистр, а вернее его содержание, (0 и1) можно представить в другом виде, в виде лампочек, 1 -горит, 0 -не горит.

О размешении в памяти. Как мы уже знаем, в один байт можно вместить число до FFh (255). Один байт -8 бит, эти 8 бит разделены на 2 тетрады(1 тетрада – 4 бита, и она всегда соответствует какому-то hex числу), в одну тетраду “вмещается” одно число, в нормальном, человеческом порядке, т.е. 78h запишется как 78 а не 87, однако если брать 2 байта, т.е. 16 бит, то можно вместить таким образом уже 4 числа (разряда) (FFFFh) по одному числу в один байт, а поскольку первым считается тот байт что справа, то и числа по разрядам заносятся в регистр, сначала те что слева, а потом те что справа. Это означает что число 78 54 будет занесено в регистр в таком порядке – сначало 78, а потом 54, т.е выглядит как 5478 (помним что первый байт - байт справа!)

А почему так сделано? Потому что проц считывает данные справа налево! И читает он их побайтно.

При нажатии на клавиатуру, генерируется прерывание, и если выполняется одна из функций ДОС, например мы её запустили для того чтобы узнать что за неведомую Any Key нажал пользователь, то скан код клавиши помещается в регистр (8 битный) . Поскольку максимальное число что мы можем запихать в такой регистр -255, то и скан кодов тоже 255. И собственно говоря этого хватает с лихвой! Скан код – код (цифровой)нажатой клавиши. например у ENTER – это 113, D – 44h, и так далее.

Дизассемблер – это конечно хорошо, однако он не позволяет увидеть вживую что происходит с нашей программой, однако этого недостатка лишен отладчик. Сегодня мы изучим отладку в cv (из пакета MASM). запустив его(можно даже под windows) мы видим несклько окон, как в turbo pascal, если кто помнит конечно. эти окна можно передвигать, закрывать, и т.д. Автоматически запускается диалог Open, в котором мы выбираем программу которую нам надо отлаживать. Давайте попробуем самую первую и простую программу – hello world.

После того как мы открыли файл, наш курсор устанавливается на начало программы, на её точку входа (первую команду сегмента кода). Дальше нажимаем alt-7, и появляется окошко с регистрами. Смотрим что у нас там за следующая команда, ага mov ax,0A01 , что это? Ясно, слева у нас адрес стоит 0A01:0100 т.е. мы находимся в сегменте 0A01, и помещаем в регистр ax его адрес, собственно 0A01, далее жмем F8 и видим, что содержимое регистра AX стало 0A01. В общем эксперементируем! Кстати, когда программа завершится, появится в окне команд (command) надпись типа process 0x9F1 terminated normally (2). это значит что программа завершилась нормально. Чтобы увидет вывод программы (то что она выводит на экран нажмите F4. Кстати, все это можно сделать через меню Window, но...)

Кстати, черной полоской выделена строка, которая будет выполнена следующей.

// Да, кстати у транзистора 3 ”входа”, два рабочих, один для управления, это типа примечание.



    Вот вам теперь пример программы которая считывает данные с клавиатуры (то что мы печатаем) в оперативку.

TITLE klava

data segment

max db 255 ; буфер, куда мы вводим данные.

ln db 0

string db 256 Dup(0)

data ends



stacks segment stack

db 50 dup(1)

stacks ends



CODSEG SEGMENT

ASSUME CS:CODSEG, DS:data, SS:stacks

BEGIN:

mov ax,data

mov ds,ax

mov ax,stacks

mov ss,ax

mov dx, offset max

mov ah,0Ah

int 21h



MOV AH,4Ch

INT 21H

CODSEG ENDS

END BEGIN



Значит структура буфера такова: сначала байт максимальной длины строки (типа он определяет сколько символов мы можем ввести), потом 1 резервный байт, и собственно говоря место для строки. Запустив эту программу в отладчике вы без проблем разберетесь с этим. Кстати, чтобы просмотреть содержимое памяти, надо нажать alt-5, или windows-memory window. После вызова функции 0Ah 21h-го прерывания можно в памяти найти выделенную белым строку с тем что вы ввели. Белым обозначается то что изменилось после выполнения предыдущей команды.

Задание: напишите программку, которая будет так-же вводить данные в буфер, и выводить их после этого на экран. Не забудьте вставить после строки символ $. Подсказка: делается это так:

mov BL,ln

mov BH,0

mov [BX+STROKA+1],'$'



Хотелось бы задать вопрос, не слишком ли сложно я рассказываю?

Как всегда на http://ass3mbler.narod.ru вы найдете последнюю версию приложения, и архив рассылки.

Ведущий рассылку Skif_Q.

По всем возникающим вопросам обращайтесь skif_q@mail.ru

И да поможет вам int 21h.

Хостинг от uCoz