| Всем доброго времени суток! Я постараюсь показать, как это просто писать программу на Ассемблере. Добавлено (14.12.2007, 13:59) --------------------------------------------- Для начала разберёмся, а где вообще писать ассемблеровский код. А писать его надо между двумя ключевыми словами Code begin Asm ... end; end; Если в процедуре или в функции присутвствует только ассемблеровский код, то можно обойтись и без begin Code Procedure Assembler; asm ... end; Добавлено (14.12.2007, 14:10) --------------------------------------------- Теперь, я расскажу немного о регистрах процессора. Регистры - это кусочки памяти где можно хранить информацию в двоичном коде. Сейчас я покажу самые основные: 8 - бит – al,bl,cl,dl. 16-бит – ax,bx,cx,dx. 32-бит – eax,ebx,ecx,edx. Добавлено (14.12.2007, 14:43) --------------------------------------------- Регистры это хорошо, но какой от них толк, если незнаешь как присвоить им значение. Для присваивания используется команда mov, например нам нужно присвоить значение переменной i:integer регистру eax: Почему был выбран регистр eax, все просто, Delphi это среда для разработки 32 битных прилажений. Также мы можем присвоить переменной регистр: Добавлено (14.12.2007, 15:09) --------------------------------------------- Первая програмка на Ассемблере. Напишим функцию которая складывает два числа a и b. Code function summ(a,b:integer): integer; asm add a,b end; add - это команда которая складывает два значения a и b и записывает результат в первую переменную a. Можно было сначало занести значения параметров в регистры и сложить их. Code function summ(a,b:integer): integer; asm mov eax,a mov ebx,b add eax,ebx mov result,eax end; Как складывать и отнимать add eax,ebx {к eax прибавили ebx и результат записался в eax} sub eax,ebx {от eax отняли ebx и результат записался в eax } Как умножить и поделить mul eax,ebx {умножение без учета знака} imul eax,ebx {умножение с учетом знака} div eax,ebx {деление без учета знака} idiv eax,ebx {деление с учетом знака} Добавлено (14.12.2007, 15:22) --------------------------------------------- Как сделать цикл Loop имя метки метка Jmp имя метки метка Пример цикла loop Code Asm Mov ax,0 //обнулили cx Mov cx,10 // в asm ecx,cx,cl – являются щетчиками @QQ: // метка с именем QQ, вместо QQ можно задать любое другое имя add ax,cx // увеличили ax dec cx // уменьшали cx на 1 loop @QQ // вновь запустили цикл End; Пример jmp Code Asm Mov ax,0 Mov cx,10 @QQ: add ax,cx dec cx cmp cx,0 // если cx = 0 je @QW // то переход на метку QW jmp @QQ //перешли на метку QQ @QW: End; Добавлено (14.12.2007, 15:29) --------------------------------------------- Сдвиги rcl- сдвиг влево rcr- сдвиг вправо mov ax,100 rcl ax,1 // после сдвига ax на 1 влево ax стал равен 200, на 2 ax=400, на 3 ax=800 rcr ax,1 // ax=50, на 2 ax=25, на 3 ax=12 максимум можно сдвинуть на 31 бит
Сообщение отредактировал Kostia - Пятница, 14.12.2007, 15:26 |