С++ и ассемблер

Тема в разделе "WASM.ZEN", создана пользователем wasm_test, 26 дек 2009.

Статус темы:
Закрыта.
  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Уложился только в 30, впрочем я не могу сказать что здесь существенно больше кода, 593 байта против 533. Даже не в два раза.
    Код (Text):
    1.     mov ebx,[buf+ringBuf_ofs]
    2.     invoke calloc,1,sizeof(ITEM)
    3.     mov [ebx+start_ofs],eax
    4.     mov [ebx+end_ofs],eax
    5.     mov esi,eax
    6.     mov ebp,RINGBUFFER_SIZE-1
    7. for1:   invoke calloc,1,sizeof(ITEM)
    8.     mov [esi+next_ofs],eax
    9.     dec eax
    10.     js .exit
    11.     invoke calloc,STRING_SIZE,sizeof(char)
    12.     mov [esi+string_ofs],eax
    13.     dec eax
    14.     js .exit
    15.     lea edi,[eax+1]
    16.     mov ecx,STRING_SIZE
    17. for2:   call random
    18.     mov edx,100000000h/('Z'-'A'+1)
    19.     mul edx
    20.     lea eax,[edx+'A']
    21.     mov [edi+ecx-1],al
    22.     stosb
    23.     sub ecx,2
    24.     ja for2
    25.     mov esi,[esi+next_ofs]
    26.     dec ebp
    27.     ja for1
    28.     mov eax,[ebx+start]
    29.     mov [esi+next],eax
    30. exit:
     
  2. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Clerk
    я не раз говорил что пишу под ядро - чтобы разобраться что к чему там (и не надо переходить на личности). То что у меня уровень программиста меньше чем у тебя - всем понятно, но не нужно так уж говорить об этом явно. Если нравиться мир только на асм, есть ОС - menuet, вот там все пишется на асм (не ошибаюсь?). Я говорю что нельзя привязываться к одному языку и откидывать другие, так как не нравиться!
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    AntiB
    Мне всёравно ведь. Пиши на чём угодно, авер - вот дырку только нам оставьте ;)
     
  4. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Black_mirror
    попробуйте написать минимальный 3D двигатель на асм :lol: (не знаю как в коммерческих реализациях, но в опенсоурс видел на си/с++/дельфи).
     
  5. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Clerk
    Если ты ярый противник других языков (кроме асм) почему не пишешь под MenuetOS? Там твои труды оценят, а то что здесь пошел холивар - никому легче не становиться ;)
     
  6. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    hххp://dev.chromium.org/developers/how-tos/get-the-code а вот и исходники хрома.
     
  7. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Black_mirror
    IMHO, в _данном_ случае (очень простой алгоритм) ваш код вряд ли окажется существенно лучше сгенерированного компилятором. А написать его на С, согласитесь, проще. Кроме того, С-код значительно проще сопровождать и использовать повторно: допустим, я меняю значения константы RINGBUFFER_SIZE (или STRING_SIZE). Компилятор, в зависимости от этого значения, может оптимизировать код, раскрыв/свернув циклы. А вам придётся переписывать код вручную...

    Или возьмём банальное a = b, где а, b суть структуры. в зависимости от размера структуры компилятор закодирует присваивание одним mov либо через memcpy. А что будет на асме при изменении размера структуры? И таких примеров множество...
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Никто не будет плясать под дуду клерка и возводить кодинг на асме как единственно тру. У этого человека на самом деле велико ЧСВ, если он считает своё мнение единственно верным. Ну а то, что он кодер вселенского масштаба мы уже поняли, васм не стоит его мизинца.
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Black_mirror
    Эх... лукавите, уважаемый. С чего Вы решили, что random не будет менять ecx? Не уж-то неизменямые регистры закончились? :) Это во-первых.
    Во-вторых... это, конечно, не повлияет на число строк, но что это за странное ja после dec ebp? Не забываем, что dec cf не меняет. А в cf может быть, как единица, так и нуль (зависит от чётности STRING_SIZE).
    В-третьих, по хорошему, Вам бы и random реализовать надо бы. В си это стандартная фукнция. Скажем, если те же sizeof, и invoke, и даже calloc (в unix само собой да и под виндой в одну строку на HeapAlloc заменяется) допускаются, то random в стандартные асм-поставки AFAIK не входит.
    В-четвёртых, ret бы на выходе не помешал.

    Код, конечно, симпатичный получился, но по строкам почти на два порядка сишный превосходит. :) Хотя... меряться loc'ами ИМХО вообще неправильно.
     
  10. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    +100500
     
  11. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    green
    А я и не говорю что мой код лучше. Он насколько же безобразен как исходный. Может смысла в этом циклическом списке вообще нет, а есть более эффективная структура.

    Что касается макросов. Их проблемы в основном в том, что у них очень ограниченный доступ к структурам компилятора(обычно есть только возможность проверить существование символа и никаких возможностей узнать что он за зверь) и возможности синтеза и анализа аргументов. Если бы они могли так же свободно оперировать со структурой программы как макросы Lisp'а, то грамотно написаные макросы вполне бы могли соперничать с inline функциями других языков. И учёт свободных регистров можно было бы сделать, и автоматическое определение типа содержимого регистра (то есть если r8 указывает на некоторую структуру, а дальше идёт команда mov r5,[r8.somefield], то компилятор вполне бы мог определить, что находится в регистре r5 по типу somefield и выдать предупреждение, если далее мы пытаемся сделать с r5 что-то странное), и прочие вкусности.
     
  12. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    l_inc
    1) вместо call random пишем rdtsc
    2) действительно бага, меняем dec на sub или ja на jg
    3) решено в пункте 1
    4) у вас код тоже как функция не оформлен :-P

    Вы знаете, в некоторых контроллерах есть модули которые получая параметры в регистрах выполняют шифрование DES или AES. Как вы думаете, на каком языке функция шифрования будет короче, если из Си нет прямого доступа к регистрам процессора? Почему вы тогда включаете во время написания программы время разработки стандартной сишной библиотеки? Или время написания кода, который в других языках генерирует framework? Я согласен что это нужно сделать, но эжто нужно сделать всего лишь один раз, а не для каждой программы.
     
  13. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Black_mirror
    rdtsc в цикле не выдаст случайных чисел.
    однако простой random - это mul+add
     
  14. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    А что мешает использовать CRT (или любую другую библиотеку) из асма?
     
  15. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    green
    а зачем тогда вообще его юзать? библы написаны на еритековском си
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Даже прочитав выборочно посты последних двух страниц ясно, что тут пошло определенно что-то не то по сравнению с тем, что я обозначал в первом посте. Жалко.
     
Статус темы:
Закрыта.