Есть ли общая сборка ISA для изучения? Если нет, то какой я должен учиться?
Я изучил программирование сборки процессора Intel 8086 в колледже. Я сейчас пытаюсь пересмотреть это.
Я слышал, что сборка требуется в автомобильных встраиваемых системах, поэтому я хочу знать, какой способ обучения является лучшим? Мне не нужно терять время, потому что я хочу получить работу.
Действительно ли помогает пересмотр сборки 8086? Или лучше перейти на что-то вроде 32-битной сборки x86?
Спасибо.
1 ответ
Ваш заголовок задает совершенно другой вопрос, что тело. Как правило, вы должны задать один простой вопрос.
Нет, общего синтаксиса сборки нет - или вообще-то есть, но вы, вероятно, не имеете в виду, что синтаксис сборки обычно такой:
[<label>:] <opcode> <operands> [<comment>]
или похожие.
На самом деле для x86 существует два общих синтаксиса - Intel и AT&T (с несколькими вариантами синтаксиса Intel от разных ассемблеров, включая совершенно разные директивы для строк, которые не являются инструкциями), но они и другие более или менее имеют такую форму.
Но что вы, вероятно, имели в виду, так это набор инструкций на языке ассемблера. Если это так, то нет, нет. Это не то же самое, что синтаксис. Как и естественный язык, машинные языки имеют синтаксис, словарь и семантику - как слова упорядочены, какие слова доступны и что они означают. Суть языка ассемблера в том, что между мнемоникой сборки и набором команд машинного кода существует взаимно-однозначное отношение. Поэтому языков ассемблера столько же, сколько и процессорных архитектур.
Действительно ли помогает пересмотр сборки 8086? Или лучше перейти на что-то вроде 32-битной сборки?
16-битный 8086-ассемблер используется редко (вне обучения, как в вашем случае), и x86 вообще не является автомобильным устройством, если это то, что вас интересует. "32-битная сборка" не вещь, если вы не конкретно ссылаясь на 32-битную сборку x86.
Изучение языка ассемблера полезно для понимания основ работы компьютера - возможно, поэтому вас учили устаревшему набору инструкций, потому что цель состоит не в том, чтобы кодировать его, а в том, чтобы понять фундаментальные принципы. Это, в свою очередь, может привести к написанию лучшего кода языка высокого уровня, который компилируется в меньший, более быстрый код машинного языка. Это также может быть полезно при отладке высокоуровневого кода - иногда вам нужно перейти на уровень инструкций, чтобы понять, почему сгенерированный компилятором код не выполняет то, что вы ожидаете. Но для этого вам нужно только уметь читать сборку, а не писать ее.
Язык ассемблера для больших объёмов кода, который может быть реализован на языке системного уровня, таком как C, C++, не нужен и непродуктивен. Компилятор не только является экспертом в наборе команд целевого машинного кода, так что вам не обязательно это делать, но язык высокого уровня также с большей вероятностью будет поддерживаться широким набором инструментов для тестирования, проверки, статического анализа, анализ безопасности, анализ производительности и обнаружение ошибок. Код также будет более понятным, более пригодным для повторного использования и сможет извлечь выгоду из более широкого круга сторонних библиотек.
Также посмотрите на это так, чтобы вы, например, были экспертом в сборке PIC, но ваша следующая работа - для ARM Cortex-M, теперь вы уже не эксперт, и будете писать гораздо худший код, чем сгенерирует компилятор, и займет гораздо больше времени, делая это. Тогда ты безработный.
На большой базе кода современный оптимизирующий компилятор может сделать лучшую работу по созданию эффективного asm, чем человек, мог бы или не мог бы, за исключением нескольких важных циклов, которые вы можете вернуться и настроить (либо путем настройки C, либо переписав этот цикл в asm). Встраивание и постоянное распространение сложно в asm, но компиляторы превосходны в этом. Это особенно верно для процессоров, которые являются хорошими целями компилятора и на которые разработчики компилятора потратили много времени, например на x86 или ARM.