Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/76: Рейтинг темы: голосов - 76, средняя оценка - 4.72
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
1

Assembler или C++

09.06.2013, 22:05. Показов 14387. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вечер добрый.

Подскажите, завязался тут такой "спор".

В блоге, программист из Латвии, который пишет свою ОС, привёл два примера работы на C/C++ и Assembler:

The C function:
C
1
2
3
4
// In C all the functions that are not marked as static are global
int cfunct(int a, int b, int c){
  return a + b + c;
}
Called from assembly:

Assembler
1
2
3
4
5
6
7
8
9
10
11
[extern cfunct]   ; import the C function
call_cfunct:
  push 3          ; c
  push 2          ; b
  push 1          ; a
  call cfunct     ; call the C function
                  ; now eax holds the return value
  add esp, 12     ; stack cleanup, we did the mess,
                  ; so we clean it up and remember
                  ; we pushed 3 integers (32bit, dwords)
                  ; that means it's 12 bytes

Но некоторые программисты пишут, что нужно на assembler.

Так как быть и на чём начать писать и в какой стороне двигаться -- С++ или Assembler, для ядра, хотя бы.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2013, 22:05
Ответы с готовыми решениями:

Что быстрее assembler или c++
Вопрос от новичка. Что будет быстрее по скорости выполнения и на сколько: 1) сложить a+b на C++...

Assembler & Delphi (или С)
Такое задание. Запускаю програмку на языке высокого уровня(Delphi или С), ввожу в ней строку,...

Ошибка в Assembler или, возможно, DOS/
Писал программу на Assembler, для заполнения матрицы по спирали. Exe файл работает правильно, а с...

игра: арканойд или архиватор на Assembler
помогите

31
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
09.06.2013, 23:16 2
Это смотря на каком уровне вы владеете этими языками. Ядро бы я лично писал бы на асме.

Добавлено через 29 секунд
а модули, на чистом С. Без ++)
0
6 / 6 / 2
Регистрация: 21.05.2013
Сообщений: 47
10.06.2013, 00:08 3
YYwww,

Не по теме:

зачем изобретать велосипед?


я за асм (для ядра), он всё таки побыстрее будет
0
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
10.06.2013, 00:11 4
IronnMann, это как написать)) можно и на asm завернуть.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
10.06.2013, 00:19 5
Цитата Сообщение от YYwww Посмотреть сообщение
два примера работы на C/C++ и Assembler
и что эти примеры иллюстрируют?
пишите на том что лучше знаете, если ничего не знаете, то изучите асм и опосля с толком пишите С/С++
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
10.06.2013, 08:45 6
Цитата Сообщение от YYwww Посмотреть сообщение
привёл два примера работы на C/C++ и Assembler:
Примеры демонстрируют совершенно разные вещи - пример на Си показывает функцию, а на асме - вызов этой функции. В связи с этим вопрос - в чем собственно вопрос?

Добавлено через 1 минуту
Цитата Сообщение от YYwww Посмотреть сообщение
для ядра, хотя бы.
Если имеется ввиду ядро ОС, то тот же линух на Си написан. Там есть ассемблер, но его ничтожно мало по сравнению с объемом Си кода.

Добавлено через 2 минуты
Assembler
1
2
3
4
5
6
7
8
9
10
call_cfunct:
  push 3          ; c
  push 2          ; b
  push 1          ; a
  call cfunct     ; call the C function
                  ; now eax holds the return value
  add esp, 12     ; stack cleanup, we did the mess,
                  ; so we clean it up and remember
                  ; we pushed 3 integers (32bit, dwords)
                  ; that means it's 12 bytes
если написать это на ассемблере, то код так и останется в таком виде, а если написать на Си, то современные оптимизирующие компиляторы (gcc например) могут сделать из этого кода такой
Assembler
1
mov eax, 6
поэтому утверждение, что на ассемблере лучше довольно спорно.

Добавлено через 12 минут
Вот проверил в MinGW. Из такого кода
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int foo (int a1, int a2, int a3)
{
    return a1 + a2 + a3;
}
 
int main()
{
    std::cout << foo(1, 2, 3);
}
компилятор сделал
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
_main:
LFB984:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $16, %esp
    call    ___main
    movl    $6, 4(%esp)
    movl    $__ZSt4cout, (%esp)
    call    __ZNSolsEi
    xorl    %eax, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
ключевое место здесь это
Assembler
1
movl    $6, 4(%esp)
о чем я и писал выше.
Для тех, кто ничего не понял, поясню, компилятор сделал такой код
C++
1
2
3
4
int main()
{
    std::cout << 6;
}
Хотя я сути вопроса до сих пор не понял, может вопрос не в этом?
2
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
10.06.2013, 11:24 7
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от YYwww Посмотреть сообщение
Так как быть и на чём начать писать и в какой стороне двигаться -- С++ или Assembler, для ядра, хотя бы.
* Ассемблер жестко привязан к платформе.
Написав программу под одну платформу, вы делаете ее почти непортируемой на другие.
Даже между "родственными" платформами, такими как, например, IA-32 и AMD64, существует
много принципиальных различий - разные размеры указателей, разные наборы регистров,
разные соглашения о передаче параметров и т.д. Это значит, что для поддержки 32-битной и
64-битной версий программы придется иметь две кодовые базы.

С++ эта проблема тоже затрагивает, но не в такой степени, и многие программы, написанные
на C++, могут быть успешно портированы на другие платформы простой перекомпиляцией кода.

* Ассемблер практически не развивается как отдельный язык и лишен библиотечной поддержки.
Сталкиваясь с некоторыми, пусть даже и типовыми задачами, вам с большой вероятностью
придется писать свое решение с нуля, а это может оказаться очень и очень затратным.

Для С++, напротив, имеется огромное количество библиотек на все случаи жизни,
используя которые, вы экономите значительное количество времени и сил.

* Ассемблер, по своей натуре, имеет очень слабую поддержку языка в плане обеспечения
корректности и безопасности кода. Фактически, все что есть - это макросы, да и
то не везде. Все остальное необходимо будет изобретать самому.

С++, в противовес, имеет встроенные языковые средства, с помощью которых можно
контролировать надежность кода и обеспечивать различные гарантии.

* Вопреки распостраненному мнению, использование ассемблера в 99% не сделает вашу
программу быстрее. Современные компиляторы достаточно умны и умеют оптимизировать
код значительно лучше человека, не говоря уже о том, что делают они это намного
быстрее и точнее. Некоторые компиляторы, такие как Intel C++ Compiler, умеют
оптимизировать код под конкретную модель процессора, существует также двухпроходная
оптимизация (Profile-Guided Optimization), рассчитанная на сбор информации о
конкретных сценариях использования программы и улучшения по максимуму критических
участков кода, а еще масса различных инструментов профилирования и т.п., доступных
только для C, C++ и других языков высокого уровня.

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

С другой стороны, в некоторых прикладных областях знание ассемблера не просто прихоть, а
жизненно важная необходимость, я могу сходу назвать, как минимум, три такие области:
системное программирование, обработка цифровых сигналов, встраиваемые системы.

Также существует мнение, что школу ассемблера, или другого низкоуровневого языка, в
любом случае нужно пройти. Человек, который это сделал, лучше понимает происходящее
"за кадром", да и вообще ему потом "сам черт не страшен". Я с этим полностью согласен.
7
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
10.06.2013, 12:06  [ТС] 8
Цитата Сообщение от Wolkodav Посмотреть сообщение
Это смотря на каком уровне вы владеете этими языками. Ядро бы я лично писал бы на асме.
Я совершенствую знания С++, думаю, что от С++ до С не такая большая пропасть, как С++ и Pascal, например.
Assembler я ещё не знаю, но эту проблему легко решить, так как всё равно придётся его учить. Университет.

Просто я читаю статьи кто и как что пишет, но кто-то пишет, что "если написать ОС полностью на Ass, то это просто чудо! Пример тому ОС Minuet". Если я не ошибаюсь, то там приводили пример почему Ass лучше C ядра\ОС, т.е., ошибок компиляции или что-то там, не буду врать, не внимательно прочитал и не углублялся в вопрос разницы.

Вот, получается, мне нужен вопрос "разницы", что лучше, как лучше, где лучше, на чём лучше?


IronnMann,

Не по теме:

затем, что нужна особая ОС для специальных нужд, не думаю, что коммерческого плана, распространения на десятки-сотни-тысячи-миллионы компов -- только для одной программы, только для 1 компьютера. Ну и для практики, разве нет? :)




Цитата Сообщение от Kastaneda Посмотреть сообщение
Хотя я сути вопроса до сих пор не понял, может вопрос не в этом?
Вопрос именно в этом -- длина кода, как написал в той блоге программист, его не то чтобы поразила, а даже удивила. И ведь для простой такой строчки на С, как много надо на Asm, да?

Так вот и вопрос -- при каком языке работа ОС будет наилучшим образом быстрее. Даже не зависимо от длины кода.

ВНИМАНИЕ: при условии, что это не будет ОС похожа на семейство Unix или iOS, это будет вообще минимализированная "вещь", даже ОС то трудно назвать, которая будет использовать всё устройство компа и несколько программ. Думаю, даже антивируса не будет в этой ОС как программы-приложения или вообще программы.

Минимализм, товарищи, это всё минимализм



Убежденный,
Вы привели хорошие доводы в пользу С\С++, однако:

* Ассемблер практически не развивается как отдельный язык и лишен библиотечной поддержки.
Сталкиваясь с некоторыми, пусть даже и типовыми задачами, вам с большой вероятностью
придется писать свое решение с нуля, а это может оказаться очень и очень затратным.

Для С++, напротив, имеется огромное количество библиотек на все случаи жизни,
используя которые, вы экономите значительное количество времени и сил.
Вот этот момент меня, по сути, нисколько не пугает. Если нужно будет реализовать цикл или какую-то определённую функцию (математическую, графическую), то это меня не сильно пугает. Язык можно английский, ну если только небольшое меню на русском и английском, а так, язык даже не нужен, именно разнообразие и использование. И внешний вид будет, боле вероятно, как консольный. Ну, кубизм, минимализм. Т.е., я упрощаю работу на самом "мелком", что может отягощать её. Мне главное, чтобы все ресурсы компа направлялись на несколько определённых задач, чтоы ОС не забивалась всем, чем не нужно, чтобы ограниченное кол-во ядер работало так, как следовало бы. Чтобы была задействована многопроцесорность.

Вот и всё. Даже не нужно "хранение файлов, картинок, музыки", даже музыку (звуковую карту) не особо нужно.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
10.06.2013, 12:23 9
При решении чисто практических задач на ассемблере Вы сильно потеряете в скорости.

Я уже писал выше - работа программиста часто сводится к тому, чтобы разбить
задачу на типовые моменты, найти для них готовые библиотечные компоненты и
собрать это все в единую работающую систему. Для C++ таких библиотек навалом,
для ассемблера - нет. Поэтому пока ассемблерщик будет с головой погружен в
раскапывание спецификаций, изобретение своих велосипедов, в кропотливую
наладку и поиск ошибок, его коллеги ускачут далеко вперед и займутся новыми
интересными делами.

Нет, ну если мы рассматриваем такие экзотические области, как написание
своей операционки или программирование своего спутника для отправки на
орбиту Юпитера, то я с Вами согласен - надо, надо использовать ассемблер
1
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
10.06.2013, 16:17  [ТС] 10
Убежденный, вот смотрите что будет:

Мне нужно реализовать программу. Эта программа для конкретной задачи. Она, программа, будет обрабатывать данные, выдавать результаты, практически даже не думать. Хотя и "мыслительную" часть процесса планирую сделать.

Эту программу я пишу на С++, так как его пока что я знаю, дабы время не терять.

(Возможно, параллельно) Я хочу написать для это конкретной программы ОС, которая бы использовала "потенциальные возможности" программы в полную мощь. Т.е., обработка данных, работа с файлом\файлами, анализ, поиск и тд и тп - всё в пределах одной конкретой задачи, которая может быть разбита на несколько модулей\подзадач.


И вот вопрос был связан с этим: на каком языке мне лучше писать ОС, вообще, как бы ОС с нуля нулевого, т.к., эта ОС для конкретной задачи и она должна работать в основном с конкретной задачей, даже не отвлекаясь на что-либо постороннее.

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

Поэтому, я хочу реализовать свою ОС, которая минимально использует "ресурсы", у которой даже календаря не будет, не говоря уже о файловой систему, максимум часы. И она будет под определённую программу. Т.е., ОС-программа.

И вот тут, мне бы хотелось уточнить: на каком языке лучше начать писать это всё, чтобы получить максимально эффективную работу процессора, скорости обработки информации и тд и тп.

И даже если это будет ассемблер, то в дальнейшем, я не против переписать с С++ на ассемблер программу, которая бы идеально подходила к уже имеющейся ОС (и, в следствии чего, немного переделать ОС).

Вот такие вот дела.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
10.06.2013, 17:11 11
Гвоздь забить можно камнем, молотком и кувалдой. Чем именно выбирать Вам.

Если интерпретировать это на Asm/C/C++. То так:
1. Асм нужно использовать там где надо (для этого и придумали ассемблерные вставки), так как писать крупный проект на асме радости Вам не доставит.
2. Си и С++ стоит использовать с умом. Некоторые вещи вам нужно будет написать на чистом Си, чтобы соблюсти определенную переносимость (POD типы, соглашение вызовов и т.д.). Но в целом использовать С++, чтобы не велосипедить, а решать поставленную задачу.

Есть такое выражение: "Чрезмерная оптимизация вредна". Напишите это на С++, добейтесь стабильной работы, а потом оптимизируйте узкие участки на Си и/или Асме.
2
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
10.06.2013, 17:27  [ТС] 12
Т.е., определённой разницы один и тот же код, который выполняет (допустим) 5+2= ??? - хоть на С, С++ или ASM разницы никакой? (ну, кроме кол-ва строк).
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
10.06.2013, 17:32 13
Все более или менее "нормальные" компиляторы смогут оптимизировать код, даже о таком о котором вы и бы не подумали оптимизировать. Но читаемость, а значит в дальнейшем и поддержка, лучше на с/с++, чем на асме.
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
10.06.2013, 17:43 14

Не по теме:

Цитата Сообщение от YYwww Посмотреть сообщение
длина кода, как написал в той блоге программист, его не то чтобы поразила, а даже удивила.
Если программиста удивляет, что один и тот же код на ассемблере занимает больше строк, чем на Си, то скорее всего это и не программист вовсе :D
Цитата Сообщение от YYwww Посмотреть сообщение
И ведь для простой такой строчки на С, как много надо на Asm, да?
Так в твоем первом посте на Си показана функция, а на асме только ее вызов и очистка стека, т.е. самой функции нет. На сколько я понял ты взял этот код из блога какого-то "программиста", который даже не смог разобраться какой ассемблерный код (идентичный сишному) нужно вставить в свой блог.
Исходя из всего этого могу сказать, что не нужно читать блог этого "программиста из Латвии":)



Добавлено через 4 минуты
Цитата Сообщение от YYwww Посмотреть сообщение
Т.е., определённой разницы один и тот же код, который выполняет (допустим) 5+2= ??? - хоть на С, С++ или ASM разницы никакой? (ну, кроме кол-ва строк).
Если 5 и 2 это константы времени компиляции, то сишный компилятор просто стразу посчитает 5+2=7 и вставит ответ в код. А если 5 и 2, например, вводятся с клавиатуры, то разницы нет. Хотя правильней написать, что есть (например переменные будут расположены на стеке, т.е. лишнее время на чтение/запись), НО когда в дело влезет оптимизатор, то он вполне может расположить эти переменные на регистрах, поэтому можно сказать, что разницы нет.
1
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
10.06.2013, 19:22  [ТС] 15
stima, получается, ОС на С++ из ваших выводов? (А то чувствую, что всё про программу говорим, которую и так на С++ собираюсь писать, т.к. ASM ещё не знаю).




Kastaneda,

Не по теме:

Верю, тот программист решил полностью на С++, вроде бы, писать свою ОС и она будет там что-то коммерческой. Может быть, это я сам зря на программиста наговарию, он не испугался и не удивился, просто привл несколько вариантов, сколько строчек на С и ассемблере и говорит "мол, вот так вот, мол". Ну раз так, то так.

Он пишет ОС, повторюсь.

0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
10.06.2013, 19:30 16
2YYwww Вы вообще загрузчик писать будете? Или уже Grab использовать? Ну кернел все равно Вам придется писать на Си, а что-то более высокоуровневое можно и на С++.
0
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
10.06.2013, 21:23  [ТС] 17
stima,
Ядро хочу своё написать. Для теории и практики, так сказать. Т.е., теоретическая часть, в виде "Таненбаум Современные Операционные Системы" и иже с ним -- это я тоже буду изучать. Причём детально и глобально.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
10.06.2013, 21:51 18
Удачи, многие начинали)) не многие закончили.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
10.06.2013, 21:54 19
Просто ради любопытства - планируемая ОС, я так понимаю, под х86, а в каком режиме будет работать?
0
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
10.06.2013, 22:47  [ТС] 20
stima, спасибо, надеюсь, ОС-подобное существо появиться, года так через 3-4. Это дело бросать не хочу, чисто из наглости.


Kastaneda, не совсем понял вопрос. Простите, я ещё нахожусь на стадии "планирование и сбор информации по ОС" и не на всё могу ответить.
0
10.06.2013, 22:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2013, 22:47
Помогаю со студенческими работами здесь

Можно ли по названию платы,или по чипу,или по соккету,определить,поддерживает плата ХР или нет?
Добрый день всем.Уважаемые знатоки,я заранее прошу у Вас прощенья,если заданный мной вопрос,тупой...

Intel или AMD? R9-290 GAMING 4G или N780 или SLI? Комп за овер 50к
Комп нужен для ИГР на 5лет примерно! 1) Смысл поста в том чтобы собрать системник чтоб каждая...

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

Получить из строки всё до пробела или запятой или точки или восклицательного знака
Match m_ = Regex.Match(вопрос, @&quot;Кто такой.(.{5})&quot;, RegexOptions.IgnoreCase |...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru