Язык ассемблера (автокод) — язык программирования низкого уровня. В отличие от языка машинных кодов, позволяет использовать более удобные для человека мнемонические (символьные) обозначения команд. При этом для перевода программы с языка ассемблера в понимаемый процессором машинный код требуется специальная программа, называемая ассемблером.
Содержание языка
Команды языка ассемблера один к одному соответствуют командам процессора, фактически, они представляют собой более удобную для человека символьную форму записи (мнемокод) команд и их аргументов. При этом одной команде языка ассемблера может соответствовать несколько команд процессора.
Кроме того, язык ассемблера позволяет использовать символические метки вместо адресов ячеек памяти, которые при ассемблировании заменяются на автоматически рассчитываемые абсолютные или относительные адреса, а также так называемые директивы (команды, не переводящиеся в процессорные инструкции, а выполняемые самим ассемблером).
Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макроопределения с параметрами.
Каждая модель (или семейство) процессоров имеет свой набор команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы — Intel-синтаксис и AT&T-синтаксис.
Существуют компьютеры, реализующие в качестве машинного язык программирования высокого уровня (Forth, Lisp, Эль-76); фактически, в них он является языком ассемблера.
Ассе́мблер (от англ. assembler — сборщик) — компьютерная программа, компилятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке.
Как и сам язык (ассемблера), ассемблеры, как правило, специфичны конкретной архитектуре, операционной системе и варианту синтаксиса языка. Вместе с тем существуют мультиплатформенные или вовсе универсальные (точнее, ограниченно-универсальные, потому что на языке низкого уровня нельзя написать аппаратно-независимые программы) ассемблеры, которые могут работать на разных платформах и операционных системах. Среди последних можно также выделить группу кросс-ассемблеров, способных собирать машинный код и исполняемые модули (файлы) для других архитектур и ОС.
Вот тут есть кой какая инфа-справка. Нам выдали. Правда, там ещё понамешано инфы по лабам и заданиям, но если кому интересно для обучения — берите. Выдирать не стал. Ссыль ~7.1 мб.
2d0x
02.10.2010 23:27
Kentаvr, собственно, самая главная ссылка и не дана: http://www.movsd.com/
Ну, и, опять же, MASM32 с http://www.masm32.com/ прекрасно работает под Windows. Пожалуй, я бы ещё добавил ссылку на ASM Editor for Windows 2.2d - очень удачный редактор исходного кода программ от AV(T) Lab, работающий совместно с внешними компиляторами, но официальная страничка с какого-то времени не находится. В принципе, при необходимости найти эту софтинку совсем несложно. Ну, и, собственно, ещё одна ссылка: http://www.wasm.ru/
Kentаvr
03.10.2010 00:10
Есть такое, да. Шапку писал буквально на коленке, как можно понять :)
Спасибо за ссылки, будем допиливать шапку. Если есть желание — можете взять.
Кар-Карыч
03.10.2010 19:36
Цитата:
Сообщение от Kentаvr
(Сообщение 8511332)
Вот тут есть кой какая инфа-справка. Нам выдали. Правда, там ещё понамешано инфы по лабам и заданиям, но если кому интересно для обучения — берите. Выдирать не стал.
Ссыль ~7.1 мб.
Пользы там конечно мало, если только по программированию контроллеров.
Kentаvr
03.10.2010 19:53
Цитата:
Сообщение от Кар-Карыч
(Сообщение 8516199)
Пользы там конечно мало, если только по программированию контроллеров.
Ну да, но хотя бы основы-то можно понять, что, как, почему, задания попробовать делать, учиться :)
Кар-Карыч
03.10.2010 20:16
Цитата:
Сообщение от Kentаvr
(Сообщение 8516270)
Ну да, но хотя бы основы-то можно понять, что, как, почему, задания попробовать делать, учиться :)
Программирование контроллеров аля " микроволновая печь" или "обработка болванки на станке с программным управлением" на данном форуме возможна только в чисто лабораторных целях, было бы предпочтение рассмотрения в практических целях, win32/Linux.
Kentаvr
03.10.2010 20:18
А зачем вгонять в рамки?) О чем есть нужда, то и нужно рассматривать :)
Кар-Карыч
03.10.2010 20:33
Цитата:
Сообщение от Kentаvr
(Сообщение 8516369)
А зачем вгонять в рамки?) О чем есть нужда, то и нужно рассматривать :)
Да нет конечно, только сведется все к банальному решению лаб.работ.
ACC
04.10.2010 01:05
Цитата:
только сведется все к банальному решению лаб.работ
а разве целевая аудитория данного форума не приводит к этому?
Дайте, пожалуйста, полный список команд в удобной для запоминания форме и место, где можно посмотреть примеры серьезных программ на ассембелре, что-то вроде калькулятора или графического термометра.
Дайте места, где можно посмотреть пример калькулятора в виндоусовской оболочке на ассемблере.
Если кто-то найдет (напишет?) готовый, щедро поделюсь кармой :)
[CCCP] Monster
05.01.2011 23:46
Brainiac, Ахахаха, жжошь :D Возьми любой дизассемблер, открой exe-шку виндового калькулятора - и будет тебе пример:D
Brainiac
06.01.2011 18:46
[CCCP] Monster, на самом деле смешного мало.
Это моё семестровое задание, а нам ассемблере вычитали так, что половины программ из интернета не понимаю.
А уж как написать калькулятор в облочке мне вообще кажется задачей невыполнимой.
Если есть альтруисты, готовые помочь, буду благодарен правда.
И да, насколько я знаю, все виндовские файлы зашифрованы, и что-то мне подсказывает, что ничего из этой идеи не выйдет.
Кар-Карыч
06.01.2011 23:08
Цитата:
Сообщение от Brainiac
(Сообщение 8886752)
А уж как написать калькулятор в облочке мне вообще кажется задачей невыполнимой.
Да та сложного нет ни чего, составляешь файл ресурсов оболочки, остальное дело техники, где-то примерно так.
Скрытый текст:
windlg.rc
Код:
// windlg.rc
// Файл ресурсов, описывающий диалог, используемый в программе
PUSHBUTTON "7",IDC_EXIT,15,70,13,13
PUSHBUTTON "8",IDC_EXIT,35,70,13,13
PUSHBUTTON "9",IDC_EXIT,55,70,13,13
END
ZDLG_MENU MENU // меню
BEGIN
POPUP "Test"
BEGIN
MENUITEM "Get ",IDM_GETTEXT
MENUITEM "Clear ",IDM_CLEAR
MENUITEM SEPARATOR
MENUITEM "E&xit",IDM_EXIT
END
END
Скрытый текст:
WINDLG.ASM
Код:
; windlg.asm
; Компиляция MASM
; ml /c /coff /Cp windlg.asm
; rc /r windlg.rc
; link windlg.obj windlg.res /subsystem:windows
.386
.model flat
.data
dialog_name db "ZZZ_Dialog",0 ; имя диалога в ресурсах
.data?
buffer db 512 dup(?) ; буфер для введённого текста
.code
_start:
xor ebx,ebx ; в EBX будет 0 для команд push 0 (короче в 2 раза)
; определим идентификатор нашей программы
push ebx
call GetModuleHandle
; запустим диалог
push ebx ; значение, которое перейдёт как параметр WM_INITDIALOG
push offset dialog_proc ; адрес процедуры типа DialogProc
push ebx ; идентификатор окна-предка (0 - ничей диалог)
push offset dialog_name ; адрес имени диалога в ресурсах
push eax ; идентификатор программы, в ресурсах которой
; находится диалог (наш идентификатор в EAX)
call DialogBoxParam
; выход из программы
push ebx
call ExitProcess
;
; процедура dialog_proc
; вызывается диалогом каждый раз, когда в нём что-нибудь происходит
; именно здесь будут происходить вся работа программы
;
; процедура не должна изменять регистры EBP,EDI,ESI и EBX !
;
dialog_proc proc near
; так как мы получаем параметры в стеке, построим стековый кадр
push ebp
mov ebp,esp
; процедура типа DialogProc вызывается со следующими параметрами
dp_hWnd equ dword ptr [ebp+08h] ; идентификатор диалога
dp_uMsg equ dword ptr [ebp+0Ch] ; номер сообщения
dp_wParam equ dword ptr [ebp+10h] ; первый параметр
dp_lParam equ dword ptr [ebp+14h] ; второй параметр
mov ecx,dp_hWnd ; ECX будет хранить идентификатор диалога
mov eax,dp_uMsg ; а EAX - номер сообщения
cmp eax,WM_INITDIALOG ; если мы получили WM_INITDIALOG
jne not_initdialog
push IDC_EDIT
push dp_hWnd
call GetDlgItem ; определим идентификатор
push eax ; окошка редактирования текста
call SetFocus ; и передадим ему фокус
not_initdialog:
cmp eax,WM_CLOSE ; если мы получили WM_CLOSE
jne not_close
push 0
push ecx
call EndDialog ; закрыть диалог
not_close:
cmp eax,WM_COMMAND ; если мы получили WM_COMMAND
jne not_command
mov eax,dp_wParam ; EAX = wParam (номер сообщения)
cmp dp_lParam,0 ; если lparam ноль - сообщение от меню
jne lParam_not_0
cmp ax,IDM_GETTEXT ; если это пункт меню Get Text
jne not_gettext
push 512 ; размер буфера
push offset buffer ; адрес буфера
push IDC_EDIT ; номер конрола редактирования
push ecx
call GetDlgItemText ; считаем текст в buffer
push MB_OK
push offset dialog_name
push offset buffer
push dp_hWnd
call MessageBox ; и покажем его в MessageBox
not_gettext:
cmp eax,IDM_CLEAR ; если это пункт меню Clear
jne not_clear
push 0 ; NULL
push IDC_EDIT ; номер контрола
push ecx
call SetDlgItemText ; установим новый текст
not_clear:
cmp eax,IDM_EXIT ; если это пункт меню Exit
jne not_exit
push 0 ; код возврата
push ecx ; идентификатор диалога
call EndDialog ; закрыть диалог
lParam_not_0: ; lParam не ноль - сообщение от контрола
cmp eax,IDC_EXIT ; если сообщение от кнопки Exit
jne not_exit
shr eax,16
cmp eax,BN_CLICKED ; если её нажали
push 0 ; код возврата
push ecx ; идентификатор диалога
call EndDialog ; закрыть диалог
not_exit:
xor eax,eax ; после обработки команды
inc eax ; DialogProc должен возвращать TRUE (eax=1)
leave
ret 16 ; конец процедуры
not_command: ; сюда передаётся управление если мы получили
; какое-то незнакомое сообщение
xor eax,eax ; код возврата FALSE (eax=0)
leave
ret 16 ; конец процедуры
dialog_proc endp
end _start
[CCCP] Monster
08.01.2011 03:58
Brainiac, Господи, какой ужас. Нет, вовсе не зашифрованы, как тебе кажется. По крайней мере не все, и протез виндовый шифровать нет смысла. Так что смело хватай OllyDbg и открывай. Правда это мало поможет. Тут тебе вообще примеры не помогут никак - только личная практика. Ассемблер - столь низкоуровневый язык, что без обильных комментариев рефакторить чужой код в целях обучения - вообще бесполезное занятие. Значится так, колись, что было в программе обучения и что было реально начитано, а также - когда задание сдавать. Попробуем подобрать нужный материал. Если есть желание и хоть неделька времени - можно на что-то надеяться.
Brainiac
09.01.2011 01:50
[CCCP] Monster, в программе что было заложено не знаю.
Вообще, предмет называется "Вчислительные машины, системы и сети". По ассемблеру очень мало было: регистры, способы адресации, операции сдвига, общая структура программы (это вкратце).
Были лабы, но на них ничгео не успевалось уъясниться кроме каких-то мелочей о тех же регистрах.
И вот при всём при этом одно из семетровых заданий было написать пакмэна =___=
Вообще, сдавать уже 11-го. Но можно донести и на консультацию, меня за это палкой точно не побьют. А до нее как раз неделя.
В общем, если сможете помочь, будет ну очень здорово.
KimberLike
10.07.2011 16:00
Всем доброго времени суток!:)
Нужна помощь от знатаков языка Assmbler. Наверное, таких тут мало, т.к. и язык то по сути нафиг никому не нужен, но тем не менее я рискну спросить. :)
Нужно раскомментировать одну программку:
1. Составьте и наберите программу типа .СОМ для распечатки текущего каталога, воспользовавшись буфером обмена данными (DТА) из PSP
2. Откомпилируйтe, скомпонуйте и выполните составленную программу.
3. Установите свой DTA, используя функцию DOS прерывания int 21h. и снова распечатайте текущий каталог.
4. Смените текущий каталог и снова распечатайте файлы из нового каталога.
Код:
Скрытый текст:
message macro param
mov ah,9
lea dx,param
int 21h
endm
izobr macro
mov ah,2
mov dl,10
int 21h
mov ah,2
mov dl,13
int 21h
endm
dseg segment
error db 10,13,'ERROR',10,13,'$'
finish db 10,13,'==END of catalog',10,13,'$'
mess db 10,13,'file of shablon not detected',10,13,'$'
fewpar db 10,13,'Error! Empty command string!',10,13,'$'
dta db 2ch dup('$')
file db 14 dup (0)
dseg ends
cseg segment
assume cs:cseg, ds:dseg
start : mov ax,dseg
mov ds,ax
mov al,byte ptr es:[80h]
cmp al,0
je malo ;если равно, то переход на malo
mov si,2
mov di,0
readcom: mov al,byte ptr es:[80h+si] ; чтение командной строки
cmp al,13 ; сравнение al с числом 13
je da_next
mov file[di],al ; перемещение в file по смещению di
inc si ; увеличиваем на еденицу si
inc di
jmp readcom ; переход
jmp da_next
malo: message fewpar ; нет командной строки
jmp exit ; переход на выход
da_next: mov ah,1ah ; установить свой буфер обмена информацией
lea dx,dta
int 21h
mov ah,4eh ; поиск файла
lea dx,file
mov cx,11111111b ; счетчик
int 21h
jc err1
message dta[1eh]
izobr
prec: mov si,0
mov cx,13
clear: mov dta [1eh][si],'$'
inc si
loop clear
mov ah,4fh
lea dx,file
mov cx,11111111b
int 21h
jc cheke
message dta[1eh]
izobr
jmp prec
cheke: cmp ax,18
je da_last
message error
izobr
jmp exit
jmp prec
da_last: message finish
izobr
jmp exit
err1: message mess
exit: mov ah,8
int 21h
mov ah,4ch
int 21h
cseg ends
end start
Заранее ОГРОМНОЕ спасибо! :)
spyderDFX
11.07.2011 18:31
KimberLike, а что именно непонятно? Берёшь справочник по функциям BIOS и DOS (int 21h) и смотришь, какие из них используются
Кар-Карыч
12.07.2011 15:43
Цитата:
Сообщение от KimberLike
(Сообщение 9512311)
таких тут мало, т.к. и язык то по сути нафиг никому не нужен, но тем не менее я рискну спросить
Агась, и тебе тоже, решат тебе контрольную и все забудешь.
Mad-Dan
12.07.2011 16:23
Цитата:
т.к. и язык то по сути нафиг никому не нужен
обидел такой замечательный язык.... Хотя менеджеру среднего звена он действительно не нужен.
Стронглав
08.09.2011 04:34
Всем привет. Такой вопрос. Щас на асемблере прогаю, так вот сам файл с расширением асм, куда его девать в папку с тасмом, или же без разницы? просто в командной строке вечно ошибки пишет, одна из них такая: Can't locate file: prim.asm
Подскажиет что делать
[CCCP] Monster
08.09.2011 12:47
Стронглав, ну так смотри доки к сборщику - там должно быть написано какой командой указать путь к файлу.
Кар-Карыч
09.09.2011 15:14
Цитата:
Сообщение от Стронглав
(Сообщение 9673320)
Всем привет. Такой вопрос. Щас на асемблере прогаю, так вот сам файл с расширением асм, куда его девать в папку с тасмом, или же без разницы? просто в командной строке вечно ошибки пишет, одна из них такая: Can't locate file: prim.asm
Подскажиет что делать
Пути нужно полные писать до линковщика, напиши батник и брось в папку с .asm
где:
C:\masm32\bin\ml - путь к компилятору
C:\masm32\bin\link -путь к линковщику
Ov3r1oad
27.10.2011 23:30
Скачал отсюда http://www.wasm.ru/toollist.php?list=7 TASM 5+ и, честно говоря, не очень допонимаю принцип работы с ним. Вот я кинул в папку Tasm5Plus какой-нибудь lol.asm. В командной строке сделал C:\...\TASM5Plus Tasm32.exe lol.asm
Получил lol.obj, а что мне с ним дальше делать? Как exe получить?
Кар-Карыч
28.10.2011 16:14
Цитата:
Сообщение от Ov3r1oad
(Сообщение 9810571)
Получил lol.obj, а что мне с ним дальше делать? Как exe получить?
Подскажите какую-нибудь литературу, где все доходчиво объясняется. Если есть, то там, где рассказывается как пользоваться через эмулятор и работать с .exe и .com файлами.
Кар-Карыч
03.03.2012 19:41
Цитата:
Сообщение от Skull007
(Сообщение 10130104)
Если есть, то там, где рассказывается как пользоваться через эмулятор и работать с .exe и .com файлами.
Это что еще за эмулятор?
Рулей
03.03.2012 19:45
Цитата:
Сообщение от Кар-Карыч
(Сообщение 10130485)
Это что еще за эмулятор?
Возможно он имеет виду эмулятор для 64 битных систем.
Цитата:
Сообщение от Skull007
(Сообщение 10130104)
работать с .exe и .com файлами.
Я не понимаю смысла слова "работать", просто запускать? Или ты будешь редактировать их? Создавать новые? Пиши запросы поконкретнее.
Кар-Карыч
03.03.2012 19:54
Цитата:
Сообщение от *@ndrey*
(Сообщение 10130502)
Возможно он имеет виду эмулятор для 64 битных систем.
И причем тут ассемблер? Есть компиляторы есть вирт. машины чтоб запускать свои творения и не угробить систему. Об каком эмуляторе идет речь не понятно.
Skull007
03.03.2012 21:10
Цитата:
Сообщение от Кар-Карыч
(Сообщение 10130523)
Об каком эмуляторе идет речь не понятно.
Я имел ввиду DOSBox и да, для компиляции x16 на Win7. А так нужна сама литература по Ассемблеру, где доступно объяснено для начинающих.
Кар-Карыч
03.03.2012 21:34
Skull007, Вот тут, много полезных статей, особенно Уроки Iczelion'а все доходчиво описано.
Skull007
03.03.2012 22:14
Цитата:
Сообщение от Кар-Карыч
(Сообщение 10130709)
Вот тут, много полезных статей, особенно Уроки Iczelion'а все доходчиво описано.
А из бумажной литературы что лучше?
Кар-Карыч
03.03.2012 22:31
Цитата:
Сообщение от Skull007
(Сообщение 10130784)
А из бумажной литературы что лучше?
Все одинаково замутные.
Pауль
22.03.2012 15:34
Цитата:
.data
a db 1d
.code
.186
mov ax, 0
mov AL, a
После выполнения программы у меня в регистре ax лежит 00FF, что равняется 255 или -1, хотя я хотел положить туда 1. Что не правильно?
Кар-Карыч
22.03.2012 17:32
Цитата:
Сообщение от Pауль
(Сообщение 10172720)
Что не правильно?
Цитата:
Сообщение от Pауль
(Сообщение 10172720)
a db 1d
Если хотел присвоить шестнадцатеричное число то так и надо писать 1dh
Pауль
22.03.2012 20:06
Кар-Карыч
Я хотел присвоить десятичное, хотя 1 в десятичной и 16-ричной имеет один вид.
Как это сделать
Я писал и так
Цитата:
a db 1
Кар-Карыч
23.03.2012 14:58
Цитата:
Сообщение от Pауль
(Сообщение 10173230)
Я хотел присвоить десятичное, хотя 1 в десятичной и 16-ричной имеет один вид.
Как это сделать
Я писал и так
Какой компилятор?
Походу ты не правильно пользуешься компиляторам.
Код:
.data
param db 1
.code
.186
mov ax, 0
mov AL, [param]
Льюс Терин
12.02.2013 12:37
Цитата:
Сообщение от Kentаvr
(Сообщение 8511332)
Вот тут есть кой какая инфа-справка. Нам выдали. Правда, там ещё понамешано инфы по лабам и заданиям, но если кому интересно для обучения — берите. Выдирать не стал.
Ссыль ~7.1 мб.
Поднять можешь, не потерял еще?
Red-vampir
29.11.2013 10:43
Есть что-нибудь годное по ассемблеру под DOS-ом почитать? Желательно с примерами. Уровень знаний средний - кое-что знаю.