Среда, 13 Ноября 2024, 11:42

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
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.
Ну или предложите что-то другое... Не особо хочется голову насиловать с этими настройками каждый раз... sad
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. Кстати, иные ассемблерщики просто помешаны на битовых "трюках", им лишь бы размер программы уменьшить smile
Ну, в этом и заключается одно из достоинств ассемблера...
результат умножения будет либо в 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. понятия не имею как работает [...]. Понимаю что оно делает, но как работает - нет sad Препод написал, что это для нас пока что рановато, типа в такие дебри лезть не надо...

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
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг