Assembler
| |
Deswing | Дата: Пятница, 04 Октября 2013, 21:02 | Сообщение # 1 |
заслуженный участник
Сейчас нет на сайте
| Доброго времени суток! Я студент первого курса, очень интересует ассемблер. Учусь по направлению "информатика". И вот на днях сказали, что скоро мы начнем его проходить, НО мне хотелось бы (ради себя, не учебы) тоже как-нибудь поднапрячь голову и попытаться что-нибудь написать... Всё было бы хорошо, но тут я встретил с десяток интерпретаторов, глаза разбежались... За что хвататься? Что почитать? А помимо книг есть интернет-статьи? Что лучше: COM или EXE (если не ошибаюсь, то в программе на ассемблере существует 4 сегмента. Ну а в СОМ они как бы совпадают. Надеюсь, я не ошибаюсь?)Добавлено (04.10.2013, 21:02) --------------------------------------------- и да, почему asm == assembler???
|
|
| |
pelmenka | Дата: Пятница, 04 Октября 2013, 21:20 | Сообщение # 2 |
Драгоценный Тунеядец
Сейчас нет на сайте
| Цитата (Deswing) почему asm == assembler сокращение.
Сталина в каждый дом!
|
|
| |
PBPROG | Дата: Пятница, 04 Октября 2013, 23:12 | Сообщение # 3 |
постоянный участник
Сейчас нет на сайте
| Цитата (Deswing) Всё было бы хорошо, но тут я встретил с десяток интерпретаторов, глаза разбежались... За что хвататься? Что почитать? Не интерпретатор, а компилятор (транслятор). Выбирайте под требуемый процессор (у каждого типа процессора свой ассемблер).
Цитата (Deswing) Что лучше: COM или EXE Если под дос, то для начала не имеет значения, а под винду, только exe, причем pe формата,
|
|
| |
wcpt | Дата: Воскресенье, 06 Октября 2013, 12:17 | Сообщение # 4 |
постоянный участник
Сейчас нет на сайте
| ну, в ассемблере мы говорим не о четырех сегментах, а о четырех сегментных регистрах, для кода, данных, доп. для данных, стека. Ну и да, com-программа вся загружена в один сегмент. Из книг я бы посоветовал Юров - ассемблер, учебник для вузов, и Зубков - Assembler для DOS, Windows и UNIX. Достаточно конкретно все расписано.
Сообщение отредактировал wcpt - Пятница, 11 Октября 2013, 18:15 |
|
| |
Xakep | Дата: Воскресенье, 06 Октября 2013, 14:40 | Сообщение # 5 |
めちゃくちゃちゃ
Сейчас нет на сайте
| Используй FASM самый трушный ассемблер )) Цитата (wcpt) Из книг я бы посоветовал Юров - ассеблер, учебник для вузов, и Зубков - Assembler для DOS, Windows и UNIX. Достаточно конкретно все расписано. Поддерживаю )
|
|
| |
Archido | Дата: Понедельник, 07 Октября 2013, 03:56 | Сообщение # 6 |
Сэнсэй
Сейчас нет на сайте
| Цитата (Xakep) Используй FASM самый трушный ассемблер )) +1
Но вообще, самые азы я бы посоветовал начинать постигать путем написания асемблерных вставок на привычном языке и привычной IDE (C++, MSVS например).
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
PBPROG | Дата: Понедельник, 07 Октября 2013, 20:19 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| Цитата (Archido) Но вообще, самые азы я бы посоветовал начинать постигать путем написания асемблерных вставок Тогда нужно писать в IDE, поддерживающей целевой асм (FASM). К таким IDE относится например, PureBasic, который полностью поддерживает FASM.
|
|
| |
Deswing | Дата: Пятница, 11 Октября 2013, 00:49 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| Помогите пожалуйста настроить DOSBox под TASM. Ну или предложите что-то другое... Не особо хочется голову насиловать с этими настройками каждый раз... P.S. вроде как программы на asm уже писал (в универе), очень даже интересно! Разве что без комментариев туговато будет... Поэтому я их вставляю почти везде)) Кстати, а как на экране напечатать какое-то значение? Ну там напрямую или из регистра...
Добавлено (11.10.2013, 00:49) --------------------------------------------- и кстати, как конкретно работает mul? Вот я не понимаю откуда берется второй аргумент... Он как-то неявно берется... Допустим я хочу 2*3... И вот обычно пишут что-то типа: mov ax, a ;(a=2) mul b ; a*b
Откуда??? Как??? Почему произойдет a*b??? А как число тогда в квадрат возвести? Нет специальных фич? Лишь число само на себя?
Сообщение отредактировал Deswing - Пятница, 11 Октября 2013, 00:50 |
|
| |
pelmenka | Дата: Пятница, 11 Октября 2013, 02:54 | Сообщение # 9 |
Драгоценный Тунеядец
Сейчас нет на сайте
| Deswing Цитата если операнд, указанный в команде — байт, то второй сомножитель должен располагаться в al; если операнд, указанный в команде — слово, то второй сомножитель должен располагаться в ax; если операнд, указанный в команде — двойное слово, то второй сомножитель должен располагаться в eax. Добавлено (11.10.2013, 02:54) ---------------------------------------------
Цитата wcpt ( ) Зубков - Assembler для DOS, Windows и UNIX. Хорошая книжка (у меня есть, переплет не слишком удобный), так-же могу посоветовать книжку Калашникова "Ассемблер - это просто", правда там описывается программирование под дос, но излагается все весьма хорошо и ее читать весьма удобно (это в книжке тоже важно)
Сталина в каждый дом!
|
|
| |
Archido | Дата: Пятница, 11 Октября 2013, 11:32 | Сообщение # 10 |
Сэнсэй
Сейчас нет на сайте
| Цитата Deswing ( ) Откуда??? Как??? Почему произойдет a*b??? Книжку почитать, не? И не будет вопросов.
Цитата Deswing ( ) А как число тогда в квадрат возвести? Нет специальных фич? Лишь число само на себя? Все руками.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Deswing | Дата: Пятница, 11 Октября 2013, 20:03 | Сообщение # 11 |
заслуженный участник
Сейчас нет на сайте
| Код ;Opredelyaem segment steka stsg segment para stack 'stack' dw 32 dup(?) ;videlyaem 64 bayta stsg ends
;Opr. segment dannih dssg segment para 'data' a db 5 b db 15 c db 3 result db ?
;Opr. segment koda cdsg segment para 'code' assume cs:cdsg, ds:dssg, ss:stsg ;MAIN PROGRAM prg proc far
;Segmentniy registr dannih (init) push ds sub ax, ax push ax mov ax, dssg mov ds, ax
;PROGRAM START sub al, al mov al, a ;a=5->al=5 mul al ;PROGRAM END ret prg endp cdsg ends end prg a*a делается так? А куда результат занесется?
Сообщение отредактировал Deswing - Пятница, 11 Октября 2013, 20:05 |
|
| |
pelmenka | Дата: Пятница, 11 Октября 2013, 20:16 | Сообщение # 12 |
Драгоценный Тунеядец
Сейчас нет на сайте
| Цитата Deswing ( ) sub ax, ax Очень глубокосысленное обнуление ax, а аж залюбовался. А вообще, да, оно делается как-то так.Добавлено (11.10.2013, 20:16) --------------------------------------------- Deswing, полагаю, что результат занесется в ax
Сталина в каждый дом!
|
|
| |
wcpt | Дата: Суббота, 12 Октября 2013, 17:20 | Сообщение # 13 |
постоянный участник
Сейчас нет на сайте
| ну, насчет sub ax,ax - так никто не делает. Используют xor ax,ax. Кстати, иные ассемблерщики просто помешаны на битовых "трюках", им лишь бы размер программы уменьшить Ну, в этом и заключается одно из достоинств ассемблера... результат умножения будет либо в ax, либо в dx:ax, либо в edx:eax, в зависимости от размеров множителя. В данном случае в ax, т.к. перемножаются байты, т.е. максимальный размер произведения не превышает двух байт. кстати - можно для операций lea использовать: lea ax,[eax+eax*4] - умножить eax на 5 и поместить младшие 16 бит результата в ах. Но по-моему, байтовые регистры не могут быть приемниками, а в кач-ве "элементов" источника не могут выступать байтовые и двухбайтовые регистры, исключая bx и индексные регистры
Сообщение отредактировал wcpt - Суббота, 12 Октября 2013, 18:02 |
|
| |
Deswing | Дата: Воскресенье, 13 Октября 2013, 13:38 | Сообщение # 14 |
заслуженный участник
Сейчас нет на сайте
| а как высчитать a·a-5-c/b+(3+c)·a·7? а = 5 b = 15 c =3... Третий день пытаюсь сделать это, но ничего не выходит... А сдавать работу завтра... Помогите, плиз... Может на примере разберусь (помимо этого задания есть куча других, но это, как по мне, вызывает у меня больше сложностей)
|
|
| |
PBPROG | Дата: Понедельник, 14 Октября 2013, 11:42 | Сообщение # 15 |
постоянный участник
Сейчас нет на сайте
| Цитата Deswing ( ) а как высчитать a·a-5-c/b+(3+c)·a·7? а = 5 b = 15 c =3... Очень просто. Берете подходящий ЯВУ, компилите в нем эту формулу и вытаскиваете асм листинг. К примеру, если в PureBasic скомпилить (он юзает FASM для компиляции).Код a = 5 : b = 15 : c =3 x = a*a-5-c/b+(3+c)*a*7 То получим такой асм код. Код ; a = 5 : b = 15 : c =3 MOV dword [v_a],5 MOV dword [v_b],15 MOV dword [v_c],3 ; x = a*a-5-c/b+(3+c)*a*7 MOV ebx,dword [v_a] IMUL ebx,dword [v_a] MOV edi,dword [v_c] PUSH dword [v_b] MOV eax,edi POP ecx CDQ IDIV ecx MOV edi,eax SUB ebx,edi MOV edi,dword [v_c] ADD edi,3 IMUL edi,dword [v_a] IMUL edi,7 ADD ebx,edi ADD ebx,-5 MOV dword [v_x],ebx
|
|
| |
wcpt | Дата: Понедельник, 14 Октября 2013, 22:15 | Сообщение # 16 |
постоянный участник
Сейчас нет на сайте
| Код mov al,[a] ;al=a mul al ; al=a*a add al,-5 ;al=a*a-5 mov bh,al mov al,[cc] ;al = ah add al,3 ; al = c+3 mul [a] ; al = (c+3)*a mov ah,7 mul ah ;al = (c+3)*a*7 add bh,al ; bh=bh+al=a*a-5+(c+3)*a*7 mov al,[cc] ; al=c div [b] sub bh,al ;bh=bh-c/d (но c/d=0, в принципе, можно было и опустить)
Сообщение отредактировал wcpt - Понедельник, 14 Октября 2013, 22:16 |
|
| |
Deswing | Дата: Вторник, 15 Октября 2013, 22:46 | Сообщение # 17 |
заслуженный участник
Сейчас нет на сайте
| PBPROG, что есть dword и CDQ? wcpt, PBPROG, очень приятно что вы откликнулись, спасибо. Будет хоть пища для ума... (а сроки "сдачи" отложили на 22 октября). Кстати, а вы не в курсе, как в ассемблере делается объединение и пересечение? And и or соответственно или я не прав?
А я вот, с горем пополам, что-то пытался сам написать: Код ;******************** ;Opredelyaem segment steka ;******************** stsg segment para stack 'stack' dw 32 dup(?) ;videlyaem 64 bayta stsg ends ;******************** ;Opr. segment dannih ;******************** dssg segment para 'data' a db 5 b db 15 c db 3 d db 7 result db ? dssg ends ;******************** ;Opr. segment koda ;******************** cdsg segment para 'code' assume cs:cdsg, ds:dssg, ss:stsg ;******************** ;MAIN PROGRAM ;******************** prg proc far ;******************** ;Segmentniy registr dannih (init) ;******************** push ds sub ax, ax push ax mov ax, dssg mov ds, ax
;******************** ;PROGRAM START ;a·a-5-c/b+(3+c)·a·7 ;a = 5 ;b = 15 ;c = 3 ;d = 7 ;******************** sub ax,ax mov al,a ;a=5->al=5 mul al ;al*al->a*a->5*5 sub ax,5 ;5*5-5 push ax ;ax - into stack. ax = a*a-5 sub ax,ax ;Clear ax sub al,al ;Clear al mov al,c mov dl,b div dl ;c/b. Result - into al, % - into ah sub ax,ax sub dl,dl sub al,al mov al,c ;al = 3 add al,al push al ;3+c into stack sub al,al ;Clear al mov al,d ;al = 7 mov dl,a ;dl = 5 mul dl ;ax = 5*7 sub al,al sub dl,dl mov dl,ax ;dl = 5*7 sub ax,ax pop al mul dl ;(3+c)*a*7 push ax sub al,al sub dl,dl pop al pop bl add al,bl push al sub al,al sub bl,bl
;******************** ;PROGRAM END ;******************** ret prg endp cdsg ends end prg ... Ошибок - тьма... И не знаю как быть с дробью... Ошибки, наверное, из-за моего неумения обращаться с регистрами... Наверное пытался засунуть в регистр то, что просто-напросто не может поместиться... Кто-нибудь может написать сколько и в какой регистр помещается? Ну, в универе мы рассматриваем процессор 8086 PBPROG,Добавлено (15.10.2013, 22:34) ---------------------------------------------
Цитата Deswing ( ) And и or (or и and)*Добавлено (15.10.2013, 22:46) --------------------------------------------- p.s. понятия не имею как работает [...]. Понимаю что оно делает, но как работает - нет Препод написал, что это для нас пока что рановато, типа в такие дебри лезть не надо...
|
|
| |
wcpt | Дата: Вторник, 15 Октября 2013, 23:00 | Сообщение # 18 |
постоянный участник
Сейчас нет на сайте
| в регистры al/bl/cl/dl/ax/bx/cx/dx/eax/ebx/ecx/edx помещается 8/8/8/8/16/16/16/16/32/32/32/32 бит соответственно
cdq - конвертирование dword в qword. Если, допустим, в eax лежит значение 0E5EAF00, то после выполнения cdq в edx и eax будет 00000000 и 0E5EAF00 соответственно, если же в eax, допустим, AE5EAF00, то в edx и eax будет 11111111 и AE5EAF00 соответственно, т.е. cdq заполняет edx знаковыми битами eax.
что подразумевается под объединением и пересечением? and и or - побитовые операции с масками/регистрами
для чего sub ax,ax? Используй xor ax,ax - занимает меньше байт.
плюс к этому - команды типа push/pop al/bl случайно не ошибочны? Вроде однобайтные регистры не могут использоваться в операциях со стеком. Да и чем не устроил код, приведенный выше?
Сообщение отредактировал wcpt - Вторник, 15 Октября 2013, 23:32 |
|
| |
Deswing | Дата: Четверг, 17 Октября 2013, 22:25 | Сообщение # 19 |
заслуженный участник
Сейчас нет на сайте
| как быть: стек принимает 2 байта и выше... Вроде ок, переживем... Но что мне делать, если мне нужно что-то перекинуть из стека в al??? al же, вроде, равен одному байту... mul работает так: берет значение al, умножает на аргумент и возвращает результат в ax... Я правильно понимаю? А как тогда работает or и and?
|
|
| |
wcpt | Дата: Четверг, 17 Октября 2013, 23:13 | Сообщение # 20 |
постоянный участник
Сейчас нет на сайте
| никак, если ты хочешь кинуть что-то из al, то используй movzx ax,al (знак теряется), либо movsx ax,al (с учетом знака), и потом push ax. Когда надо, исполняешь pop ax, и в al уже это самое число, что ты кидал в стек.
да, насчет mul верно, но если аргумент двухбайтовый, то результат в dx:ax, если четырехбайтовый, то в edx:eax, т.к. если перемножаются числа максимального порядка, то их произведение будет занимать в два раза больше места
or и and - побитовые операции or - "или", логическое сложение, дизнъюнкция таблица истинности a b (a or b) 0 0 0 0 1 1 1 0 1 1 1 1
т.е. a or b = 0, если a=0 и b=0;
используется для "включения" битов:
допустим в al лежит 00001010 а маска равна 11110101 тогда после or al, 11110101b в al будет 11111111
and - "и", логическое умножение, конъюнкция
a b (a and b) 0 0 0 0 1 0 1 0 0 1 1 1
т.е. a and b = 1 только если a=1 и b=1
используется для "выключения" битов, вычисления остатка от деления на степень двойки(в частности)
допустим в al лежит 11111010 а маска равна 00000101 тогда после and al, 11110101b в al будет 00000000
Сообщение отредактировал wcpt - Пятница, 18 Октября 2013, 21:59 |
|
| |
|