СообЧа > База Знаний > Программирование > Assembler

Вопрос

Не подскажите ли Вы где в сети можно найти электронные книги по программированию портов на асме? Каких все равно, но лучше сразу всех: последовательные, параллельные и т.п.! Конкретно задача: подключить к порту каконть светодиод (или прочие логические элементы) и программно управлять его работой.

Ответ

Некорректно поставленный вопрос.
Порты не "программируются", они используются для передачи данных к/от устройств с помощью инструкций IN и OUT. Тебе же, надо полагать, хочется поиметь информации по программированию контроллеров и устройств через порты ввода-вывода. В этом случае я могу порекомендовать заглянуть на следующие сайты:
http://alexfru.chat.ru
http://yusoft.kulichki.com/russian/

Из конференции Expert_FAQ

Вопрос

Как из ячейки памяти с адресом xxxx:xxxx записать два байта в ячейку yyyy:yyyy?

Ответ

Присвоить адрес этой ячейки ригистру Si и переслать два байта в уже обозначеный регистр Di командой movsb

Из конференции Expert_FAQ

Командой movsw (два байта).

Вопрос

В бэйсике есть такая вещь: динамические массивы, а как тоже самое реализовать на ассемблере?

Ответ

Есть такое хорошее прерывание — int 21h называется. А у этого прерывания есть такие хорошие функции:

(номер функци заносится в ah)
(параграф = 16 байт)
48h — выделение блока памяти:
bx — число выделяемых параграфов;

На выходе получаем: сf=1 — ошибка (код в ax)

cf=0 — нет ошибки. В ax — сегментный адрес памяти, bx — размер наибольшего свободного участка (в параграфах);
49h — освобождение блока памяти:
es — сегментный адрес освобождаемого блока;
на выходе cf=1 — ошибка (код в ax)

4ah — изменение длинны выделенного участка памяти:
es — сегментный адрес блока памяти; bx — нужное число параграфов на выходе: cf=1 — ошибка (код в ax)

Саму память ты можешь интерпретировать как душе пожелается — хоть массив байт, хоть массив слов и т.д.

Из конференции Expert_FAQ

Или если про мастдай то юзай HeapCreate, HeapAlloc, HeapReAlloc, HeapFree, HeapDestroy

Вопрос

MASM32 v7
Скачал с wasm.ru несколько файлов с исходниками, например:
{{!> http://wasm.ru/src/5/flux.zip<!}}.

Так вот запускаю эту программу, запускаю System Information из NU2002 и он показывает, что программа занимает в памяти 547Кб.

Запустил {{!> http://wasm.ru/src/1/watereff.zip<!}} — вообще 114Кб.
Запускаю программу, 2-й Tutorial Iczelion'a, который только показывает msgbox:

SysInfo говорит, что программа занимает 1,88Мб.

В чем дело, почему такая разница?
И вообще посоветуйте, чем смотреть сколько программа занимает в памяти?

Ответ

Скорее всего, вы смотрите общий объем… включая все системные библиотеки, но сколько программ используют kernel32.dll ? :) Поэтому, я советую смотреть в Details строчку «Total Non-Shared Memory used»

#include <windows.h> int APIENTRY
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL,"Message!",NULL,MB_OK); return 0;
}


336 кб всего, но 35,6 кб — Total Non-Shared Memory used

Из конференции Expert_FAQ

Вопрос

Хочется узнать, как правильно работать из ассемблера с клавиатурой. Задача такого плана: реализовать программу, которая бы выводила в центре экрана 6 кружочков (в текстовом режиме) серого цвета. При нажатии на клавишу [Q] — самый левый кружочек становится зеленым, при отпускании клавиши — опять серым. Тоже самое происходит с остальными кружочками при нажатии клавиш клавиатуры [W], [E], [R], [T], [Y]. При нажатии на нижерасположенные клавиши [A], [S], [D], [F], [G], [H] происходит все тоже самое, только цвет — красный. По клавише Escape — выход из программы. Вопрос: как реализовать обработку сразу нескольких клавишь т.е. при нажатии Q+S+E+F+T+H должно быть: G R G R G R * G-зеленый R-красный.

Ответ

; программа выводит 3 круга и по QWE раскрашивает их в синий-зеленый-красный.
; здесь — основы, до кондиции доводите самостоятельно

.286
StSeg SEGMENT WORD STACK 'STACK'
DB 400h DUP (?)
StSeg ENDS


SEGMENT DSeg WORD
strOutput DB 'O',07h,'O',07h,'O',07h
intOutputLen EQU $-strOutput
blnExit DB 0
ENDS

SEGMENT Code WORD
ASSUME CS:Code, DS:DSeg

; Обработчик клавиного прерывания
Handle09h PROC FAR
pusha
push ds

mov ax,DSeg
mov ds,ax

in al,60h

; метки — буква (Q/W/E) + действие (up/down)
cmp al,01h
je @ESC
cmp al,10h
je @Qd
cmp al,11h
je @Wd
cmp al,12h
je @Ed
cmp al,90h
je @Qu
cmp al,91h
je @Wu
cmp al,92h
je @Eu
jmp @H9NoTask

@ESC:
mov byte ptr blnExit,1
jmp @H9NoTask

@Qd:
mov al,1
mov strOutput+1,al
jmp @H9NoTask
@Wd:
mov al,2
mov strOutput+3,al
jmp @H9NoTask
@Ed:
mov al,4
mov strOutput+5,al
jmp @H9NoTask
@Qu:
mov al,7
mov strOutput+1,al
jmp @H9NoTask
@Wu:
mov al,7
mov strOutput+3,al
jmp @H9NoTask
@Eu:
mov al,7
mov strOutput+5,al
jmp @H9NoTask

@H9NoTask:
pop ds
popa

DB 0EAh ; JMP FAR
Old9Handle DW OFFSET @H9Lir
DW SEG @H9Lir
@H9Lir:
IRet
Handle09h ENDP

; Начало проги
Main:

; ставим обработчик
xor ax,ax
mov ds,ax
mov bx,ds:[9*4]
mov cx,ds:[9*4+2]
mov ax,dseg
mov ds,ax
mov word ptr old9handle,bx
mov word ptr old9handle+2,cx ; gethandle

mov cx,cs
mov bx,offset Handle09h
xor ax,ax
mov ds,ax
cli
mov ds:[9*4],bx
mov ds:[9*4+2],cx
sti
mov ax,dseg
mov ds,ax ; sethandle


; основной цикл
mov ax,DSeg
mov ds,ax
mov ax,0B800h ; для ч/б мониторов будет др. цифра
mov es,ax

MainLoop:
mov DI,1676
mov SI,OFFSET strOutput
mov CX,intOutputLen
rep movsb

mov ah,01h
int 16h
jz NoKey

xor ax,ax
int 16h

NoKey:

mov al,blnExit
or al,al
jz MainLoop

; убираем обработчик
mov bx,word ptr old9handle
mov cx,word ptr old9handle+2
xor ax,ax
mov ds,ax
cli
mov ds:[9*4],bx
mov ds:[9*4+2],cx
sti
mov ax,dseg
mov ds,ax ; sethandle

mov ax,4C00h
int '!'
ENDS

END Main

Вопрос

В Бэйсике есть такая вещь: динамические массивы, а как тоже самое реализовать на ассемблере?

Ответ

Я тоже долго мучался над этим, только в с++, но принцип везде один:

создаешь =кучу=, можешь использовать от процесса (GetProcessHeap())

hHeap_=HeapCreate(HEAP_NO_SERIALIZE,0,0);

выделяем память пка под один элемент

ulItemSize_- размер элемента в массиве

lpMem_=HeapAlloc(hHeap_,HEAP_NO_SERIALIZE,ulItemSize_);
ulMemSize_ размер выделенной памяти
ulCount_ кол-во элементов в массиве

======добавка элемента

ULONG ulNewSize_=ulMemSize_+ulItemSize_;
lpMem_=HeapReAlloc(hHeap_,HEAP_NO_SERIALIZE,lpMem_,(ulNewSize_+8));
if (lpMem_) { LPVOID p=((LPSTR)lpMem_+ulMemSize_);
CopyMemory(p,lpItem,ulItemSize_);
ulCount_++;
ulMemSize_=ulNewSize_;
// HeapCompact(hHeap_,0);
return ulCount_;
}


=======ресайзинг массива

ULONG ulNewSize_=(ulNewCount_*ulItemSize_);
lpMem_=HeapReAlloc(hHeap_,HEAP_NO_SERIALIZE,lpMem_,(ulNewSize_+8));
if (lpMem_) { ulCount_=ulNewCount_;
ulMemSize_=ulNewSize_; // HeapCompact(hHeap_,0);
bRet=1;
}


============ доступ к нужному элементу

(lpMem_+(ulItem*ulItemSize_))

Из конференции Expert_FAQ

Вопрос

Как создать программу, использующую Tab Control, т.е. закладки: только через CreateWindow и т.д, или через ресурсы. Если через ресурсы, то каким редактором ресурсов, это можно сделать (у меня Borland Resource Workshop 4.5), и вообще какой на ваш взгляд лучший редактор ресурсов?

Ответ

В дистрибутиве MASM32 (брать тут — www.wasm.ru есть каталог с примерами \EXAMPLE6\GETSET\ — в файле RSRC.rc так описаны ярлычки:

;;;;;;;;Main dialog;;;;;;;;;
IDD_DIALOG1 DIALOG DISCARDABLE 20, 20, 300, 280 STYLE DS_MODALFRAME
| WS_POPUP
| WS_CAPTION
| WS_SYSMENU
| WS_MINIMIZEBOX CAPTION "Get & Set v1.3 by Vom-bonjour:-()" FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "&Exit", IDC_BUTTONQU, 245, 258, 45, 12, WS_BORDER
| WS_TABSTOP CONTROL "Tab1",IDC_TAB1,"SysTabControl32",0x0,0,0,300,240
END


А ниже описаны два вкладыша:

;;;;;;;;Child Dialog 2;;;;;;;;;
IDD_CHILD2 DIALOG 3, 20, 294, 218 STYLE WS_CHILD FONT 8, "MS Sans Serif"
{ PUSHBUTTON "&About", IDC_BUTTON1, 251, 198, 38, 14, NOT WS_TABSTOP
| WS_BORDER EDITTEXT 3615, 7, 7, 245, 188, WS_BORDER
| WS_GROUP
| WS_VSCROLL
| ES_MULTILINE }

;;;;;;;;Child Dialog 1;;;;;;;;;
IDD_CHILD1 DIALOG 3, 20, 294, 218 STYLE WS_CHILD FONT 8, "MS Sans Serif"
{ LTEXT "Caption :", -1, 25, 30, 30, 10 EDITTEXT IDC_EDIT_CLASS, 78, 48, 50, 13, ES_AUTOHSCROLL
| WS_BORDER
| WS_TABSTOP }


Что касается редактора ресурсов — то как известно — на вкус и цвет товарища нет :)

Выбирайте: www.wasm.ru
Лично мне хватает Resource Hacker, да и борландовский не плох.

Из конференции Expert_FAQ

Вопрос

Хочу учить ассемблер, но мои знакомые утверждают, что под виндой это вообще делать противопоказано.

Ответ

Если хочешь научиться асму под винду — не бойся. Под виндой ты «случайно» вирус не напишешь :) да и такой же вред можно принести при помощи Апи функций любого языка программирования. Для железа это определенно не опасно, но вот для виндов…
Ниже приведены факты из моей биографии.

На асме я писал драйвера и поэтому мне нужна была подготовленное рабочее место. В принципе, на асме можно запороть винду, и для этого больших мозгов не надо, скорее наоборот. Началось с того, что я установил у себя винь98, практически голую — только дрова под железо для стабильной работы. Потом на Эту винду поставил Тасм5 от борланда для компиляции, фар менеджер для редактирования файлов и SoftIce для дебага. Настроил их всех. Отполировал винду, дефрагентировал файлы, реестр. Протестировал работу (совсем немного). Получилась готовая к работе на Асме операционка — быстрая и чистая. Ее я при помощи Ghost упаковал в бакапчик размером (смешно сказать) 120 мег и записал на матрицу с автозагрузкой Ghost. Получил компакт диск «Аварийный» с которого восстановить «Быструю и чистую» можно было менее чем за 15 минут (почуствуйте разницу).

Естественно, что ни одного рабочего файла не было на разделе с этой виндой — так как они бы уничтожились при восстановлении системы. За полтора года я восстанавливал винду раз 25-30 и могу сказать, что время сэкономленное таким приемом просто огромное. Не нужно рвать себе волосы когда что-то упадет — нервы важнее каких-нить виндов, не нужно тратить время на то, чтобы «поднять» упавшую операционку, просто вставляешь компакт… и через максимум 15 минут возвращается рабочее состояние.
А вообще, я считаю что на асме кроме дров нечего больше делать. Хочешь быть быстрым и маленьким — будь создан на VisualC++.

******

Никаких C++ или Delphi.
www.wasm.ru

Kba3iM0go

На ASM пишутся _Самые_маленькие,_самые_ быстрые и мощные программы.

Mafia

Вопрос

Существуют ли нормальные оболочки под винду чтобы писать на асме под винду? Желательно чтобы в них были всякие фишечки как в делфи или визуал С.

Ответ

RadASM — попытка создать рабочую среду, аналогичную Delphi, но заточенную под ассемблер. Рабочая область включает в себя несколько инструментов: панель с инструментами визуального создания диалоговых окон (поддерживаются практически все классы окон, а самое главное, можно использовать «user defined control», если вам нужно поместить на форму контрол, который не поддерживается RadASM'ом), редактор кода, панель управления проектом, и «Properties», по виду очень напоминающий Object Inspector и выполняющий ту же функцию. RadASM поддерживает MASM и FASM (Flat Assembler).

Aquila, Serrgio

Строго говоря, RADAsm не является IDE для ассемблера по ряду причин: наличие внешнего, а не внутреннего компилятора, упомянутый редактор диалогов позволяет всего лишь создавать ресурсы для программы, запускать их придется самому, не содержит средств для автоматизации создания приложения (например, мастеров, как в VC++).
Тем более нельзя его сравнивать с событийно-ориентированным Delphi, RADAsm не предоставляет возможности разрабатывать приложения на основе событийно-ориентированной концепции. Последняя в настоящее время воплощается в открытом проекте Fresh на основе ассемблера FASM, но степень его готовности — pre-alpha.

sharp-c

Вопрос

Чем MASM отличается от TASM?

Ответ

MASM — это компилятор ассемблера компании Microsoft, TASM в свою очередь — компилятор компании Borland. MASM (как, впрочем, и TASM)поддерживает использование макроопределений, что приближает его к языкам высокого уровня и облегчает написание программ (TASM, кроме использования макроопределений имеет дополнительный, еще более мощный режим Ideal). Макроопределения можно образовывать и перестраивать с использованием специальных операторов даже на лету при компиляции программы.

Yaroslav

TASM кроме того еще имеет встроенные стребства ООП. Но мой совет — юзай masm32. И вообще — www.wasm.ru

******

Помимо всего прочего, MASM и TASM отличаются количеством подключаемых файлов. В MASM'е это — по файлу на каждую системную DLL, а в TASM — один для всех.
Для использования рекомендуется MASM, поскольку он развивается усилиями энтузиастов, а TASM заброшен компанией Borland.

sharp-c



Copyright © 2000-2004 Сообщество Чайников
Контактная информация