Этого треда уже нет.
Это копия, сохраненная 5 февраля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это копия, сохраненная 5 февраля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
39 Кб, 360x299
Тред самого трушного языка небыдлокодинга объявляется открытым. И сразу вопрос если тут есть ассемблерщики, почему этот код http://pastebin.com/1n1vnhPt запускается, а этот http://pastebin.com/iTbND3mz нет?
Разница в том что в первом случае вызов главной процедуры идёт до её определения, а во втором случае после. Компилятор masm32.
Разница в том что в первом случае вызов главной процедуры идёт до её определения, а во втором случае после. Компилятор masm32.
105 Кб, 450x540
Тащемта, ассемблер говно и нинужен.
>>600262 (OP)
Потому что это тебе не JavaScript. Выпоолнение начинается по start, вызываются GetModuleHandle и GetCommandLine и продолжается дальше. А дальше там тело WinMain, и оно начинает выполняться (а чего ты хотел? чтобы оно магически пропускалось? тогда втыкай jmp). В числе прочего там используется параметр hInst, которого в стеке нихуя нет, потому что в функцию мы вошли, а не вызвали ее, и CreateWindowEx фейлится из-за мусора вместо hInst, и все виснет на цикле обработки сообщений. До вызова WinMain выполнение не доходит.
Потому что это тебе не JavaScript. Выпоолнение начинается по start, вызываются GetModuleHandle и GetCommandLine и продолжается дальше. А дальше там тело WinMain, и оно начинает выполняться (а чего ты хотел? чтобы оно магически пропускалось? тогда втыкай jmp). В числе прочего там используется параметр hInst, которого в стеке нихуя нет, потому что в функцию мы вошли, а не вызвали ее, и CreateWindowEx фейлится из-за мусора вместо hInst, и все виснет на цикле обработки сообщений. До вызова WinMain выполнение не доходит.
>>600383
Все ассемблеры похожи (ну, пока это не какой-нибудь Itanium), отличия в синтаксисе незначительные.
Все ассемблеры похожи (ну, пока это не какой-нибудь Itanium), отличия в синтаксисе незначительные.
44 Кб, 328x420
1928 Кб, 2272x2362
>>600383
Ассемблер соответствует архетиктуре своего чипа, разные разрядности, разные регистры, разная реализация тех или иных вещей, но по своей сущности и логике какойнибудь z80 asm и masm - это родные братишки. Ассемблер это как набор инструментов, один побогаче другой по проще, но ключи с отвёртками везде одинаковые, и служат для одних и тех-же целей.
Ассемблер соответствует архетиктуре своего чипа, разные разрядности, разные регистры, разная реализация тех или иных вещей, но по своей сущности и логике какойнибудь z80 asm и masm - это родные братишки. Ассемблер это как набор инструментов, один побогаче другой по проще, но ключи с отвёртками везде одинаковые, и служат для одних и тех-же целей.
Когда я хочу узнать объективное мнение людей о чем-либо, я гуглю "Что-то там говно". Так вот, по запросу "masm говно" гугл не выдал ничего плохого.
Насколько трудно написать на ассемблере бутлоадер, который при включении компьютера будет писать "Hello world!"?
>>603505
Около десяти инструкций, пять минут (для новичка час).
Около десяти инструкций, пять минут (для новичка час).
>>603276
Windows-only, assume, addr, ptr, offset, proto, директивы с точечкой, невнятные сообщения об ошибках.
> Что плохого в масм
Windows-only, assume, addr, ptr, offset, proto, директивы с точечкой, невнятные сообщения об ошибках.
>>603565
А в этом что плохого? Мне сравнить не с чем.
Да, некрасиво.
>assume, addr, ptr, offset, proto
А в этом что плохого? Мне сравнить не с чем.
>директивы с точечкой
Да, некрасиво.
>>603594
Это вкусовщина на самом деле. Например, у fasm гораздо более логичный синтаксис, когда дело касается чтения памяти (он больше похож на синтаксис, используемый в мануалах Intel, и тебе не надо думать, где воткнуть offset, а где addr), но зато у него на всю голову ебнутый макроязык.
assume - это способ скрывать от программиста кодогенерацию, не слишком правильный подход для ассемблера.
Это вкусовщина на самом деле. Например, у fasm гораздо более логичный синтаксис, когда дело касается чтения памяти (он больше похож на синтаксис, используемый в мануалах Intel, и тебе не надо думать, где воткнуть offset, а где addr), но зато у него на всю голову ебнутый макроязык.
assume - это способ скрывать от программиста кодогенерацию, не слишком правильный подход для ассемблера.
Подпiсался.
>>603616
Самая большая проблема масма - PROTO DWORD DWORD DWORD. Именно из-за этого я с него и съебал.
Единственная проблема макросов в фасме - невозможность написать инлайн макрос. Из-за этого, если ты хочешь сделать что-то вроде mov eax, RGB(255,15,128), то придётся перегружать mov (а так же push и, возможно, что-нибудь ещё).
Самая большая проблема масма - PROTO DWORD DWORD DWORD. Именно из-за этого я с него и съебал.
Единственная проблема макросов в фасме - невозможность написать инлайн макрос. Из-за этого, если ты хочешь сделать что-то вроде mov eax, RGB(255,15,128), то придётся перегружать mov (а так же push и, возможно, что-нибудь ещё).
>>604115
То есть, в fasm тебя не смущает синтаксис match, необходимость экранировать {}, помнить отличия = от fix, equ и define? Про фундаментальные проблемы я вообще молчу. И про fasmg вместо fasm 2.
То есть, в fasm тебя не смущает синтаксис match, необходимость экранировать {}, помнить отличия = от fix, equ и define? Про фундаментальные проблемы я вообще молчу. И про fasmg вместо fasm 2.
>>604656
Обычный препроцессор на стероидах. Чему там смущать-то?
Неприятно, конечно, но пофиг, ибо ты не каждый день пишешь макросы.
А что там помнить? equ - препроцессор, = - ассемблер, fix - почти как equ, только приоритет выше и можно всякие штуки переопределять, а дефайном я пользовался один раз, когда переводил сишный хэдер - альт+шифт сэкономили кучу времени.
И это всё всё равно лучше масма.
>синтаксис match
Обычный препроцессор на стероидах. Чему там смущать-то?
>необходимость экранировать {}
Неприятно, конечно, но пофиг, ибо ты не каждый день пишешь макросы.
>помнить отличия = от fix, equ и define
А что там помнить? equ - препроцессор, = - ассемблер, fix - почти как equ, только приоритет выше и можно всякие штуки переопределять, а дефайном я пользовался один раз, когда переводил сишный хэдер - альт+шифт сэкономили кучу времени.
И это всё всё равно лучше масма.
бамп
0 Кб, 32x32
Сап, /pr/.
Собственно, я начал юзать hiew для того, чтобы что-то попробовать писать на ассемблере, сам комп я трогать не могу, но есть другой, ОЗУ 64мб, процессор 500Мгц с разгоном вышел, вот я его себе в итоге присвоил %делай, шо хош%, сейчас на нём стоит DOS 7 %винда кашляет и умирает%, сейчас думаю что-нибудь пописать, но не знаю, какой лучше ассемблер взять, сразу скажу, что на этом батином компе я могу только браузер юзать для скачивания и прочих простых махинаций, ничего устанавливать и прочее я не могу см. Параграф №5 Получение пизды от бати. Есть Far для текста, CodeView по-моему от паскаля или тубро си остался, хотелось бы попробовать в какие-нибудь простые игры.
Собственно, я начал юзать hiew для того, чтобы что-то попробовать писать на ассемблере, сам комп я трогать не могу, но есть другой, ОЗУ 64мб, процессор 500Мгц с разгоном вышел, вот я его себе в итоге присвоил %делай, шо хош%, сейчас на нём стоит DOS 7 %винда кашляет и умирает%, сейчас думаю что-нибудь пописать, но не знаю, какой лучше ассемблер взять, сразу скажу, что на этом батином компе я могу только браузер юзать для скачивания и прочих простых махинаций, ничего устанавливать и прочее я не могу см. Параграф №5 Получение пизды от бати. Есть Far для текста, CodeView по-моему от паскаля или тубро си остался, хотелось бы попробовать в какие-нибудь простые игры.
>>606090
Ставил минт, бубунту и паппи, все они дёргались и тыркались, вплоть до всяких разноцветных аналогов БСОДа, изначально на компе стоял 6-й дос, с ним и собирался, Си я пока что тыркать не буду принципиально
Ставил минт, бубунту и паппи, все они дёргались и тыркались, вплоть до всяких разноцветных аналогов БСОДа, изначально на компе стоял 6-й дос, с ним и собирался, Си я пока что тыркать не буду принципиально
Друзья, поясните нуфагу. Вот код:
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 Отладчик - АФДПРО)
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 Отладчик - АФДПРО)
>>606286
ну ты лол.
потому что к di прибавляется 2 и теперь твой отладчик показывает значение по другому адресу, очевидно же.
>2016
>16 бит
>сегментация
ну ты лол.
>НО блядь после выполнения следующей строчки (add di,2) память принимает прежнее значение
потому что к di прибавляется 2 и теперь твой отладчик показывает значение по другому адресу, очевидно же.
>>606286
Ну так кто-то видеопамять обновляет. Попробуй запретить прерывания, записать в видеопамять, а потом считать. А вобще отлаживать графические приложения жопа.
Ну так кто-то видеопамять обновляет. Попробуй запретить прерывания, записать в видеопамять, а потом считать. А вобще отлаживать графические приложения жопа.
>>606286
Без отладчика запускать пробовал? На другой странице запускать пробовал? В AFDPro куча багов была, наверняка это один из них - читает память после того, как сам туда насрал.
Без отладчика запускать пробовал? На другой странице запускать пробовал? В AFDPro куча багов была, наверняка это один из них - читает память после того, как сам туда насрал.
То чувство, когда по вопросам понимаешь, какую книжку по асму сейчас наяривает анон.
>>600262 (OP)
Поясните за ассемблер?
Для чего его юзают какие-то крупные предприятия и корпорации?
Т.е., если я его выучу и пойду на работу, что я на нём буду писать? И насколько он сложный в освоении?
Поясните за ассемблер?
Для чего его юзают какие-то крупные предприятия и корпорации?
Т.е., если я его выучу и пойду на работу, что я на нём буду писать? И насколько он сложный в освоении?
181 Кб, 1914x1020
Ассемблера я не знаю. но хочу научится выполнять простейшие правки в чужих программах в связке ollydbg + idapro + hex-rays
Например там нашел в псевдокоде функцию и мне надо чтобы она всегда выводила положительный результат, как это все осуществлятся, везде гайды 2005-2008 года, а есть что-то поновее?
Например там нашел в псевдокоде функцию и мне надо чтобы она всегда выводила положительный результат, как это все осуществлятся, везде гайды 2005-2008 года, а есть что-то поновее?
>>606624
1) Выделяешь в псевдокоде нужную строчку, нажимаешь Tab.
2) Смотришь на ассемблерный код и думаешь, что конкретно нужно поменять.
3) Смотришь в левом нижнем углу окошка с кодом файловый оффсет.
4) Любым ассемблером генерируешь код (можно встроенным в OllyDBG, можно масм, можно осилить format binary и virtual at в fasm).
5) ...
6) Патчишь.
1) Выделяешь в псевдокоде нужную строчку, нажимаешь Tab.
2) Смотришь на ассемблерный код и думаешь, что конкретно нужно поменять.
3) Смотришь в левом нижнем углу окошка с кодом файловый оффсет.
4) Любым ассемблером генерируешь код (можно встроенным в OllyDBG, можно масм, можно осилить format binary и virtual at в fasm).
5) ...
6) Патчишь.
129 Кб, 1920x1023
>>606634
Если начать с менее сложного, правильно ли будет написать простенькую программу для проверки пароля и вывода фразы и на ней для начала потренироваться. Дабы попробовать сделать чтобы пароль не проверялся. Или надо с еще проще примера начать?
Если начать с менее сложного, правильно ли будет написать простенькую программу для проверки пароля и вывода фразы и на ней для начала потренироваться. Дабы попробовать сделать чтобы пароль не проверялся. Или надо с еще проще примера начать?
>>606639
Норм. Алсо, для мелочи можно править прямо в ольке (по пробелу вроде ассемблер), потом правой кнопкой, Copy to executable -> All modifications, потом правой кнопкой по открывшемуся окну, Save file.
Норм. Алсо, для мелочи можно править прямо в ольке (по пробелу вроде ассемблер), потом правой кнопкой, Copy to executable -> All modifications, потом правой кнопкой по открывшемуся окну, Save file.
11 Кб, 377x295
>>606642
Вот всех этих мелочей как раз не хватало, куда и что нажимать, в гайдах все пишут так, как будто пишут для уже все знающих. Спасибо тебе анон. Поставил для себя первую задачу, приравнять две переменные
Вот всех этих мелочей как раз не хватало, куда и что нажимать, в гайдах все пишут так, как будто пишут для уже все знающих. Спасибо тебе анон. Поставил для себя первую задачу, приравнять две переменные
>>606511
Вау, спасибо)
Вау, спасибо)
>>606646
Лучше возьми какой-то компилятор вроде TCC, чтобы куча мусора и ненужные отпимизации не мешали анализировать дизасм-дрисню.
Лучше возьми какой-то компилятор вроде TCC, чтобы куча мусора и ненужные отпимизации не мешали анализировать дизасм-дрисню.
>>606948
Ноу дискас.
Ноу дискас.
Перед выполнением LEAVE у меня было такое состояние регистров и стека:
ESP = 0012FFAC
EBP = 0012FFB4
Стек:
0012FFAC 0000000F
0012FFB0 00000007
0012FFB4 0012FFF0
0012FFB8 0040100C
После выполнения регистры стали равны:
ESP = 0012FFB8
EBP = 0012FFF0
Почему ESP стал именно таким, если leave аналогична инструкциям mov esp, ebp и pop ebp?
ESP = 0012FFAC
EBP = 0012FFB4
Стек:
0012FFAC 0000000F
0012FFB0 00000007
0012FFB4 0012FFF0
0012FFB8 0040100C
После выполнения регистры стали равны:
ESP = 0012FFB8
EBP = 0012FFF0
Почему ESP стал именно таким, если leave аналогична инструкциям mov esp, ebp и pop ebp?
mov esp, ebp:
-> ESP = EBP = 0012FFB4
pop ebp:
-> EBP = [0012FFB4] = 0012FFF0
-> ESP = ESP + 4 = 0012FFB4 + 4 = 0012FFB8
Что не так-то?
-> ESP = EBP = 0012FFB4
pop ebp:
-> EBP = [0012FFB4] = 0012FFF0
-> ESP = ESP + 4 = 0012FFB4 + 4 = 0012FFB8
Что не так-то?
>>607769
Разобрался в том, что загружается из стека, но почему после mov esp, ebp в esp не то, что я ожидал увидеть, я не понял.
Если регистры
ESP = 0012FFAC
EBP = 0012FFB4
То после mov esp, ebp они должны быть равны. Почему это не так?
Разобрался в том, что загружается из стека, но почему после mov esp, ebp в esp не то, что я ожидал увидеть, я не понял.
Если регистры
ESP = 0012FFAC
EBP = 0012FFB4
То после mov esp, ebp они должны быть равны. Почему это не так?
>>607773
Так потом POP модифицирует и EBP, и ESP. Напиши вместо leave инструкции mov и pop и посмотри сам.
Так потом POP модифицирует и EBP, и ESP. Напиши вместо leave инструкции mov и pop и посмотри сам.
>>607822
Каким образом pop модифицирует оба регистра? Они разве связаны? Регистр ebp ведь не должен влиять на esp, если я явно не прописал копирование значений. Мы его используем, когда надо скакать по стеку, не влияя на esp.
Что-то я туго соображаю, не выспался и часто ловлю себя на мысли, что долго неподвижно смотрю в одну точку.
Каким образом pop модифицирует оба регистра? Они разве связаны? Регистр ebp ведь не должен влиять на esp, если я явно не прописал копирование значений. Мы его используем, когда надо скакать по стеку, не влияя на esp.
Что-то я туго соображаю, не выспался и часто ловлю себя на мысли, что долго неподвижно смотрю в одну точку.
102 Кб, 1477x641
\t
Блядь, я просто не понимаю, что происходит.
Что это за вычисления? Нахуй они нужны?
Может мне кто-нибудь объяснить?
Мы ранее посчитали урон, который должен нанести персонаж.
В v0 мы считываем какое-то значение, в данном случае нулевое. В v1 кладётся наш посчитанный урон.
К нулю, находящемуся в v0, мы прибавляем сотню и перемножаем результат с v1.
0x64 * 0x3 = 0x12C или 300.
Эти три сотни мы умножем на волшебное число 0x51EB851F, получая в данном случае 0x6000000054. Нижние 32 бита результата игнорируем, а верхние (то есть, в данном случае, 0x60) шифтим вправо на 5, получая обратно наше число 3, которое и сохраняем как посчитанный нанесённый урон.
Помимо этого мы ещё делаем шифт числа 0x12C на 0x1F, то есть 31. Что это? Проверка знака?
Я не знаю, тут отрицательных чисел не встречал, в итоге результат всегда нулевой. Мы потом вычитаем этот результат из трех, но 3 минус 0 = 3.
В итоге тут куча операций над числом 3, после которых она остаётся числом три. Нахуя? ЧТо это за проверка, что она значит? Схема работает при любых числах, 5 даст нам в итоге 5 после шифтов и умножений, а десять даст десять. Что-то пойдет по-другому, если вдруг какое-то из чисел будет отрицательным?
Ассемблер-кун, выручай.
Блядь, я просто не понимаю, что происходит.
Что это за вычисления? Нахуй они нужны?
Может мне кто-нибудь объяснить?
Мы ранее посчитали урон, который должен нанести персонаж.
В v0 мы считываем какое-то значение, в данном случае нулевое. В v1 кладётся наш посчитанный урон.
К нулю, находящемуся в v0, мы прибавляем сотню и перемножаем результат с v1.
0x64 * 0x3 = 0x12C или 300.
Эти три сотни мы умножем на волшебное число 0x51EB851F, получая в данном случае 0x6000000054. Нижние 32 бита результата игнорируем, а верхние (то есть, в данном случае, 0x60) шифтим вправо на 5, получая обратно наше число 3, которое и сохраняем как посчитанный нанесённый урон.
Помимо этого мы ещё делаем шифт числа 0x12C на 0x1F, то есть 31. Что это? Проверка знака?
Я не знаю, тут отрицательных чисел не встречал, в итоге результат всегда нулевой. Мы потом вычитаем этот результат из трех, но 3 минус 0 = 3.
В итоге тут куча операций над числом 3, после которых она остаётся числом три. Нахуя? ЧТо это за проверка, что она значит? Схема работает при любых числах, 5 даст нам в итоге 5 после шифтов и умножений, а десять даст десять. Что-то пойдет по-другому, если вдруг какое-то из чисел будет отрицательным?
Ассемблер-кун, выручай.
>>618141
В общем, я погуглил.
Оказывается, это что-то связанное с оптимизацией, а вычисления связанные с 0x51EB851F сюда добавлены компилятором.
Но толком не понял.
В общем, я погуглил.
Оказывается, это что-то связанное с оптимизацией, а вычисления связанные с 0x51EB851F сюда добавлены компилятором.
Но толком не понял.
>>618141
Деление дорогое, заменяется умножением. Гугли multiplicative inverse или вот это посмотри: http://web.archive.org/web/20050220011705/http://wasm.ru/baixado.php?mode=tool&id=203
> 0x51EB851F
Деление дорогое, заменяется умножением. Гугли multiplicative inverse или вот это посмотри: http://web.archive.org/web/20050220011705/http://wasm.ru/baixado.php?mode=tool&id=203
0 Кб, 244x19
Почему mult FFFFFFA0, 51EB851F дало пикрелейтед?
Windows калькулятор не согласен.
Windows калькулятор не согласен.
>>618259
Вопрос снят, я мудак, FFFFFFA0 же знаковое.
Вопрос снят, я мудак, FFFFFFA0 же знаковое.
Как данные попадают с диска в оперативную память?
Разобрал нужную мне функцию в экзешнике игры для PS1. Задумал переписать её. Понял, что она слишком велика и сложна, так что проще подменить результат вычислений. Места мало, так что без серьезных изменений оригинального кода ничего не сделаешь. Решил просто воткнуть jal, который уведет к выполнению моего кода.
Но тут проблема. Я не знаю, где разместить свои инструкции. Да, в дебагере можно положить их куда угодно, а потом прыгнуть на адрес и всё будет ок. Но мне нужно добавить инструкции так, что я просто запускал образ в эмуляторе или диск на консоли и всё работало.
Потом я внезапно понял, что мипсовый ассемблер не имеет инструкций для работы с данными на диске, он может только перемещать данные между регистрами и ram. Как тогда данные попадают в ram?
Я внезапно понял, насколько я мало знаю об архитектуре. В той же сишечке, на которой писалась игра, есть возможности работы с файлами, но какие ассемблерные инструкции получатся при компиляции, если инструкций для работы с rom не существует?
Разобрал нужную мне функцию в экзешнике игры для PS1. Задумал переписать её. Понял, что она слишком велика и сложна, так что проще подменить результат вычислений. Места мало, так что без серьезных изменений оригинального кода ничего не сделаешь. Решил просто воткнуть jal, который уведет к выполнению моего кода.
Но тут проблема. Я не знаю, где разместить свои инструкции. Да, в дебагере можно положить их куда угодно, а потом прыгнуть на адрес и всё будет ок. Но мне нужно добавить инструкции так, что я просто запускал образ в эмуляторе или диск на консоли и всё работало.
Потом я внезапно понял, что мипсовый ассемблер не имеет инструкций для работы с данными на диске, он может только перемещать данные между регистрами и ram. Как тогда данные попадают в ram?
Я внезапно понял, насколько я мало знаю об архитектуре. В той же сишечке, на которой писалась игра, есть возможности работы с файлами, но какие ассемблерные инструкции получатся при компиляции, если инструкций для работы с rom не существует?
>>618807
Зато есть контроллер, который можно выебать в порты, чтобы он прочитал данные с диска. Но как и везде, есть стандартная библиотека, которая просит ОС, которая просит драйвера прочитать данные. Тут цепочка немного короче, но, в общем, то же самое.
1) Берешь PSYQ, читаешь в psyq/docs/libovrXX.pdf (CD/Streaming library), потом librefXX.pdf там же.
2) Во встроенной документации no$psx есть описание железа, его можно проглядеть для ознакомления.
> ассемблер не имеет инструкций для работы с данными на диске
Зато есть контроллер, который можно выебать в порты, чтобы он прочитал данные с диска. Но как и везде, есть стандартная библиотека, которая просит ОС, которая просит драйвера прочитать данные. Тут цепочка немного короче, но, в общем, то же самое.
1) Берешь PSYQ, читаешь в psyq/docs/libovrXX.pdf (CD/Streaming library), потом librefXX.pdf там же.
2) Во встроенной документации no$psx есть описание железа, его можно проглядеть для ознакомления.
>>618807
Там наверно вызовы ОСа(или ее огрызга, хз что там у мыловарни), с возвратом дескриптора открытого файла и оперативкой уже заполненой им.
>но какие ассемблерные инструкции получатся при компиляции, если инструкций для работы с rom не существует?
Там наверно вызовы ОСа(или ее огрызга, хз что там у мыловарни), с возвратом дескриптора открытого файла и оперативкой уже заполненой им.
>>618841
Школьник, мыловарня - это не про обсуждаемую консоль.
Школьник, мыловарня - это не про обсуждаемую консоль.
>>618834
А что делать потом?
Мне хуёво, мне нужен напарник.
>1) Берешь PSYQ, читаешь в psyq/docs/libovrXX.pdf (CD/Streaming library), потом librefXX.pdf там же.
А что делать потом?
Мне хуёво, мне нужен напарник.
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, то после шифта мы получим отрицательное значение, так что условие сработает.
Всё верно?
nop
subu $v0, $s5
sh $v0, 0xB8($s0)
sll $v0, 16
bgtz $v0, Post_HP_Calc
Объясните мне тайный смысл.
Мы загрузили значение в регистр v0, вычли из него значение регистра s5, положила результат туда, откуда взяли.
Затем сделали шифт влево на 16 бит. Насколько я понял, таким образом мы патемся симулировать 16-битную переменную. Если шестнадцатый бит (знак) равен 1, то после шифта мы получим отрицательное значение, так что условие сработает.
Всё верно?
3 Кб, 534x74
Это такое "оптмизированное умножение на 100"?
У меня лаба по ассемблеру.
Что это за пиздец? Как понять это говно?
Почему так всё непонятно? Какие байты, блять. Регистры нахуй.
Как сделать цикл while?
Что это за пиздец? Как понять это говно?
Почему так всё непонятно? Какие байты, блять. Регистры нахуй.
Как сделать цикл while?
>>622453
Помню, в начале нулевых даже некоторые херки угорали по асму и успешно прогали на нем графоний, а сейчас погромистам асм уже не под силу лол.
Помню, в начале нулевых даже некоторые херки угорали по асму и успешно прогали на нем графоний, а сейчас погромистам асм уже не под силу лол.
>>622455
Серьезно, я не понимаю как эти байты могут содержать какую-то логику. Как понять это?
Серьезно, я не понимаю как эти байты могут содержать какую-то логику. Как понять это?
>>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 метка.
Ты как цикл while сделать с помощью goto и if понимаешь?
yoba_begin:
if (yoba) goto yoba_end;
//do something
goto yoba_begin
yoba_end:
Далее, вместо goto у тебя jmp, вместо if у тебя пара команд cmp что-нибудь, jz/je/jne метка.
>>622465
Почему это будет работать?
Я примерно представляю, что есть адреса, можно по ним прыгать и что-то писать. Но как тут логика реализуется? Какая-то магия
Лаба на масме, если что
> вместо if у тебя пара команд cmp что-нибудь, jz/je/jne метка
Почему это будет работать?
Я примерно представляю, что есть адреса, можно по ним прыгать и что-то писать. Но как тут логика реализуется? Какая-то магия
Лаба на масме, если что
>>622475
Команда cmp (compare) установит флаг в результате своей работы. Далее команда je (jump-if-equal) сделает goto в зависимости от установленного флага. Вот и все. Ты знаешь как сделать if, как сделать goto, вперед. точнее, нужно еще понять, как делать рекурсию с помощью call/ret и push ebp/mov ebp, esp, но для начала пойми это.
Команда cmp (compare) установит флаг в результате своей работы. Далее команда je (jump-if-equal) сделает goto в зависимости от установленного флага. Вот и все. Ты знаешь как сделать if, как сделать goto, вперед. точнее, нужно еще понять, как делать рекурсию с помощью call/ret и push ebp/mov ebp, esp, но для начала пойми это.
И да, ассемблер заменит имена этих меток на реальные адреса памяти. Так что язык ассемблера - это еще не совсем машинные коды, но близко.
>>622479
Если понять на самом деле сложно, поиграть в Human Resource Inc.
Если понять на самом деле сложно, поиграть в Human Resource Inc.
Зачем оптимизируюая компиляция в mips превращает умножение на 0.75 в умножение на 300 с последующим делением на 400 (через умножение на магическое число и битовый сдвиг)?
Это занимает кучу операций. 5 на само умножение на 300d, затем умножение на магическое число, затем вытягивание результата умножение из регистра hi, затем битовый сдвиг вправо на 7.
Это 8 операций.
Вместо этого можно было умножить число на 3 через (( x << 1 ) + x), а затем разделить на четыре через (x >> 2). Вышло бы три операции против 8, да ещё и без mult.
Это занимает кучу операций. 5 на само умножение на 300d, затем умножение на магическое число, затем вытягивание результата умножение из регистра hi, затем битовый сдвиг вправо на 7.
Это 8 операций.
Вместо этого можно было умножить число на 3 через (( x << 1 ) + x), а затем разделить на четыре через (x >> 2). Вышло бы три операции против 8, да ещё и без mult.
>>622755
Операция деления, представляемая как деление на 2^n - частный случай?
Операция деления, представляемая как деление на 2^n - частный случай?
>>606286
Такс-такс-такс, кто-то узнал про Калашникова!
Такс-такс-такс, кто-то узнал про Калашникова!
>>622744
Там могли быть две операции. Целочисленное умножение и деление. Оптимизатор соптимизировал как мог, объединить не осилил.
Там могли быть две операции. Целочисленное умножение и деление. Оптимизатор соптимизировал как мог, объединить не осилил.
>>622930
Ну, целочисленное умножение само по себе заняло бы две операции (умножить и вытащить результат из hi/lo в нормальный регистр), с делением то же самое. Итого уже 4 операции, не учитывая медлительность самих mult и div.
Ну, целочисленное умножение само по себе заняло бы две операции (умножить и вытащить результат из hi/lo в нормальный регистр), с делением то же самое. Итого уже 4 операции, не учитывая медлительность самих mult и div.
>>623042
Даже на x86 компиляторы часто стараются избавиться от div (и иногда от mul). Мне кажется, там в исходнике так и было n × 300 ÷ 400.
Даже на x86 компиляторы часто стараются избавиться от div (и иногда от mul). Мне кажется, там в исходнике так и было n × 300 ÷ 400.
Какой сишный код может сгенерировать подобную мипсовую инструкцию?
andi $v0, FFFF
В некоторых случаях and используется естесственным образом, например, когда нужно проверить принадлежность конкретного бита заданному числу. Но иногда эта инструкция просто завершает функцию или следует сразу после неё. При этом область возможных результатов функции не превышает 16 бит, так что инструкция не меняет значение регистра никогда вообще.
Может, это что-то вроде этого?
int32 function(arguments)
{
int32 a;
a = 0;
return a;
}
main()
{
int16 b;
b = (int16)(function(arguments));
}
andi $v0, FFFF
В некоторых случаях and используется естесственным образом, например, когда нужно проверить принадлежность конкретного бита заданному числу. Но иногда эта инструкция просто завершает функцию или следует сразу после неё. При этом область возможных результатов функции не превышает 16 бит, так что инструкция не меняет значение регистра никогда вообще.
Может, это что-то вроде этого?
int32 function(arguments)
{
int32 a;
a = 0;
return a;
}
main()
{
int16 b;
b = (int16)(function(arguments));
}
>>623848
Если $v0 это 32-битное, а функция возвращает short - плевать компилятор хотел на твои допущения
>При этом область возможных результатов функции не превышает 16 бит, так что инструкция не меняет значение регистра никогда вообще.
Если $v0 это 32-битное, а функция возвращает short - плевать компилятор хотел на твои допущения
репост
Парни, выручайте, срочно.
Написать программу на языке Ассемблера, которая позволяет ввести с клавиатуры строку символов на русском языке, подсчитать количество гласных букв во введенной строке и вывести соответствующую информацию на экран.
Может у кого-то похожая уже есть.
Заранее спасибо.
Парни, выручайте, срочно.
Написать программу на языке Ассемблера, которая позволяет ввести с клавиатуры строку символов на русском языке, подсчитать количество гласных букв во введенной строке и вывести соответствующую информацию на экран.
Может у кого-то похожая уже есть.
Заранее спасибо.
>>623848
Да, это именно каст к short. Во-первых компилятор тупой, а во-вторых, даже если он не тупой и мог бы понять, что function всегда возвращает <= 0xffff, на момент генерации кода main у него могло не быть никакой информации о function, кроме прототипа.
Да, это именно каст к short. Во-первых компилятор тупой, а во-вторых, даже если он не тупой и мог бы понять, что function всегда возвращает <= 0xffff, на момент генерации кода main у него могло не быть никакой информации о function, кроме прототипа.
Тред утонул или удален.
Это копия, сохраненная 5 февраля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это копия, сохраненная 5 февраля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.