|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 18, 2004 18:29:31 Чем больше пишу на асме, тем больше убеждаюсь, что C лучше. Вот я и хотел узнать, а есть ли какой-нить Asm с C-шным синтаксисом, т. е. чттобы можно было писать чё-нить типа var1=eax=var2 или MyFunc(var1,(eax=var2)+1,(eax=&var3)+(edx=var4)) вместо mov eax,var2 mov var1,eax и lea eax,var3 mov edx,var4 add eax,edx push eax mov eax,var2 inc eax push eax push var1 call MyFunc Конечно, есть макрос invoke, но его использование часто приводит к тому, что код на Asm'е получается ещё хуже C-шного например код pop eax invoke DeleteObject,eax будет представлен вот так pop eax push eax call DeleteObject |
|
|
Дата: Июл 18, 2004 19:35:50 Чем больше пишу на асме, тем больше убеждаюсь, что C лучше Если под "лучше" подразумеваешь "проще и меньше набирать" то возможно , а если "меньше размером и быстрее" то напиши на сях аналогичную прогу pop eax invoke DeleteObject,eax Кто ж на асме такое напишет :) А как это будет представлено на С ? |
|
|
Дата: Июл 18, 2004 20:11:00 Loger Асм предоставляет контроль над получаемым выполняемым кодом, позволяя программисту его оптимизировать. Но у медали есть и другая сторона - если руки кривые то АСМ безсилен. |
|
|
Дата: Июл 18, 2004 20:29:21 Вот-вот. Имхо, если писать проги для заработка, то это С++ или любой ЯВУ. А если для души - то это асм. Хотя все от задачи зависит.. |
|
|
Дата: Июл 18, 2004 20:58:50 bogrus конечно, если так оптимизировать, то asm получается быстрее. Но посмотри на то, что обычно пишут — там же сплошные invoke. Или взять макрос m2m. Сишный компилер никогда не будет копировать переменные через стек. All Так всё-таки есть ли assembler, который бы позволял писать в стиле C? Или может это как-нить можно реализовать с помощью макросов? Я слышал о HLASM, но он вроде как только для какой-то экзотической платформы |
|
|
Дата: Июл 18, 2004 21:22:11 Loger Посмотрите Sphinx C-- HLA - это больше на паскаль похоже %) Вообще, для ваших целей существуют макросы. В FASM, например, очень большие возможности. > Сишный компилер никогда не будет копировать переменные через стек Дык в чём проблема? m2m можно и через регистр делать, но у этого есть куча минусов. IMHO, все ваши примеры - это не асм, а Си с использованием регистров вместо переменных. На асме можно применять несколько другой подход, и необходимости в подобных выражениях просто не возникнет. |
|
|
Дата: Июл 18, 2004 21:36:03 Loger ну дык пиши на С - зачем тебе вообще асм? Чего ты достичь хочешь написав программу на ассемблере? |
|
|
Дата: Июл 19, 2004 07:07:52 я тут дизассемблировал прогу одну с диска к книге Шрайбера. Код как известно там сяшный и там всего 3 вызова АПИ, но такое ощущение, что какой-то маньяк взял и всё изуродовал. Сами посмотрите любую прогу на сях в дизассемблере, только не забудьте тазик принести, потому как проснётся рвотный рефлекс. |
|
|
Дата: Июл 19, 2004 09:55:55 А как вы думаете, откуда у меня такая неприязнь к сям? В свое время имел счастье искать ошибку Олей в сишном коде, т.к. сишный "дебужер" (язык не повернется это дебагером назвать) так и не справился с задачей, а наоборот всеми силами усложнял процесс. С другой стороны, если на сях писать простыми конструкциями, то местный отладчик вполне справится. Теперь о примерах, где сплошные инвоки. Их все надлежит удалить и никогда о них не вспоминать. Потому что писать на асме проги под вынь - это антигуманно. Я имею в виду писать оконные приложения. Если надо быстрый и маленький код под виндами, оптимальный вариант - С++ без CRT и со вставками асма. А на чистом асме писать окошки - это издевательство над языком и своим мозгом. (Проверял лично :)) |
|
|
Дата: Июл 19, 2004 10:31:21 Corpse с помощью нехитрых манипуляций можно получить и из сишного кода такой экзешник, что не каждый на асме напишет. Хинт: выкинуть crt, например, оптимизацию включить |
|
|
Дата: Июл 19, 2004 16:53:50 А вот кстати, что пишет сам Шрайбер: На самом деле разрабатывать ассемблерные программы в среде Win32 значительно проще, чем в среде DOC или Windows 3.x. так как теперь вы можете воспользоваться преимуществами 32-битных процессорных инструкций. [..] В своё время я тоже был активным сторонником программирования на ассемблере, однако со временем я отказался от такой практики. Это произошло после того, как я обнаружил, что встроенный оптимизатор Microsoft Visual C в большинстве случаев формирует существенно более эффективный исполняемый код, чем это под силу человеку. Дело в том, что оптимизатор пользуется многими хитрыми приёмами, применять которые программистам на ассемблере строго не рекомендуется, так как при их использовании ассемблерный код будет малопонятным, нечитаемым, запутанным и плохо модифицируемым. ЗЫ Я тут недавно переписывал код Z80 asm -> C . Изматерился, но всё же вроде бы получилось %) |
|
|
Дата: Июл 19, 2004 17:10:58 оптимизатор пользуется многими хитрыми приёмами, применять которые программистам на ассемблере строго не рекомендуется Я для себя нашел только одну вещь, которую человеку (по сравнению с комнилятором) проблематично применять - это reusage локальных структур, когда структура, используемая вначале как одно что-то потом используется как другое. Хотя и тут можно приловчиться и не забыть комментарий написать :) Все остальное можно и получше написать, чем это любой компилятор сделает, такое мое имхо |
|
|
Дата: Июл 19, 2004 17:27:23 masquer > Все остальное можно и получше написать, чем это любой компилятор сделает, такое мое имхо В любом случае по времени написания оптимального кода ты проиграешь оптимизации cl.exe от MS. |
|
|
Дата: Июл 19, 2004 17:47:11 А это все depends, как говорится :) Как правило, выигрыш стоит потраченного времени. |
|
|
Дата: Июл 19, 2004 18:20:47 По поводу хитрых приёмов, на скорую руку накопал: 0040227A |. 66:8B53 07 |mov dx, [word ds:ebx+7] 0040227E |. 66:8B4B 05 |mov cx, [word ds:ebx+5] 00402282 |. 66:8B43 03 |mov ax, [word ds:ebx+3] 00402286 |. 66:8955 B6 |mov [word ss:ebp-4A], dx 0040228A |. 66:8B53 01 |mov dx, [word ds:ebx+1] 0040228E |. 66:894D 9F |mov [word ss:ebp-61], cx 00402292 |. 66:8945 88 |mov [word ss:ebp-78], ax 00402296 |. 0FB7C9 |movzx ecx, cx 00402299 |. 0FB7C0 |movzx eax, ax 0040229C |. 8955 F0 |mov [local.4], edx 0040229F |. 0FB7D2 |movzx edx, dx В этом коде меня даже не первые 3 команды смущают (имхо можно сразу делать movzx) а то, что последние 2 местами нужно поменять, ведь старшее слово edx НЕ определено.. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.071 |