Всем привет! Не так давно начал изучать взрывной для меня и для моего моСка курс «PROGRAMMING ASSEMBLER» Код пишу в NotePad++ с подсветкой синтаксиса Assebly, а компилирую и дебажу в Microsoft Visual Studio 15 . Выкладываю пример решения простенькой задачи (для меня, как начинающего это было совсем не просто). ЗАДАЧА: Создайте программу, выводящую на экран все четырёхзначные числа последовательности 1000 1003 1006 1009 1012 1015 …. Решение: Создайте программу, выводящую на экран все четырёхзначные числа последовательности 1000 1003 1006 1009 1012 1015 …. .MODEL FLAT, STDCALL SetConsoleTitleA PROTO: DWORD; функция установки заголовка консоли GetStdHandle PROTO: DWORD WriteConsoleA PROTO: DWORD, DWORD, DWORD, DWORD, DWORD ReadConsoleA PROTO: DWORD, DWORD, DWORD, DWORD, DWORD ExitProcess PROTO: DWORD Sleep PROTO: DWORD Spoiler: code here .const sConsoleTitle BYTE «1000 to 9999»,0 numC WORD 1000d numB WORD 9999d sleepTime WORD 5000d increment WORD 3d stringLenght BYTE 6d .data number BYTE 4 DUP(0),10,13;Массив для хранения разрядов числа (10,13 — символы перевода каретки) .code main PROC ;push OFFSET sConsoleTitle ;call SetConsoleTitleA INVOKE SetConsoleTitleA, OFFSET sConsoleTitle xor ECX,ECX mov CX,numC ;цикл wh1: cmp CX,numB jnl endwh1 call show add CX, increment jmp wh1 endwh1: ;push sleepTime ;call Sleep INVOKE Sleep, sleepTime ;push 0 ;call ExitProcess INVOKE ExitProcess, 0 ret Main ENDP ; процедура разбития на разряды show PROC LOCAL hStdout WORD push EAX INVOKE GetStdHandle, -11 mov hStdout, EAX pop EAX ;push EAX ;выделение 1000 mov AX,CX xor DX,DX mov BX,1000d div BX or AL,30h mov number[0],AL ;выделение 100 mov AX,DX xor DX,DX mov BX,100d div BX or AL,30h mov number[1],AL ;выделение 10 mov AX,DX xor DX,DX mov BX,10d div BX or AL,30h mov number[2],AL ;выделение единиц or DL,30h mov number[3],DL ;Выводим число push ECX ;push 0 ;push 0 ;push 6d ;push OFFSET number ;push hStdout ;call WriteConsoleA INVOKE WriteConsoleA, hStdout, OFFSET number, stringLenght, 0, 0 pop ECX ret show ENDP END main Результат работы: Поддерживаю критику в комментариях. Спасибо С Уважением, C0mstr3am
Для "совсем начала" я бы советовал >>ЭТОТ<< курс.Конечно,не без погрехов,но один из простейших и толковых курсов.
Этот MS синтаксис - путь в тупик. Правильный ассемблер - на синтаксисе Intel и с ассемблером GAS - GNU Assembler. Желаешь научится в asm coding? Скачай Turbo Debugger Borland и пару простейших cracks для изучения. Там - всё что нужно на практике. Кстати. GAS умеет вызывать и обращаться к функциям и процедурам .dll libraries MS. GAS умеет выравнивать массивы .data и .code, по 32-битной адресации в памяти, для самого быстрого доступа к данным и ввода инструкций в конвейер процессора для обработки. MS - такого не умеет.
какие то абстракции в коде видно, это уже не асм) когда то очень давно был хороший курс от калашникова, хм даже что то гуглится http://publ.lib.ru/ARCHIVES/K/KALASHNIKOV_Oleg_Aleksandrovich/_Kalashnikov_O.A..html я по этому курсу смог разобраться в основах
Каким редактором текста пользуется некто comstream? Всё кал. Даже mcedit и micro. Годно - sublime text. С лицензией от Сноудена.
Так или иначе, любой проект начинается с систематизации файлов. Кто станет запускать GAS ради одного файла? Нужно будет подключить - файлы .desktop и ресурсы с иконками. sublime text, обучен в цветовой синтакс и asm. Это хотел сказать ))
извини блиц, но любое телодвижение начинается с "оо прикольная тема, попробую сделать". остальное вторично. если речь идёт о рил разработке, то спорить не буду, там без грамотного редактора нечего делать
И о чём Блиц говорит? Разобрать досконально keygen с само-упаковщиком - и если не хватит терпения, забыть asm. 5% - творчества, 95% - blood, sweat and tears.
Скушно тут в разделе реверс. Заметил это ассемблероначало и решил некропостнуть: так ассемблер начинать не надо. 1. В задаче ни слова о том, что нужно вставлять паузу - это художник ее там так видит? 2. Везде, где можно и нельзя, используются 16бит регистры (как в книжках про ассемблер на досе) в 32бит режиме - зачем? Это удлинняет каждую инструкцию на 1 байт префикса. Это к вопросу о том, почему не надо дебажить студией. 3. Ни малейшего намека на оптимизацию - делить одно и то же число на 1000, 100 и 10 безусловно очень хрестоматийно, но ужасно убого смотрится. 4. То, что планируешь использовать в программе более 1 раза, оформляй как процедуру/функцию, не планируешь - не оформляй. Сишные привычки начиная ассемблер лучше забыть. ecx в качестве счетчика в цикле, где есть вызовы апи - так себе решение. Взял бы ebx/esi/edi - и пушить-попить ничего не понадобилось бы. 5. Консольные утилиты сейчас могут быть полезны только своим свойством вываливать их вывод в файл для дальнейшей обработки. Чтоб это работало WriteConsoleA надо махнуть на WriteFile. Тогда утилита и в консоль строчки выгрузит и с 'test.exe>test.txt' как надо отработает. Spoiler: fasm Code: format pe console 4.0 include 'win32ax.inc' entry main section '.code' code data readable executable proc main locals hStdOut dd ? nIoBytesCount dd ? szBuffer rb 8 endl invoke GetStdHandle,STD_OUTPUT_HANDLE mov [hStdOut],eax mov DWORD[szBuffer + 04],0x0A0D mov esi,1000 .next: .if esi < 10000 mov eax,esi mov edi,4 mov ecx,10 @@: xor edx,edx div ecx add dl,'0' mov [szBuffer + edi - 1],dl dec edi jne @B invoke WriteFile,[hStdOut],addr szBuffer,6,addr nIoBytesCount,0 add esi,3 jmp .next .endif ret endp section '.data' data readable writable data import library kernel32,'kernel32.dll' include 'api\kernel32.inc' end data
Ну так то наконец то в ветку заглянул ОТЕЦ. -------------------------------------------- Для ТС, курсы нахер, они нужны разве только, что бы наглядно разок посмотреть намагию, ну и для быстрого понимания дебага. Лучше это словарь в руке и соответствующие борды. Коих не мало, но народ там бывает поехавшим наглухо. Это нужно учитывать эсли нахер сразу же начнуть посылать. Зы. На кодебай есть такой Мерлин, он там норм вводные статы написал, вплодь до :потрогать ядро.
И что так сразу - тронувшиеся умом на компиляции кернела? Вот человек, врач и анестезиолог Con Kolivas - пишет патчи кернел, интерактивно скоростные. MuQSS. И спасает людей от недугов CoronaV - https://www.abc.net.au/news/2020-04...uipment-to-face-coronavirus-covid-19/12120588
А в свободное от спасения мира дел.. наверное обсуждает на бордах квантовую физику и шлет нахер нубов, которые не к месту и не к стати, лезут со своими жалкими MOVами ( Да ADDшками
Есть форум-блог, обсуждения и развития - http://ck-hack.blogspot.com/ http://ck.kolivas.org/patches/5.0/5.6/5.6-ck${_ckpatchversion}/$_ckpatch.xz
Сегодня, и NOP не в моде. Девелоперы Clear Linux Intel, меняют на zero - обнуление регистров процессора, сексуально-васисуального ))
Збсь.. я пока подтягиваю Инглишь Лэнг.. С линупсами тоже такое. Мож я есче что не докурил. Но вот ставил затестить лубунту на 1но ядро, 2 рам.. боль и бубен.. работала конечно, но не шустро по сравнению с той же семкой небо и земля. Семка просто божила. Винт конечно оставил, будет скучно попробую оптимизировать. Данка шён вообщем.