· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Новый Asm

. 1 . 2 . >>

Посл.отвђт Сообщен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 НЕ определено..

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.071