1 (изменено: DnsIs, 2012-02-27 21:45:48)

Тема: ASM: Есть люди разбирающиеся в асме?

Суть такова. Давным давно мне попалась интересная демка. Очень нравилась. Не так давно с помощью дизассемблера и пары дней времени, накатал код, который с точнойсть до байта васстанавливает демку.
В откомпилированном виде она занимает, 866 байт всего.

Кто-нибудь бы смог, вкраце описать алгоритм ее?

Елслу найдутся такие, выложу демку с исходником. (не при себе сейчас)

Нас невозможно сбить с пути, нам пофигу куда идти.

2

Re: ASM: Есть люди разбирающиеся в асме?

Очень-очень давно писал вычислительные ассемблерные вставки, кое-что простенькое пописывал и на чистом ассемблере. Сейчас подзабыл, но было бы интересно посмотреть и освежить свою память )))

( 2 * b ) || ! ( 2 * b )

3

Re: ASM: Есть люди разбирающиеся в асме?

Наврал, не 866, а 867 байт. Вот архив с демкой. Демка чисто DOSовая.
tasmed.com - оригинал
tasmed.asm - восстановленый исходник
make.cmd - это понятно
Компилится с помощью TASM 5.0

Меня хватило на дизассемблирование, а вот алгоритм посмотреть, почему то не решаюсь начать.

По сути, там кода на 700 байт (~320 строк кода) Остальное текст.
Минус всяческие стандартные процедуры: перехват прерываний, работа с таймером, вывод на экран.

Хочется просто формулу расчета цвета пикселей. И все.

Нас невозможно сбить с пути, нам пофигу куда идти.

4

Re: ASM: Есть люди разбирающиеся в асме?

DnsIs пишет:

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

И следом:

DnsIs пишет:

Меня хватило на дизассемблирование, а вот алгоритм посмотреть, почему то не решаюсь начать.

Это нарочитый алогизм или, простите, просто кич с налетом "таинственности"? Се к тому, что противоречие слишком явное.  Да и:

DnsIs пишет:

Хочется просто формулу расчета цвета пикселей. И все.

по сути является задачей для студентов, решение которой можно найти в учебниках-практикумах.
OFF: Хотя я и изучаю ассемблер уже более пяти лет, но программирую на нем крайне редко, в основном испульзую его там, где идет работа с аппаратной частью компьютера. В качестве компилятора использую MASM (увы, но TASM'ом разжиться не удалось, хотя многие его хвалят).

5 (изменено: DnsIs, 2012-03-01 21:44:17)

Re: ASM: Есть люди разбирающиеся в асме?

Асм я очень давно изучал, лет 15 назад и длилось то время совсем не долго и не проффесионально. Зная в то время, довольно неплохо бейсик, мне не давала спать мысль, как же работает такой загадочный непонятный язык, как асм. Потом же, когда я все таки раскрыл "тайну", было написано совсем немного утилиток простого характера. Поэтому, даже те небольшие куски знания позабыты.

Вспомнилась демка и я разделил для себя ковыряние на 2 этапа.
1 Собственно дизассемблирование.
2 Вникание в алгоритм.

Я не писал код с нуля! Я взял Hiew, сохранил исходник. Прогнал через ТАСМ. И потом просто исправил синтаксические ошибки. Мне кажется, что в таком небольшом исходнике много ума не надо.
Ковырять же чужой код мне тяжеловато, пусть даже такой маленький.
Но я не говорю, что не смогу, просто пока не могу себя заставить.

Нас невозможно сбить с пути, нам пофигу куда идти.

6

Re: ASM: Есть люди разбирающиеся в асме?

Стоит наверно через ИДу пропустить, может чего и интересного покажет.

7

Re: ASM: Есть люди разбирающиеся в асме?

Посмотрел код по диагонали. Какая-то работа с графикой (int 10h). Для каких-то нужд переустанавливается прерывание от таймера (int 08h) на пользовательское. Чтобы понять логику программы и сказать "это программа предназначена для ..." - надо "быть в теме". Я - нет.

( 2 * b ) || ! ( 2 * b )

8

Re: ASM: Есть люди разбирающиеся в асме?

2Rumata, greg zakharov пишет, что задача для студентов из учебников. 8)

Нас невозможно сбить с пути, нам пофигу куда идти.

9

Re: ASM: Есть люди разбирающиеся в асме?

DnsIs
Ну и что? Ни у меня, ни у Вас нет сноровки в ассемблировании.

( 2 * b ) || ! ( 2 * b )

10

Re: ASM: Есть люди разбирающиеся в асме?

Rumata Вы бы не могли обращаться ко мне на "ты"? А то я себя старым чувствую.

Нас невозможно сбить с пути, нам пофигу куда идти.

11

Re: ASM: Есть люди разбирающиеся в асме?

Аскет пишет:

Стоит наверно через ИДу пропустить, может чего и интересного покажет.

Аха, еще про Hex-Rays не забудьте Не знаю как по-вашему, но по-моему ИДА - артиллерия сисадмина\реверсера\аналитика\программиста, по крайней мере вменяемого аналога у нее нет.

DnsIs пишет:

2Rumata, greg zakharov пишет, что задача для студентов из учебников. 8)

А что в этом смешного или постыдного? Всегда есть чему учиться. Я ж не говорю, что я гуру ассемблера, программирую время от времени, изучаю - мне интересен этот язык. Что же касается "учебника для студентов", как Вы изволили выразиться, то там порой довольно много чего занимательного может найти даже матерый программист.

12

Re: ASM: Есть люди разбирающиеся в асме?

greg zakharov пишет:

А что в этом смешного или постыдного? Всегда есть чему учиться. Я ж не говорю, что я гуру ассемблера, программирую время от времени, изучаю - мне интересен этот язык. Что же касается "учебника для студентов", как Вы изволили выразиться, то там порой довольно много чего занимательного может найти даже матерый программист.

Да я совсем не смеюсь. Мне тоже ASM интересен, просто сейчас, как говорит многоуважаемый Евген: "Времени не хватает... :-("
Очень много компьютерных знаний было получено в школьные, студенческие, холочтые годы. Когда же появилась семья с ребятишкой, совсем вс поменялось. Старое стало забываться, новое стало изучаться медленней. Тогда хотелось все и сразу, Асм, бейсик, паскаль, перл, javascript, html... Сейчас как то все сформировалось, очень стали нравиться скриптовые языки, оастался javascript, wsh, autoit3. Так что асм ну очень тяжко вспоминать.

greg zakharov, может таки поможете, вкраце черканете выши выводы по коду?
Проставьте пожалуйста, если не сложно коменты в исходнике. Хотя бы основную структуру.

Мне не лень, нет. Я не успеваю просто.
Не знаю как тут большинство форумо-жителей, но мой род занятий никак не пересекается с кодингом. Поэтому лишь хобби.

Заранее благодарю.

Нас невозможно сбить с пути, нам пофигу куда идти.

13

Re: ASM: Есть люди разбирающиеся в асме?

DnsIs, не обещаю, но как выдастся свободное от работы время, гляну.

14 (изменено: iz56, 2012-08-19 00:42:16)

Re: ASM: Есть люди разбирающиеся в асме?

Отредактировал для фасм. Работает. Теперь ,если не лень можно разобрать логику.
компилировать fasm tasmed.asm tasmed.com

;tasmed.asm
       use16
       org      100h




       mov      sp,08FEh

;Возвращает значение вектора прерывания для INT (AL); то есть,
;загружает в BX 0000:[AL*4], а в ES - 0000:[(AL*4)+2].
;Эта функция изменяет сегментный регистр ES.
       mov      ax,3508h
       int      21h
       mov      word [old_int08h],bx
       mov      word [old_int08h+2],es


       mov      ax,7FFFh ;значение для инициализации счётчика таймера
       call     TimerIO

;Устанавливает значение элемента таблицы векторов прерываний для
;прерывания с номером AL равным DS:DX.
       mov      ax,2508h
       mov      dx,new_int08h
       int      021h


       mov      ax,cs
       mov      bx,090Dh ;скорее это адрес буфера для выводимых пикселей
       shr      bx,04h
       add      ax,bx ;преобразуем этот адрес в сегментный
       mov      word [programdata+778],ax
       
       
       mov      es,ax
       xor      di,di
       xor      eax,eax
       mov      cx,4000h
       rep      stosd
       
       
       push     cs
       pop      es
       mov      di,0468h
       mov      cx,00C0h
       rep      stosd
       
       
       
       
;           AL=30H: Get EGA information
;                   BH = table pointer request code
;                        0 = return ES:BP => current INT 1fH graphics font addr
;                        1 = return ES:BP => current INT 44H graphics font addr
;                        2 = return ES:BP => ROM 8x14 font table addr
;                        3 = return ES:BP => ROM 8x8 double dot font table addr
;                        4 = return ES:BP => ROM 8x8 double dot addr (top)
;                        5 = return ES:BP => ROM 9x14 alternate table addr
;           Выход:  CX = font points (font-definition bytes per character)
;                   DL = screen rows       
       mov      ax,1130h
       mov      bh,06h ;???
       int      10h
       
;       
       mov      word [programdata+778-4],bp
       mov      word [programdata+778-2],es
       
       
       push     00h
       pop      es
       
       
       push     dword [es:programdata+10]
       pop      dword [programdata+2]
       
       
       mov      ax,0013h
       int      10h

       mov      cx,0055h
       xor      bx,bx

___00000006A:
       mov      di,bx
       shl      di,1
       add      di,bx
       mov      ax,bx
       shl      ax,06h
       cwd
       div      cx
       mov      dl,al
       mov      dh,3Fh
       sub      dh,dl
       add      di,0468h
       mov      [di+0001h],dl
       mov      [di+00FFh],dl
       mov      [di+0100h],dh
       mov      [di+01FEh],dh
       mov      [di+0200h],dl
       inc      bx
       cmp      bx,0055h
       jb       ___00000006A

       xor      ax,ax
       mov      cx,0300h
       mov      si,0468h
       mov      dx,03C8h
       out      dx,al
       inc      dx
       rep      outsb
___0000000AA:
       cmp      byte [perem3],00h
       je       ___0000000AA ;пока perem3=0 ждём прерывание от таймера - иначе выход


       mov      byte [perem3],000h
       mov      es,word [programdata+778]
       inc      byte [perem2]
       cmp      byte [programdata],000h
       je       ___0000000E9
       dec      byte [programdata]
       jne      ___0000001EF
       
;завершение программы
       
       mov      ax,2508h
mov dx,word [cs:old_int08h]
mov ds,word [cs:old_int08h+2]
       int      21h
       
       mov      ax,0FFFFh
       call     TimerIO
       
       mov      ax,0003h ;установка видеорежима 3
       int      10h
       int      20h ;exit dos--------------------------------------



___0000000E9:
       mov      cl,byte [perem2]
       test     cl,3Fh
       jne      ___0000001AD
       mov      si,word [perem]
       push     si
       xor      cx,cx
       lodsb
___0000000FC:
       inc      cx
       lodsb
       cmp      al,20h
       jae      ___0000000FC
       mov      bx,045Dh
       cmp      si,bx
       jb       ___00000010C
       mov      si, message;
___00000010C:
       mov      word [perem],si
       dec      word [perem]
       pop      si
       dec      cx
       jcxz     ___00000011A
       jmp      ___00000011D
___00000011A:
       jmp      ___0000001AD
___00000011D:
       lodsb
       movzx    bp,al
       jcxz     ___000000125
       jmp      ___000000128
___000000125:
       jmp      ___0000001AD
___000000128:
       mov      ax,bp
       shl      ax,02h
       mul      cx
       mov      bx,00A0h
       sub      bx,ax
       add      bx,9600h
       push     cx
       mov      cx,bp
___00000013B:
       sub      bx,0A00h
       loop     ___00000013B
       pop      cx
___000000142:
       lodsb
       push     ds
       pusha
       xor      ah,ah
       shl      ax,04h

       lds      si,dword [programdata+778-4]

       add      si,ax
       xor      dx,dx
       push     dx
       mov      ah,07h
       lodsb
___000000156:
       push     bx
       mov      cx,0008h
___00000015A:
       mov      dx,0001h
       push     cx
       mov      cl,ah
       shl      dl,cl
       pop      cx
       test     al,dl
       je       ___00000017F
       push     ax
       push     cx
       mov      al,0FFh
       mov      di,bx
       mov      cx,bp
___00000016F:
       push     cx
       mov      cx,bp
       rep      stosb
       pop      cx
       add      di,0140h
       sub      di,bp
       loop     ___00000016F
       pop      cx
       pop      ax
___00000017F:
       dec      ah
       add      bx,bp
       or       ah,ah
       jns      ___00000018A
       lodsb
       mov      ah,07h
___00000018A:
       loop     ___00000015A
       pop      bx
       push     cx
       mov      cx,bp
___000000190:
       add      bx,0140h
       loop     ___000000190
       pop      cx
       pop      dx
       inc      dx
       push     dx
       cmp      dx,0010h
       jb       ___000000156
       pop      dx
       popa
       pop      ds
       push     cx
       mov      cx,bp
___0000001A5:
       add      bx,0008h
       loop     ___0000001A5
       pop      cx
       loop     ___000000142
___0000001AD:
       call     ___00000027F
       mov      cx,ax
       and      cx,01Fh
___0000001B5:
       push     cx
       call     ___00000027F
       and      ax,001Fh
       inc      ax
       shl      ax,1
       mov      si,ax
       call     ___00000027F
       xor      dx,dx
       mov      cx,12Ch
       div      cx
       mov      di,dx
       add      di,0FA00h
       call     ___00000027F
       or       al,080h
       dec      al
       mov      cx,si
___0000001DA:
       stosb
mov [es:di+0013Fh],al
mov [es:di+0027Fh],al
mov [es:di+003BFh],al
       loop     ___0000001DA
       pop      cx
       loop     ___0000001B5
___0000001EF:
       push     es
       pop      ds
       mov      di,00280h ;" Ђ"
___0000001F4:
       xor      ax,ax
mov cl,byte [cs:perem2]
       movzx    dx,byte [di-0001h]
       add      ax,dx
       mov      dl,[di+01h]
       add      ax,dx
       mov      dl,[di]
       add      ax,dx
       mov      dl,[di+0140h]
       add      ax,dx
       shr      ax,02h ;" "
       mov      dl,[di-0140h] ; [di][0FEC0h]
       add      ax,dx
       shr      ax,1
       cmp      al,80h
       jbe      ___000000223
       dec      al
       jmp      ___00000022D
___000000223:
       cmp      al,02h ;" "
       jbe      ___00000022B
       sub      al,03h ;" "
       jmp      ___00000022D
___00000022B:
       xor      al,al
___00000022D:
       mov      [di-0280h],al ; [di][0FD80h],al
       mov      [di-0140h],al ; [di][0FEC0h],al
       inc      di
       cmp      di,0FF00h
       jb       ___0000001F4
       push     cs
       push     0A000h ;"  "
       pop      es
mov ds,word [cs:programdata+778]
       mov      cx,4000h ;"@ "
       xor      si,si
       xor      di,di
       rep      movsd
       pop      ds
       cmp      byte [programdata],00
       jne      ___0000000AA
       mov      ah,01h ;" "
       int      16h
       je       ___0000000AA
       push     cs
mov es,word [cs:programdata+778]
       mov      di,0FA00h
       mov      cx,03C0h
       xor      ax,ax
       rep      stosw
       pop      ds
       xor      ah,ah
       int      16h
       mov      byte [programdata],050h
       jmp      ___0000000AA
       ___00000027F :

       mov      eax,dword [programdata+2]
       imul     eax,eax,04Dh
       inc      eax
       mov      dword [programdata+2],eax
       retn

new_int08h :
inc byte [ cs:perem3]
inc byte [cs:perem1]
cmp byte [cs:perem1],02h
       jne      ___0000002AB
mov byte [ cs:perem1],00h

db 0eah
old_int08h rw 2 ;переход на старый обработчик через 2 раза

___0000002AB:
       push     ax
       mov      al,020h
       out      020h,al
       pop      ax
       iret
;endp

TimerIO:
       cli
       push     ax
       mov      al,36h 
; 00110110b Channel 0 ,Access mode: lobyte/hibyte ,Mode 3 (square wave generator)
;Binary mode: 0 = 16-bit binary
       out      43h,al  ;Mode/Command register (write only, a read is ignored)
       pop      ax
       ;Установка начального значения счётчика from ax register
       out      40h,al ;Channel 0 data port (read/write)
       mov      al,ah
       out      40h,al
       ;счётчик непрерывно уменьшается на 2 каждый такт синхронизации, а при достижении 
       ;нулевого значения или при переполнении состояние выхода канала меняется на 
       ;противоположное, и счёт начинается с начала.
       sti
       retn

db 00h
message db 06h, 'Eugeny', 07h
db 'Nonko', 03h, 'also known as', 04h, 'CodeMaster', 03h
db 'presents', 06h, 'TASMED', 04h
db 'the', 04h, 'ultimate', 05h
db 'editor', 04h, 'for', 04h, 'assembly', 04h, 'language', 04h
db 'programs',00h, 06h, 'You', 06h, 'can', 05h, 'register', 04h
db 'it', 03h, 'absolutely', 07h, 'free',00h, 07h, 'LMD', 06h, '4ever!',  00h

perem dw 003c2h
perem1 db 0
perem2 db 0
perem3 db 0
programdata db 0

;EOF

Всё что я смог выяснить - что здесь очень серьёзно автор работает с видеоадатпером EGA. Смотрите подробнее http://ru.wikipedia.org/wiki/EGA.

15

Re: ASM: Есть люди разбирающиеся в асме?

Огромное спасибо, iz56. Наверное только меня впечатлила сия демка.

Нас невозможно сбить с пути, нам пофигу куда идти.

16

Re: ASM: Есть люди разбирающиеся в асме?

С удивлением обнаружил этот thread поискав в гугле свое имя. B-)

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

PS. С адаптером EGA там работы нет. Она для VGA написана.

17

Re: ASM: Есть люди разбирающиеся в асме?

vbrhjajcn пишет:

С удивлением обнаружил этот thread поискав в гугле свое имя. B-)
Я автор демки, если нужны исходники или пояснения -- обращайтесь.

Конечно же нам всем очень интересно посмотреть на исходники с комментариями.

Давным-давно, когда я еще начал ковырять asm, я увлекся просмотром всяческих демок. Меня поражало то, что в
считанные килобайты (а в данном случае байты) люди умещали фантастически вещи.
Ваша демка очень понравилась, я был поражен. Но повторить не смог.
Сейчас конечно же работа с VGA неактуальна. Но алгоритм формирования эффектов посмотреть очень интересно.

Вспомнилась игра .kkrieger - шутер на  97 280 байт.

Нас невозможно сбить с пути, нам пофигу куда идти.

18

Re: ASM: Есть люди разбирающиеся в асме?

На самом деле эта демка входила в примеры для моего редактора TASMED.

Вот линк: http://nonko.com/files/te198c.zip. Вот DPMI хост, на случай если нету: http://nonko.com/files/dpmi16.zip.

Огненная демка находится в EXAMPLES/INTRO.ASM. Ассемблируется TASM-ом. Комментариев там, правда, маловато. Мне в те времена казалось что код я пишу настолько очевидный, что незачем его комментариями портить.

Там есть пара других любопытных вещей, например ANSIVIEW. Все доки которые находятся в каталоге DOCS скомпилированы как раз ANSIVIEW. Я сейчас запустил под DOSBOX-ом на своем Маке и все прекрасно работает, только радуги нет на выползающем тулбаре.

Если есть какие-то вопросы -- пишите.