NEWIAQUA Програмиране
Програмиране

Използване на Debug

01 Регистри в асемблер
02 Оператори в асемблер

 
Debug е един малко използван инструмент който се разпространява с Windows. Въпреки че не е лесен за употреба като други подобни програми, той е доста добър(трябва само да знаете десетичното смятане).
Нека започнем с неговото разучаване: отворете ms-dos prompt -> START->RUN->command или START->RUN->cmd и напишете debug и prompt-a ще ви стане подобен на '-'. От тук нататък можете да извиквате команди на debug. Като за начало нека погледнем към регистрите: напишете 'r' и натиснете enter: ще видите нещо подобно на това:

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=2422 ES=2422 SS=2422 CS=2422 IP=0100 NV UP EI PL NZ NA PO NC

2422:0100 C3 RET

AX, BX, CX и DX са регистри които в момента са празни, SP е указател към стека, IP е указател към инструкциите, който сочи към това коя ще бъде следващата инструкция която ще бъде изпълнена.
Ако разгледаме самостоятелно адреса 0100 се оказва че той е невалиден адрес от паметта. Затова той се комплектова с регистъра CS. CS сочи сегмента от код на програмата в паметта. Така указателя на инструкции(IP) сочи в момента към следният сегмент от паметта 2422:0100. От последния ред също се че вижда следващата инструкция която ще се изпълни в този адрес е RET.
За да започнем да работим с регистрите изпълнете следната команда:

r AX #позиционираме се върху регистъра АХ
4 #постявяме числото 4 в регистъра АХ


Натиснете ‘r’ за да видите още веднъж съдържанието на регистъра АХ. Стойността на AX трябва да се е променила и да показва стойността, която току що сложихте там (AX=0004)
Повторете процеса, заменяйки АХ с ВХ, а BX с 2. Отново вижте с 'r' и ще забележите че имате нови стойности в регистрите АХ и ВХ.
За да съберем тези стойности(ADD AX,BX) ще си послужим с една хитрост. Като начало трябва да заредим инструкцията за събиране в паметта и да накараме указателя на инструкциите(IP) да сочи към нея. Затова извикайте следните команди:

e 100 #избираме адрес 0100h

01 #поставяме 01h в горния адрес(0100h)

e 101 #избираме адрес 0101h

D8 #поставяме D8h в него


Сега направете листинг(dump) на паметта с 'r' и ще видите последния ред да гласи:

2422:0100 01D8 ADD AX,BX

01D8 е машинния код на x86-процесорите за събиране на рестрите AX и BX. В примера код-сегмента е 2422, когато изпробвате вашият регистър вероятно ще е друг. Независимо от това следващата инструкция, която ще се изпълни събира стойностите на регисрите АХ и ВХ които ако си спомняте заредихме преди малко(AX=0004, BX=0002). За да изпълните тази инструкция напишете 't' - трасиране. Когато изпълните тази команда, ще видите още едно автоматично представяне на паметта показващо резултата от инструкцията.

AX=0006 BX=0002 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=2422 ES=2422 SS=2422 CS=2422 IP=0102 NV UP EI PL NZ NA PE NC

2422:0102 8AC3 MOV AL,BL

Както виждате стойността от калкулацията се запазва в АХ, а оригиналното число остава в ВХ. Указателя към инструкциите сочи към адрес 0102h. Ако изпълните тази инструкция резултатите ще са непредсказуеми, затова изчистете указателя на инструкциите с 'r IP'. Сега след като знаете основите нека бързо видим как се умножават две числа: машиннят код за умножение на AX с BX регистри е F7E3. И така изпълняваме:

e 100

F7

e 101

E3

Разберете как се изважда и дели(трябва да намерите машинния код на тези операции.)
от Невян Нейков



Въпроси / Отговори
Код на система за SMS регистрация
(още въпроси)