Да, да, и нет, если вы используете язык высокого уровня, такой как C #, Java или что-то подобное, вы пишете программу, так что да, вы даете инструкции процессору, но между вашим кодом и процессором есть промежуточный уровень, который в основном перевод вашего высокоуровневого кода на процессор. В случае C # это будет .NET Framework, JVM для Java и так далее.
Тогда у вас есть низкоуровневые языки, на которых вы должны очень хорошо знать процессор, на котором будет работать ваш код. Ассемблер является одним из тех языков.
В Википедии размещено множество полезной информации по этому вопросу.