Я думаю , современная Реализация Компилятора в ML является лучшим вводным компилятором, пишущий текст. Существует версия Java и версия C также, любой из которых мог бы быть более доступным, учитывая Ваше образование языков. Книга упаковывает много полезного основного материала (сканирование и парсинг, семантический анализ, записи активации, выбор инструкции, RISC и x86 поколение собственного кода) и различные "усовершенствованные" темы (компилирующий OO и функциональные языки, полиморфизм, сборку "мусора", оптимизацию и единственную статическую форму присвоения) в относительно небольшое пространство (~500 страниц).
я предпочитаю современную Реализацию Компилятора книге Дракона, потому что современная реализация Компилятора рассматривает меньше поля - вместо этого это имеет действительно твердое покрытие всех тем, которые необходимо было бы записать серьезному, достойному компилятору. После работы через эту книгу, Вы будете готовы заняться научно-исследовательскими работами непосредственно для большей глубины при необходимости в нем.
я должен признаться, что имею серьезную слабость к Niklaus Wirth Конструкция Компилятора. Это доступно онлайн как PDF. Я нахожу программирование Wirth эстетичным просто красивый, однако некоторые люди находят его стиль слишком минимальным (например, Wirth одобряет синтаксические анализаторы с рекурсивным спуском, но большую часть внимания курсов CS на инструменты парсера-генератора; проекты языка Wirth довольно консервативны.) Конструкция компилятора является очень сжатой дистилляцией основных идей Wirth, поэтому нравится ли Вам его стиль или не или нет, я настоятельно рекомендую чтение этой книги.
Я предлагаю работать с лучшим производителем ассемблера: gcc.
Напишите простые программы на C, а затем скомпилируйте их с ключом -S. вы получите файл .s, содержащий код ассемблера. Повозитесь с этим, и вы научитесь этому. Самое приятное то, что если вы хотите изучить другой ассемблер, вы можете просто скомпилировать gcc как кросс-компилятор и создать ассемблер для любой поддерживаемой платформы.
Не забудьте отключить оптимизацию с помощью -O0, иначе вы можете найти странные уловки.
Это привет, мир на ассемблере
.cstring
LC0:
.ascii "hello world!\0"
.text
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $20, %esp
call L3
"L00000000001$pb":
L3:
popl %ebx
leal LC0-"L00000000001$pb"(%ebx), %eax
movl %eax, (%esp)
call L_puts$stub
movl $0, %eax
addl $20, %esp
popl %ebx
leave
ret
.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
L_puts$stub:
.indirect_symbol _puts
hlt ; hlt ; hlt ; hlt ; hlt
.subsections_via_symbols
Несколько (хорошо, много) лет назад я взял в руки книгу Питера Нортона по сборке http://www.amazon.com/ Ассемблер-Язык-Праймер-Персональный компьютер / dp / 0136619010 . Это был фантастический способ начать программирование сборки для ПК. Интересно, можете ли вы все еще получить это и использовать DOSbox для работы с ним.
Что ж, даже если это не то, что некоторые люди называют «лучшей» сборкой, я бы рекомендовал изучить X86 / X86-64, так как он наиболее широко используется. Чтобы запустить программу, вы можете просто использовать GCC, чтобы перевести ее в двоичный файл, а затем запустить через консоль.
Присоединяйтесь к сообществам, которые преуспевают в ассемблерном коде. Первое, что приходит на ум, - это демосцена. Например, ознакомьтесь с продукцией, выпущенной для компьютеров Mac x86 на pouet.net . Попробуйте связаться с некоторыми кодировщиками в активных группах. Некоторые из них могут быть готовы поделиться идеями и кодом и, возможно, даже побудить вас написать свой собственный.
Так я начал в те дни, но на 8-битной Atari.
Я изучил MIPS и протестировал SPIM для класса по «компьютерной организации».
Не уверен, что эта книга будет работать, но, возможно, стоит попробовать. Мы использовали «книгу» (больше похожую на учебник, а на самом деле шпаргалку), написанную профессором, поэтому в противном случае она недоступна.