Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ASM - с чего начать? 
:(
    Опции темы
Chingachguk
Дата 16.3.2005, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



Чуть позже опять положу. Это обычный паскаль 7.0 для DOS.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Payne
Дата 11.4.2005, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Детектив
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 6.4.2005
Где: Петербург

Репутация: нет
Всего: 10



Chingachguk: я недавно зарегистрировался, попал в этот топик - чуть не офигел! Первые три урока все было настолько понятно, просто до ужаса! Разобрался во всем. Вот четвертый - не понял. Точнее, многое не понял. Да и еще вопрос: почему уроков больше нет? Идет обсуждение всякой лабуды, словно нельзя для этого отдельную тему создать :-(. А тема-то все-таки называется "Асм - с чего начать?". Хотелось бы уроков.
PM MAIL WWW ICQ Skype   Вверх
Chingachguk
Дата 11.4.2005, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



Цитата
Вот четвертый - не понял.


Насколько я помню, там была речь про прерывания. У меня не было цели добиться полного понимания того, что это такое и как с ним работать. Поскольку настоящее понимание возможно только с опытом. Там была мысль дать почуствовать - каково это, когда код выполняется нелинейно. Ну просто попробовать ;)

Цитата
Да и еще вопрос: почему уроков больше нет?


Я задавал этот вопрос, но никто особо не пожелал или не высказал ничего конкретного - чего бы ему хотелось.

Собственно, далее по моему мнению должна идти практика. Берем задачку и решаем ее. Возможно, полностью не понимая того, что происходит. Но на принципах, изложенных в уроках 1-3.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Payne
Дата 13.4.2005, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Детектив
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 6.4.2005
Где: Петербург

Репутация: нет
Всего: 10



Цитата
Поскольку настоящее понимание возможно только с опытом

Да, что правда, то правда.
Цитата
никто особо не пожелал или не высказал ничего конкретного - чего бы ему хотелось

Вот где-то после третьего урока все начали присылать коды с решениями заданий. Но эти коды были основаны не на тех циклах, которые юзались в уроке. Там фигурировала команда cld. Я так понял, что она увеличивает (уменьшает) значение счетчика (при организации циклов). Расскажи вкратце об этой команде, плз.
PM MAIL WWW ICQ Skype   Вверх
Chingachguk
Дата 13.4.2005, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



Команда cld не влияет на счетчики циклов (обычно это регистры или ячейки памяти), команда влияет на флаг направления DF (direct flag) в регистре флагов процессора.

DF влияет на выполнение так называемых строковых команд movsb, cmpsb, scasb (movsw, cmpsw,...).

Что такое строковые команды ? Это нечто вроде макрокоманды, но на уровне процессора, сделано для удобства программирования.

Возьмем задачу пересылки блока данных (байт) из одной области памяти в другую:

Код

mov si,offset SourceMemory ; Адрес начала источника - смещение
mov ds, seg SourceMemory ; Адрес начала источника - сегмент
mov di,offset DestMemory ; Адрес начала приемника - смещение
mov es, seg DestMemory ; Адрес начала приемника - сегмент
mov cx,SizeofBlock ; Размер пересылаемой области

; Мы пересылаем из адреса ds:si в адрес es:di cx байт

@@MoveBlock:

mov  al,ds:[si] ; Получить пересылаемый байт в AL
mov  es:[di],al ; Записать его в приемник
inc  si ; Указать на следующий байт в источнике
inc  di ; Указать на следующий байт в применике

loop @@MoveBlock ; Перейти к следующему байту или закончить ~ while (--cx);


С помощью строковых команд, в этом случае - movsb, мы можем упростить решение следующим образом:

Код

mov si,offset SourceMemory ; Адрес начала источника - смещение
mov ds, seg SourceMemory ; Адрес начала источника - сегмент
mov di,offset DestMemory ; Адрес начала приемника - смещение
mov es, seg DestMemory ; Адрес начала приемника - сегмент
mov cx,SizeofBlock ; Размер пересылаемой области

; Мы пересылаем из адреса ds:si в адрес es:di cx байт
cld ; Указываем процессору, что после mosvb надо увеличивать si и di,
; а не уменьшать

@@MoveBlock:

movsb ; передать из ds:[si] байт в es:[di] и увеличить si и di на 1.

loop @@MoveBlock ; Перейти к следующему байту или закончить ~ while (--cx);


Таким образом, одна команда movsb делает абсолютно то же, что делают 4 команды выше.

Однако в результате выполнения movsb регистры si & di получили приращение, однако это произошло потому, что флаг направления DF был сброшен командой cld !

Если бы мы установили этот флаг командой std, то после выполнения movsb процессор бы уменьшил si & di на 1. Это может быть удобно в том случае, если копируются перкрывающиеся блоки данных. Если делать копирование вперед и с начала блока, то часть данных будет потеряна. Однако мы могли бы переписать копирование следующим образом:

Код

mov cx,SizeofBlock ; Размер пересылаемой области
mov ax,cx
dec  ax
mov si,offset SourceMemory ; Адрес начала источника - смещение
add si,ax ; Адрес последнего байта в источнике
mov ds, seg SourceMemory ; Адрес начала источника - сегмент
mov di,offset DestMemory ; Адрес начала приемника - смещение
add di,ax ; Адрес последнего байта в приемнике
mov es, seg DestMemory ; Адрес начала приемника - сегмент

; Мы пересылаем из адреса ds:si в адрес es:di cx байт
std ; Указываем процессору, что после mosvb надо уменьшать si и di

@@MoveBlock:

movsb ; передать из ds:[si] байт в es:[di] и уменьшить si и di на 1.

loop @@MoveBlock ; Перейти к следующему байту или закончить ~ while (--cx);


Еще мы бы могли вообще обойтись без циклов и использовать префикс REP (повторять следующую команду CX раз):

Код

mov cx,SizeofBlock ; Размер пересылаемой области
mov ax,cx
dec  ax
mov si,offset SourceMemory ; Адрес начала источника - смещение
add si,ax ; Адрес последнего байта в источнике
mov ds, seg SourceMemory ; Адрес начала источника - сегмент
mov di,offset DestMemory ; Адрес начала приемника - смещение
add di,ax ; Адрес последнего байта в приемнике
mov es, seg DestMemory ; Адрес начала приемника - сегмент

; Мы пересылаем из адреса ds:si в адрес es:di cx байт
std ; Указываем процессору, что после mosvb надо уменьшать si и di

rep mosvb ; !




--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Payne
Дата 14.4.2005, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Детектив
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 6.4.2005
Где: Петербург

Репутация: нет
Всего: 10



Можно ли получить информацию о кодах сканирования клавиатуры, которые помещаются в регистр AH после нажатия клавиши во время прерывания
Код

mov ah,00
int 16h

PM MAIL WWW ICQ Skype   Вверх
Chingachguk
Дата 14.4.2005, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



Информация ниже взята из книги Зубкова С.В.

Цитата
.4.2. Средства BIOS
Так же как и для вывода на экран, BIOS предоставляет больше возможностей по сравнению с DOS для считывания данных и управления клавиатурой. Например, функциями DOS нельзя определить нажатие комбинаций клавиш типа Ctrl-Alt-Enter или нажатие двух клавиш Shift одновременно, DOS не может определить момент отпускания нажатой клавиши, и наконец, в DOS нет аналога функции С ungetch(), помещающей символ в буфер клавиатуры, как если бы его ввел пользователь. Все это можно осуществить, используя различные функции прерывания 16h и операции с байтами состояния клавиатуры.



INT 16h, АН = 0, 10h, 20h — Чтение символа с ожиданием

Ввод: АН = 00h (83/84-key), 10h (101/102-key), 20h (122-key)
Вывод: AL = ASCII-код символа, 0 или префикс скан-кода
АН = скан-код нажатой клавиши или расширенный ASCII-код


Каждой клавише на клавиатуре соответствует так называемый скан-код (см. приложение 1), соответствующий только этой клавише. Этот код посылается клавиатурой при каждом нажатии и отпускании клавиши и обрабатывается BIOS (обработчиком прерывания INT 9). Прерывание 16h дает возможность получить код нажатия, не перехватывая этот обработчик. Если нажатой клавише соответствует ASCII-символ, то в АН возвращается код этого символа, а в AL — скан-код клавиши. Если нажатой клавише соответствует расширенный ASCII-код, в AL возвращается префикс скан-кода (например, Е0 для серых клавиш) или 0, если префикса нет, а в АН — расширенный ASCII-код. Функция 00Н обрабатывает только комбинации, использующие клавиши 84-клавишной клавиатуры, l0h обрабатывает все 101 – 105-клавишные комбинации, 20h — 122-клавишные. Тип клавиатуры можно определить с помощью функции 09h прерывания 16h, если она поддерживается BIOS (поддерживается ли эта функция, можно узнать с помощью функции C0h прерывания 15h).



INT 16h, АН = 1, 11h, 21h — Проверка символа

Ввод: АН = 01h (83/84-key), 11h (101/102-key), 21h (122-key)
Вывод: ZF = 1, если буфер пуст
ZF = 0, если в буфере присутствует символ, в этом случае
AL = ASCII-код символа, 0 или префикс скан-кода
АН = скан-код нажатой клавиши или расширенный ASCII-код


Символ остается в буфере клавиатуры, хотя некоторые BIOS удаляют символ из буфера при обработке функции 01h, если он соответствует расширенному ASCII-коду, отсутствующему на 84-клавишных клавиатурах.



INT 16h, АН = 05h — Поместить символ в буфер клавиатуры

Ввод: АН = 05h
СН = скан-код
CL = ASCII-код
Вывод: AL = 00, если операция выполнена успешно
AL = 01h, если буфер клавиатуры переполнен
АН модифицируется многими BIOS


Обычно можно поместить 0 вместо скан-кода в СН, если функция, которая будет выполнять чтение из буфера, будет использовать именно ASCII-код. Например, следующая программа при запуске из DOS вызывает команду DIR (но при запуске из некоторых оболочек, например FAR, этого не произойдет).

; ungetch.asm
; заносит в буфер клавиатуры команду DIR так, чтобы она
; выполнилась сразу после завершения программы
;
        .model    tiny
        .code
        org        100h          ; СОМ-файл
start:
        mov        cl,'d'        ; CL = ASCII-код буквы "d"
        call      ungetch
        mov        cl,'i'        ; ASCII-код буквы "i"
        call      ungetch
        mov        cl,'r'        ; ASCII-код буквы "r"
        call      ungetch
        mov        cl,0Dh        ; перевод строки
ungetch:
        mov        ah,5          ; AH = номер функции
        mov        ch,0          ; CH = 0 (скан-код неважен)
        int        16h            ; поместить символ в буфер
        ret                      ; завершить программу

        end        start

INT 16h, AH = 02h, 12h, 22h — Считать состояние клавиатуры

Ввод: АН = 02h (83/84-key), 12h (101/102-key), 22h (122-key)
Вывод: AL = байт состояния клавиатуры 1
АН = байт состояния клавиатуры 2 (только для функций 12h и 22h)


Байт состояния клавиатуры 1 (этот байт всегда расположен в памяти по адресу 0000h:0417h или 0040h:0017h):

Бит 7: Ins включена

Бит 6: CapsLock включена

Бит 5: NumLock включена

Бит 4: ScrollLock включена

Бит 3: Alt нажата (любая Alt для функции 02h, часто только левая Alt для 12h/22h)

Бит 2: Ctrl нажата (любая Ctrl)

Бит 1: Левая Shift нажата

Бит 0: Правая Shift нажата

Байт состояния клавиатуры 2 (этот байт всегда расположен в памяти по адресу 0000h:0418h или 0040h:0018h):

Бит 7: SysRq нажата

Бит 6: CapsLock нажата

Бит 5: NumLock нажата

Бит 4: ScrollLock нажата

Бит 3: Правая Alt нажата

Бит 2: Правая Ctrl нажата

Бит 1: Левая Alt нажата

Бит 0: Левая Ctrl нажата

Оба этих байта постоянно располагаются в памяти, так что вместо вызова прерывания часто удобнее просто считывать значения напрямую. Более того, в эти байты можно записывать новые значения, и BIOS изменит состояние клавиатуры соответственно:

; nolock.asm
; самая короткая программа для выключения NumLock, CapsLock и ScrollLock
; запускать без параметров
        .model    tiny
        .code
        org        100h        ; СОМ-файл. АХ при запуске СОМ-файла без параметров
                              ; в командой строке всегда равен 0
start:
        mov        ds,ax                  ; так что теперь DS = 0
        mov        byte ptr ds:0417h,al  ; байт состояния клавиатуры 1=0
        ret                              ; выход из программы
        end        start

Разумеется, в реальных программах, которые будет запускать кто-то, кроме автора, так делать нельзя, и первой командой дожна быть xor ах,ах.

Помимо этих двух байт BIOS хранит в своей области данных и весь клавиатурный буфер, к которому также можно обращаться напрямую. Буфер занимает 16 слов с 0h:041Eh no 0h:043Dh включительно, причем по адресу 0h:041Ah лежит адрес (ближний) начала буфера, то есть адрес, по которому располагается следующий введенный символ, а по адресу 0h:041Ch лежит адрес конца буфера, так что если эти два адреса равны, буфер пуст. Буфер действует как кольцо: если начало буфера — 043Ch, а конец — 0420h, то в буфере находятся три символа по адресам 043Ch, 041Eh и 0420h. Каждый символ хранится в виде слова — того же самого, которое возвращает функция 10h прерывания INT 16h. В некоторых случаях (если) буфер размещается по другим адресам, тогда адрес его начала хранится в области данных BIOS по адресу 0480h, а конца — по адресу 0482h. Прямой доступ к буферу клавиатуры лишь немногим быстрее, чем вызов соответствующих функций BIOS, и для приложений, требующих максимальной скорости, таких как игры или демо-программы, используют управление клавиатурой на уровне портов ввода-вывода.




--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
CnApTaK
Дата 10.7.2005, 13:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











w32 инсталятор Turbo Pascal 7.0 for DOS
  Вверх
Гость_Начинающий
Дата 31.10.2005, 10:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











(о первом уроке) А если мне надобно обращатся не к конкретному адресу?Как его загнать в переменную? Напр
Код

...
       mov  ax,0A000h
        mov  es,ax
  xor bx,bx
  xor dx,dx
  mov ax,offset [320*100+100]
  mov  byte ptr es:ax,12
...

упорно не хочет ставить точку.Где ошибка?
  Вверх
oleg1973
Дата 31.10.2005, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



mov ax,320*100+100


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Гость_Начинающий
Дата 1.11.2005, 10:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Без разницы.
  Вверх
Lonley
Дата 1.11.2005, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 7.10.2003
Где: северные ворота М урманск

Репутация: нет
Всего: 4



Код

IDEAL
MODEL TINY
CODESEG
ORG 100h
_start:
  mov ax,013h
  int 10h

  mov  ax,0A000h    
  mov  es,ax    
  xor  bx,bx    
  xor  dx,dx    
  mov  di,320*100+100    ; ax не используется для адресации памяти
  mov  es:[di],12        
  ; тут можно использовать si или di или bx но не ax
  
  xor ax,ax
  int 16h
  ret
  
end _start



--------------------
Земную жизнь пройдя до половины,
Я очутился в сумрачном лесу,
Утратив правый путь во тьме долины.
Каков он был, о, как произнесу,
Тот дикий лес, дремучий и грозящий,
PM MAIL ICQ   Вверх
kdaemonv
Дата 15.12.2005, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 21.10.2005

Репутация: нет
Всего: нет



Chingachguk, подскажи.
Вот этот код я набираю в debug (система WinXP SP1):

Код

XOR     AX,AX
MOV     DS,AX
MOV     [0417],AL
RET


Это аналог "самой короткой программы для выключения NumLock, CapsLock и ScrollLock" приведенной выше.
После выполнения этого кода результата никакого - как горел NumLock так и горит.
Это винда мне мешает изменять этот кусок памяти??? И если да, как она это делает и как мне с этим бороться???
PM MAIL   Вверх
Chingachguk
Дата 16.12.2005, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



Да, может быть что и винда. Попробуй загрузицца с дискеты в досе.

Нижеприведенный код точно работает в 98:

Код

.286
text segment byte public
    assume cs:text,ds:text
    org 100h
begin:  mov  bl,1+4+16+64
@Cyc:   mov  ah,2
        call @Wait
        mov  al,0edh
        out  60h,al
        mov  ah,1
        call @Wait
        mov  al,bl
        and  al,7
        out  60h,al
        mov  ah,2
        call @Wait
        rol  bl,1
        xor  dx,dx
@Delay: call @Wait
        dec  dx
        jnz  @Delay
        mov  ah,1
    int  16h
        jz   @Cyc
@GoDos: xor  ah,ah
        int  16h
        mov  ax,4c00h
        int  21h
@Wait:  xor  cx,cx
@Test:  in   al,64h
        test al,ah
        loopnz @Test
        jnz  @Error
        retn
@Error: pop  ax
        mov  ah,09
        mov  dx,offset ErrMess
        int  21h
        jmp  @GoDos
ErrMess db 'Error !','$'
text ends
    end begin


Это сообщение отредактировал(а) Chingachguk - 16.12.2005, 10:19


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Гость_Merlin
Дата 8.1.2006, 14:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Народ помогите умоляю!!!!!!! Срочно нужна прога на чистом ассемблере (без паскаля) рисующая на экране небольшой круг и перемещающая его через некоторое время в рандомное положение. Пожалуйста кто может с комментариями. Вам же это раз плюнуть. Горю на допуске к экзамену!!!
Или если есть что-то подобное шлите на [email protected]. Буду бесконечно благодарен
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.1376 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.