Этого треда уже нет.
Это копия, сохраненная 5 февраля 2016 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
39 Кб, 360x299
Assembler тредд #600262 В конец треда | Веб
Тред самого трушного языка небыдлокодинга объявляется открытым. И сразу вопрос если тут есть ассемблерщики, почему этот код http://pastebin.com/1n1vnhPt запускается, а этот http://pastebin.com/iTbND3mz нет?

Разница в том что в первом случае вызов главной процедуры идёт до её определения, а во втором случае после. Компилятор masm32.
105 Кб, 450x540
#2 #600306
Тащемта, ассемблер говно и нинужен.
#3 #600316
>>600262 (OP)
Потому что это тебе не JavaScript. Выпоолнение начинается по start, вызываются GetModuleHandle и GetCommandLine и продолжается дальше. А дальше там тело WinMain, и оно начинает выполняться (а чего ты хотел? чтобы оно магически пропускалось? тогда втыкай jmp). В числе прочего там используется параметр hInst, которого в стеке нихуя нет, потому что в функцию мы вошли, а не вызвали ее, и CreateWindowEx фейлится из-за мусора вместо hInst, и все виснет на цикле обработки сообщений. До вызова WinMain выполнение не доходит.
#4 #600383
Но ведь есть разные ассемблеры и часто они вообще не похожи.
#5 #600397
>>600383
Все ассемблеры похожи (ну, пока это не какой-нибудь Itanium), отличия в синтаксисе незначительные.
44 Кб, 328x420
1928 Кб, 2272x2362
#6 #602063
>>600383
Ассемблер соответствует архетиктуре своего чипа, разные разрядности, разные регистры, разная реализация тех или иных вещей, но по своей сущности и логике какойнибудь z80 asm и masm - это родные братишки. Ассемблер это как набор инструментов, один побогаче другой по проще, но ключи с отвёртками везде одинаковые, и служат для одних и тех-же целей.
#7 #603215
>>600262 (OP)

>masm32


eternal zashquar
#8 #603276
>>603215
Что плохого в масм? Каими одобряет.
#9 #603304
Когда я хочу узнать объективное мнение людей о чем-либо, я гуглю "Что-то там говно". Так вот, по запросу "masm говно" гугл не выдал ничего плохого.
#10 #603450
>>603304

>не выдал ничего плохого


Как будто что-то хорошее.
#11 #603505
Насколько трудно написать на ассемблере бутлоадер, который при включении компьютера будет писать "Hello world!"?
#12 #603561
>>603505
Около десяти инструкций, пять минут (для новичка час).
#13 #603565
>>603276

> Что плохого в масм


Windows-only, assume, addr, ptr, offset, proto, директивы с точечкой, невнятные сообщения об ошибках.
#14 #603594
>>603565

>assume, addr, ptr, offset, proto


А в этом что плохого? Мне сравнить не с чем.

>директивы с точечкой


Да, некрасиво.
#15 #603616
>>603594
Это вкусовщина на самом деле. Например, у fasm гораздо более логичный синтаксис, когда дело касается чтения памяти (он больше похож на синтаксис, используемый в мануалах Intel, и тебе не надо думать, где воткнуть offset, а где addr), но зато у него на всю голову ебнутый макроязык.
assume - это способ скрывать от программиста кодогенерацию, не слишком правильный подход для ассемблера.
#16 #603667
Подпiсался.
#17 #604115
>>603616
Самая большая проблема масма - PROTO DWORD DWORD DWORD. Именно из-за этого я с него и съебал.
Единственная проблема макросов в фасме - невозможность написать инлайн макрос. Из-за этого, если ты хочешь сделать что-то вроде mov eax, RGB(255,15,128), то придётся перегружать mov (а так же push и, возможно, что-нибудь ещё).
#18 #604656
>>604115
То есть, в fasm тебя не смущает синтаксис match, необходимость экранировать {}, помнить отличия = от fix, equ и define? Про фундаментальные проблемы я вообще молчу. И про fasmg вместо fasm 2.
#19 #604746
>>604656

>синтаксис match


Обычный препроцессор на стероидах. Чему там смущать-то?

>необходимость экранировать {}


Неприятно, конечно, но пофиг, ибо ты не каждый день пишешь макросы.

>помнить отличия = от fix, equ и define


А что там помнить? equ - препроцессор, = - ассемблер, fix - почти как equ, только приоритет выше и можно всякие штуки переопределять, а дефайном я пользовался один раз, когда переводил сишный хэдер - альт+шифт сэкономили кучу времени.
И это всё всё равно лучше масма.
#20 #606019
бамп
0 Кб, 32x32
#21 #606082
Сап, /pr/.
Собственно, я начал юзать hiew для того, чтобы что-то попробовать писать на ассемблере, сам комп я трогать не могу, но есть другой, ОЗУ 64мб, процессор 500Мгц с разгоном вышел, вот я его себе в итоге присвоил %делай, шо хош%, сейчас на нём стоит DOS 7 %винда кашляет и умирает%, сейчас думаю что-нибудь пописать, но не знаю, какой лучше ассемблер взять, сразу скажу, что на этом батином компе я могу только браузер юзать для скачивания и прочих простых махинаций, ничего устанавливать и прочее я не могу см. Параграф №5 Получение пизды от бати. Есть Far для текста, CodeView по-моему от паскаля или тубро си остался, хотелось бы попробовать в какие-нибудь простые игры.
#22 #606090
>>606082
Линупс ставь лучше, возможностей больше будет.
#23 #606092
>>606090
Ставил минт, бубунту и паппи, все они дёргались и тыркались, вплоть до всяких разноцветных аналогов БСОДа, изначально на компе стоял 6-й дос, с ним и собирался, Си я пока что тыркать не буду принципиально
#24 #606286
Друзья, поясните нуфагу. Вот код:
CSEG segment
org 100h
Begin:
mov ax,0B800h
mov es,ax
mov di,0
mov al,1
mov ah,31
mov cx,2000

Next_face:
mov es:[di],ax
add di,2
inc cx
jnz Next_face

mov ah,10h
int 16h
int 20h
CSEG ends
end Begin

После выполнения строчки "mov es:[di],ax" в память по соответствующему адресу помещается 01 1F. Это так и должно быть (я так думаю), НО блядь после выполнения следующей строчки (add di,2) память принимает прежнее значение. Что может быть за хуйня? (МАСМ 6.11 Отладчик - АФДПРО)
#25 #606292
>>606286

>2016


>16 бит


>сегментация


ну ты лол.

>НО блядь после выполнения следующей строчки (add di,2) память принимает прежнее значение


потому что к di прибавляется 2 и теперь твой отладчик показывает значение по другому адресу, очевидно же.
#26 #606300
>>606286
Ну так кто-то видеопамять обновляет. Попробуй запретить прерывания, записать в видеопамять, а потом считать. А вобще отлаживать графические приложения жопа.
#28 #606315
>>606286
Без отладчика запускать пробовал? На другой странице запускать пробовал? В AFDPro куча багов была, наверняка это один из них - читает память после того, как сам туда насрал.
#29 #606335
То чувство, когда по вопросам понимаешь, какую книжку по асму сейчас наяривает анон.
#30 #606511
>>606092
Очевидный Knoppix попробуй.
#31 #606568
>>600262 (OP)
Поясните за ассемблер?
Для чего его юзают какие-то крупные предприятия и корпорации?
Т.е., если я его выучу и пойду на работу, что я на нём буду писать? И насколько он сложный в освоении?
181 Кб, 1914x1020
#32 #606624
Ассемблера я не знаю. но хочу научится выполнять простейшие правки в чужих программах в связке ollydbg + idapro + hex-rays
Например там нашел в псевдокоде функцию и мне надо чтобы она всегда выводила положительный результат, как это все осуществлятся, везде гайды 2005-2008 года, а есть что-то поновее?
#33 #606634
>>606624
1) Выделяешь в псевдокоде нужную строчку, нажимаешь Tab.
2) Смотришь на ассемблерный код и думаешь, что конкретно нужно поменять.
3) Смотришь в левом нижнем углу окошка с кодом файловый оффсет.
4) Любым ассемблером генерируешь код (можно встроенным в OllyDBG, можно масм, можно осилить format binary и virtual at в fasm).
5) ...
6) Патчишь.
129 Кб, 1920x1023
#34 #606639
>>606634
Если начать с менее сложного, правильно ли будет написать простенькую программу для проверки пароля и вывода фразы и на ней для начала потренироваться. Дабы попробовать сделать чтобы пароль не проверялся. Или надо с еще проще примера начать?
#35 #606642
>>606639
Норм. Алсо, для мелочи можно править прямо в ольке (по пробелу вроде ассемблер), потом правой кнопкой, Copy to executable -> All modifications, потом правой кнопкой по открывшемуся окну, Save file.
11 Кб, 377x295
#36 #606646
>>606642
Вот всех этих мелочей как раз не хватало, куда и что нажимать, в гайдах все пишут так, как будто пишут для уже все знающих. Спасибо тебе анон. Поставил для себя первую задачу, приравнять две переменные
#37 #606754
>>606511
Вау, спасибо)
#38 #606758
>>606646
Лучше возьми какой-то компилятор вроде TCC, чтобы куча мусора и ненужные отпимизации не мешали анализировать дизасм-дрисню.
#39 #606948
Ял считаюл, чтол самыйл отсосныйл ассемблерл это %GNU %asm. Дискасс.
#40 #607043
>>606948
Ноу дискас.
#41 #607045
>>606948
mov qword ptr [tvoi_roteshnik], hui
#42 #607092
>>607045

>qword


Ммм, какой большой.
#43 #607745
Перед выполнением LEAVE у меня было такое состояние регистров и стека:
ESP = 0012FFAC
EBP = 0012FFB4

Стек:
0012FFAC 0000000F
0012FFB0 00000007
0012FFB4 0012FFF0
0012FFB8 0040100C

После выполнения регистры стали равны:
ESP = 0012FFB8
EBP = 0012FFF0

Почему ESP стал именно таким, если leave аналогична инструкциям mov esp, ebp и pop ebp?
#44 #607768
mov esp, ebp:
-> ESP = EBP = 0012FFB4
pop ebp:
-> EBP = [0012FFB4] = 0012FFF0
-> ESP = ESP + 4 = 0012FFB4 + 4 = 0012FFB8
Что не так-то?
#45 #607769
>>607768
Понял.
#46 #607773
>>607769
Разобрался в том, что загружается из стека, но почему после mov esp, ebp в esp не то, что я ожидал увидеть, я не понял.

Если регистры
ESP = 0012FFAC
EBP = 0012FFB4

То после mov esp, ebp они должны быть равны. Почему это не так?
#47 #607822
>>607773
Так потом POP модифицирует и EBP, и ESP. Напиши вместо leave инструкции mov и pop и посмотри сам.
#48 #607833
>>607822
Каким образом pop модифицирует оба регистра? Они разве связаны? Регистр ebp ведь не должен влиять на esp, если я явно не прописал копирование значений. Мы его используем, когда надо скакать по стеку, не влияя на esp.

Что-то я туго соображаю, не выспался и часто ловлю себя на мысли, что долго неподвижно смотрю в одну точку.
#49 #607851
>>607833
pop reg - это:
reg = [esp]
esp += 4.
#50 #607857
>>607851

>esp += 4


Блять, действительно, упустил это из виду.
102 Кб, 1477x641
#51 #618141
\t

Блядь, я просто не понимаю, что происходит.

Что это за вычисления? Нахуй они нужны?
Может мне кто-нибудь объяснить?

Мы ранее посчитали урон, который должен нанести персонаж.
В v0 мы считываем какое-то значение, в данном случае нулевое. В v1 кладётся наш посчитанный урон.
К нулю, находящемуся в v0, мы прибавляем сотню и перемножаем результат с v1.
0x64 * 0x3 = 0x12C или 300.
Эти три сотни мы умножем на волшебное число 0x51EB851F, получая в данном случае 0x6000000054. Нижние 32 бита результата игнорируем, а верхние (то есть, в данном случае, 0x60) шифтим вправо на 5, получая обратно наше число 3, которое и сохраняем как посчитанный нанесённый урон.
Помимо этого мы ещё делаем шифт числа 0x12C на 0x1F, то есть 31. Что это? Проверка знака?
Я не знаю, тут отрицательных чисел не встречал, в итоге результат всегда нулевой. Мы потом вычитаем этот результат из трех, но 3 минус 0 = 3.

В итоге тут куча операций над числом 3, после которых она остаётся числом три. Нахуя? ЧТо это за проверка, что она значит? Схема работает при любых числах, 5 даст нам в итоге 5 после шифтов и умножений, а десять даст десять. Что-то пойдет по-другому, если вдруг какое-то из чисел будет отрицательным?

Ассемблер-кун, выручай.
#52 #618143
>>618141
В общем, я погуглил.
Оказывается, это что-то связанное с оптимизацией, а вычисления связанные с 0x51EB851F сюда добавлены компилятором.
Но толком не понял.
#53 #618180
>>618141

> 0x51EB851F


Деление дорогое, заменяется умножением. Гугли multiplicative inverse или вот это посмотри: http://web.archive.org/web/20050220011705/http://wasm.ru/baixado.php?mode=tool&id=203
0 Кб, 244x19
#54 #618259
Почему mult FFFFFFA0, 51EB851F дало пикрелейтед?

Windows калькулятор не согласен.
#55 #618263
>>618259
Вопрос снят, я мудак, FFFFFFA0 же знаковое.
#56 #618807
Как данные попадают с диска в оперативную память?

Разобрал нужную мне функцию в экзешнике игры для PS1. Задумал переписать её. Понял, что она слишком велика и сложна, так что проще подменить результат вычислений. Места мало, так что без серьезных изменений оригинального кода ничего не сделаешь. Решил просто воткнуть jal, который уведет к выполнению моего кода.

Но тут проблема. Я не знаю, где разместить свои инструкции. Да, в дебагере можно положить их куда угодно, а потом прыгнуть на адрес и всё будет ок. Но мне нужно добавить инструкции так, что я просто запускал образ в эмуляторе или диск на консоли и всё работало.

Потом я внезапно понял, что мипсовый ассемблер не имеет инструкций для работы с данными на диске, он может только перемещать данные между регистрами и ram. Как тогда данные попадают в ram?

Я внезапно понял, насколько я мало знаю об архитектуре. В той же сишечке, на которой писалась игра, есть возможности работы с файлами, но какие ассемблерные инструкции получатся при компиляции, если инструкций для работы с rom не существует?
#57 #618834
>>618807

> ассемблер не имеет инструкций для работы с данными на диске


Зато есть контроллер, который можно выебать в порты, чтобы он прочитал данные с диска. Но как и везде, есть стандартная библиотека, которая просит ОС, которая просит драйвера прочитать данные. Тут цепочка немного короче, но, в общем, то же самое.

1) Берешь PSYQ, читаешь в psyq/docs/libovrXX.pdf (CD/Streaming library), потом librefXX.pdf там же.
2) Во встроенной документации no$psx есть описание железа, его можно проглядеть для ознакомления.
#58 #618841
>>618807

>но какие ассемблерные инструкции получатся при компиляции, если инструкций для работы с rom не существует?


Там наверно вызовы ОСа(или ее огрызга, хз что там у мыловарни), с возвратом дескриптора открытого файла и оперативкой уже заполненой им.
#59 #618850
>>618841
Школьник, мыловарня - это не про обсуждаемую консоль.
#60 #618908
>>618834

>1) Берешь PSYQ, читаешь в psyq/docs/libovrXX.pdf (CD/Streaming library), потом librefXX.pdf там же.


А что делать потом?

Мне хуёво, мне нужен напарник.
#61 #620453
lhu $v0, 0xB8($s0)
nop
subu $v0, $s5
sh $v0, 0xB8($s0)
sll $v0, 16
bgtz $v0, Post_HP_Calc

Объясните мне тайный смысл.
Мы загрузили значение в регистр v0, вычли из него значение регистра s5, положила результат туда, откуда взяли.
Затем сделали шифт влево на 16 бит. Насколько я понял, таким образом мы патемся симулировать 16-битную переменную. Если шестнадцатый бит (знак) равен 1, то после шифта мы получим отрицательное значение, так что условие сработает.
Всё верно?
#62 #620455
>>620453

>так что условие не сработает


Фикс. Бранч же >0.
3 Кб, 534x74
#63 #621830
Это такое "оптмизированное умножение на 100"?
#64 #622453
У меня лаба по ассемблеру.
Что это за пиздец? Как понять это говно?
Почему так всё непонятно? Какие байты, блять. Регистры нахуй.

Как сделать цикл while?
#65 #622455
>>622453
Помню, в начале нулевых даже некоторые херки угорали по асму и успешно прогали на нем графоний, а сейчас погромистам асм уже не под силу лол.
#66 #622459
>>622455
Серьезно, я не понимаю как эти байты могут содержать какую-то логику. Как понять это?
#67 #622465
>>622459
Ты как цикл while сделать с помощью goto и if понимаешь?

yoba_begin:
if (yoba) goto yoba_end;
//do something
goto yoba_begin
yoba_end:

Далее, вместо goto у тебя jmp, вместо if у тебя пара команд cmp что-нибудь, jz/je/jne метка.
#68 #622475
>>622465

> вместо if у тебя пара команд cmp что-нибудь, jz/je/jne метка


Почему это будет работать?
Я примерно представляю, что есть адреса, можно по ним прыгать и что-то писать. Но как тут логика реализуется? Какая-то магия
Лаба на масме, если что
#69 #622477
>>622475
Команда cmp (compare) установит флаг в результате своей работы. Далее команда je (jump-if-equal) сделает goto в зависимости от установленного флага. Вот и все. Ты знаешь как сделать if, как сделать goto, вперед. точнее, нужно еще понять, как делать рекурсию с помощью call/ret и push ebp/mov ebp, esp, но для начала пойми это.
#70 #622478
И да, ассемблер заменит имена этих меток на реальные адреса памяти. Так что язык ассемблера - это еще не совсем машинные коды, но близко.
#71 #622479
>>622477
Как же сложно всё тут, пиздец
Спасибо за консультацию, сейчас попробую что-то сделать
#72 #622667
>>622479
Ты просто аутист.
#73 #622668
>>622667

>Ты просто аутист


Что ты понимаешь под словом "аутист"? Дай определение этого термина.
#74 #622710
>>622479
Если понять на самом деле сложно, поиграть в Human Resource Inc.
#75 #622744
Зачем оптимизируюая компиляция в mips превращает умножение на 0.75 в умножение на 300 с последующим делением на 400 (через умножение на магическое число и битовый сдвиг)?

Это занимает кучу операций. 5 на само умножение на 300d, затем умножение на магическое число, затем вытягивание результата умножение из регистра hi, затем битовый сдвиг вправо на 7.
Это 8 операций.
Вместо этого можно было умножить число на 3 через (( x << 1 ) + x), а затем разделить на четыре через (x >> 2). Вышло бы три операции против 8, да ещё и без mult.
#76 #622755
>>622744
Потому что такой частный случай не завезли, очевидно же.
#77 #622769
>>622755
Операция деления, представляемая как деление на 2^n - частный случай?
#78 #622926
>>606286
Такс-такс-такс, кто-то узнал про Калашникова!
#79 #622930
>>622744
Там могли быть две операции. Целочисленное умножение и деление. Оптимизатор соптимизировал как мог, объединить не осилил.
#80 #623042
>>622930
Ну, целочисленное умножение само по себе заняло бы две операции (умножить и вытащить результат из hi/lo в нормальный регистр), с делением то же самое. Итого уже 4 операции, не учитывая медлительность самих mult и div.
#81 #623169
>>623042
Даже на x86 компиляторы часто стараются избавиться от div (и иногда от mul). Мне кажется, там в исходнике так и было n × 300 ÷ 400.
#82 #623848
Какой сишный код может сгенерировать подобную мипсовую инструкцию?
andi $v0, FFFF

В некоторых случаях and используется естесственным образом, например, когда нужно проверить принадлежность конкретного бита заданному числу. Но иногда эта инструкция просто завершает функцию или следует сразу после неё. При этом область возможных результатов функции не превышает 16 бит, так что инструкция не меняет значение регистра никогда вообще.

Может, это что-то вроде этого?

int32 function(arguments)
{
int32 a;
a = 0;
return a;
}

main()
{
int16 b;
b = (int16)(function(arguments));
}
#83 #623950
>>623848

>При этом область возможных результатов функции не превышает 16 бит, так что инструкция не меняет значение регистра никогда вообще.


Если $v0 это 32-битное, а функция возвращает short - плевать компилятор хотел на твои допущения
#84 #623978
репост
Парни, выручайте, срочно.
Написать программу на языке Ассемблера, которая позволяет ввести с клавиатуры строку символов на русском языке, подсчитать количество гласных букв во введенной строке и вывести соответствующую информацию на экран.
Может у кого-то похожая уже есть.
Заранее спасибо.
#85 #624003
>>623978
Не благодари. http://pastebin.com/VDskkSHm
#86 #624171
>>623848
Да, это именно каст к short. Во-первых компилятор тупой, а во-вторых, даже если он не тупой и мог бы понять, что function всегда возвращает <= 0xffff, на момент генерации кода main у него могло не быть никакой информации о function, кроме прототипа.
Тред утонул или удален.
Это копия, сохраненная 5 февраля 2016 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски