2012-05-06 3 views
1

У меня возникли проблемы с поиском подходящего места для начала обучения. Я нашел много противоречивой информации в Интернете о том, что такое сборка, какие ассемблеры использовать, что такое ассемблер, и есть ли один «основной» язык ассемблера, выпущенный Intel для их конкретных семейств процессоров (у меня есть интеллект x86, так что я хочу изучить сборку для).Проблемы с разъяснением фундаментальных идей о том, что такое сборка

Не могли бы вы объяснить объяснения вышеупомянутых проблем. Из того, что я слышал, Intel выпускает семейства процессоров (например, x86) с набором команд/ссылкой, а различные программы Assembler (MASM, FASM, NASM и т. Д.) Обеспечивают более высокий уровень удобочитаемого языка, который используется для создания машинный код.

Кроме того, из того, что я слышал, когда кто-то говорит «язык ассемблера», это на самом деле относится к одному из многих разных стилей языков ассемблера, предоставляемых множеством разных ассемблеров. http://en.wikipedia.org/wiki/X86_assembly_language#Examples MASM сборки стиль против стиля NASM сборки

То, что я искал это «первый» ассемблер, без изменений, что MASM, NASM и т.д. предложение (например, крупные библиотеки макросов). Все эти сборщики, должно быть, пришли откуда-то, и это то, что я ищу.

В принципе, я ищу первый ассемблер/ассемблер x86, до MASM, NASM и т. Д. Может ли кто-нибудь предоставить мне ссылку на этот первый ассемблер?

BTW, в случае, если вся моя логика о сборке неверна, может кто-то прояснить!

Спасибо заранее,

Prgrmr

+1

Nasm вероятно, лучший выбор, похожий на первый язык ассемблера x86. Для использования реальных/оригинальных инструментов будет использоваться dosbox или какой-либо другой эмулятор dos. –

+0

Оригинальный язык ассемблера принадлежит поставщику чипов http://www.amazon.com/Manual -Programmers-Hardware-Reference-240487-001/dp/1555120814/ref = sr_1_1? Ie = UTF8 & qid = 1336368311 & sr = 8-1 вы должны уметь видеть, что он неполный, пробелы, заполненные различными ассемблерами, однако они хотели –

ответ

4

Чтобы быть педантичным, реальный язык, который вы будете использовать, чтобы поговорить с процессором напрямую machine code. Это означало бы вычисление фактических значений байтов , которые должны использоваться для определенных инструкций. Это, очевидно, слишком утомительно и подвержено ошибкам, поэтому люди используют ассемблер вместо этого. Ассемблер преобразует текстовое представление машинного кода в сам машинный код и заботится о различных подробных деталях, таких как вычисление относительных адресов и т. Д.

Для конкретного машинного кода может быть множество различных сборщиков, каждый из которых имеет их собственное представление о том, как сборка должна быть написана. Это особенно справедливо для процессоров x86 - в широком смысле, существуют два стиля: Intel и AT & Т. И тогда в них разные ассемблеры могут иметь разные наборы макросов и директив и т. Д.

Чтобы проиллюстрировать, вот пример сборки генерируется из некоторого кода C с gcc -S -masm=intel:

cmp  eax, ebx 
    jl  .L63 
    mov  eax, DWORD PTR inbuffd 
    mov  DWORD PTR [esp+8], 8192 
    mov  DWORD PTR [esp+4], OFFSET FLAT:inbuf 
    mov  DWORD PTR [esp], eax 
    call read 
    cmp  eax, -1 
    mov  ebx, eax 
    mov  DWORD PTR inbytes, eax 
    je  .L64 
    test eax, eax 
    je  .L36 
    mov  eax, 1 
    xor  edx, edx 
    jmp  .L33 

И здесь тот же фрагмент кода генерируется с gcc -S -masm=att:

cmpl %ebx, %eax 
    jl  .L63 
    movl inbuffd, %eax 
    movl $8192, 8(%esp) 
    movl $inbuf, 4(%esp) 
    movl %eax, (%esp) 
    call read 
    cmpl $-1, %eax 
    movl %eax, %ebx 
    movl %eax, inbytes 
    je  .L64 
    testl %eax, %eax 
    je  .L36 
    movl $1, %eax 
    xorl %edx, %edx 
    jmp  .L33 

Эти два фрагмента производить тот же машинный код - разница только в синтаксисе сборки. Обратите внимание, в частности, на то, как порядок аргументов различен (Intel назначается первым, AT & T является исходным), небольшие различия в названиях команд, использование % для указания регистров в AT & T и т. Д.

И тогда есть разные ЦП. ЦП имеет определенную архитектуру . Это означает, что он выполнит набор команд для этой архитектуры. Для этой архитектуры будет основной набор команд и, возможно, дополнительные группы инструкций для расширенных функций или специальных приложений. x86 - прекрасный пример. У вас есть инструкции с плавающей запятой, MMx, 3DNow! и SSE с 1 по 5. Различные процессоры этой архитектуры могут или не могут понять дополнительные инструкции; обычно есть какой-то способ спросить CPU о том, что он поддерживает.

Когда вы говорите «сборка x86», что люди понимают, что вы имеете в виду, это «сборка, которая будет работать на любом процессоре архитектуры x86».

Более сложные процессоры, особенно с управлением памятью (включая x86), выполняют больше, чем просто выполняют инструкции. Начиная с 80286, архитектура x86 имеет два основных режима: реальный режим и защищенный режим. Набор команд может использоваться как-либо в любом режиме, но способ работы памяти в каждом режиме настолько совершенно другой, что нецелесообразно пытаться писать код реального мира, который будет работать в любом режиме.

Более поздние процессоры представили больше режимов. В 386 введен режим aka v86, позволяющий операционной системе защищенного режима запускать программу реального режима без фактического переключения CPU в реальном режиме. Процессоры AMD64 используют 64-разрядный код в long mode.

ЦПУ может поддерживать несколько архитектур: Itanium architecture считается отдельной архитектурой, а все процессоры, выпущенные Intel, которые поддерживают Itanium, также поддерживают x86, с возможностью переключения между ними.

Семейство x86, вероятно, слишком сложный пример языка ассемблера - он имеет terribly long and complex history going back 33+ years. Машинный код для основных инструкций, используемых в (32-разрядных) приложениях, такой же, как и для 8086, выпущенного в 1978 году. Он прошел через несколько изменений, each adding more instructions.

Если вы хотите узнать сборку x86 правильно, рассмотрим:

  • The Art of Assembly Language Programming и имел издание для каждого из DOS, Windows и Linux. В версиях Windows и Linux используется язык, изобретенный автором под названием High Level Assembly или HLA, который похож на сборку x86, но не на самом деле. Это может быть или не быть вашей чашкой чая - это не строго реальная сборка, но концепции все там, и научиться писать надлежащую сборку впоследствии не будет большим усилием. К чести, он также содержит много материалов, связанных с сборкой, например. информацию о архитектуре процессора, BIOS, видео и т. д. Версия DOS преподает прямое собрание MASM (Intel).

  • Programming from the Ground Up учит AT & сборки T стиль в Linux

Для реальных монтажников (бесплатные), попробуйте MASM32 (Intel стиль) на окнах, или as на Linux. Как это бывает, Linux as соберет либо Intel, либо AT & T стиль сборки.

Если вы чувствуете себя обескураженными архитектурой x86 и готовы изучать сборку для какой-либо другой архитектуры, подумайте, начиная с somethingsmaller.

+0

Спасибо за разъяснение. Я установил набор инструкций для 32-разрядных процессоров Intel x86 на веб-сайте Intel. Как бы я хотел получить сборщик, который recog и может скомпилировать эти инструкции? Благодарю. – Progrmr

+0

Я загрузил Art of Assembly, и я просто понял, что использует HLA (???), а не обычный сборщик/ассемблер.Существуют ли другие книги, которые используют ассемблер с языком ассемблера? – Progrmr

+0

Я посмотрю вокруг. –

0

Не знаю, что такое ядро ​​сборщика. Каждый из них имеет свой диалект. Также вам, вероятно, стоит подумать о том, какую ОС вы хотите написать код, прежде чем выбрать.

Это, кажется, хорошая статья, которая может помочь выбрать Wich один, чтобы начать с: http://webster.cs.ucr.edu/AsmTools/WhichAsm.html

0

трудно добавить к Майкл Slades ответ, но у меня есть несколько замечаний.

Каждый производитель процессора или создатель машинного кода процессора делает это, используя мнемонику, язык ассемблера для этого процессора. Обычно это сборка, определенная в исходной документации процессора, будь то на салфетке за обедом или очень формальный и красивый документ - это «оригинальный» язык ассемблера для этого процессора. Ассемблер (свободные термины здесь, поскольку их можно понять по-разному, здесь используется как программа, которая анализирует язык ассемблера и в идеале делает машинный код) записывается для чтения этого языка ассемблера с дополнительными элементами, необходимыми для правильного кодирования кода, а также некоторые директивы и т. д., чтобы упростить работу программистов (макросы, equates (определяет) и т. д.).

В идеале, если вы создаете новый процессор и хотите получить какое-либо признание, вам сначала нужно ассемблер, а затем другие другие языки (FORTRAN, BASIC, Pascal, C, в настоящее время) (C всегда но, очевидно, сегодня вам не нужен Pascal или базовый и т. д.). Если поставщик процессоров хочет продавать чипы, он должен сделать или договориться или каким-то образом способствовать ассемблеру как минимум. Что касается 8088/8086, то у Intel были свои собственные инструменты, но в то время они были дорогими, а другие инструменты были более популярными (microsoft masm, msvc, borland tasm, pascal, tcc, bcc). Был хороший бесплатный ассемблер, называемый a86, если я правильно помню. Теперь у нас есть nasm как пример хорошего бесплатного ассемблера для x86.

Intel x86 является скорее исключением, чем правило, существует религиозная дискуссия между синтаксисом intel, который ближе к оригиналу и синтаксису AT & T. gnu binutils имеет тенденцию не уважать производителей процессоров (я бы назвал использование слова неуважением лично), внося изменения, x86 является самым худшим, поскольку AT & T является стандартным, но также поддерживает Intel (некоторые, возможно, все) их инструменты (другие языки). Ассемблеры в течение длительного времени, например, использовали точку с запятой ';' чтобы отметить конец строки и что-нибудь после комментария, для ARM, безусловно, binutils считает, что новая строка, новая инструкция и использует @ в качестве маркера комментария. Понял, что это лица, которые составляют бэкэнды, иногда эти люди сами являются поставщиками чипов. Я понимаю, что это не одна организованная группа, которая делает это, один человек или группа выполняет начальную работу, остальные, если они ее принимают, возьмите рабочий материал и опираясь на него.

Как и символ комментария, с течением времени сборщики для разных процессоров использовали аналогичные или одни и те же директивы, дополнительные токены, которые не являются машинным кодом, но, например, ORG или .ORG указывают адрес. Так как вам нужно время от времени иметь физический адрес, где код машины живет для кодирования инструкции, пользователь должен каким-то образом указать этот адрес и обратно в тот же день, когда вы писали одну программу asm, возможно, в одном файле или один файл с включенными и выход ассемблера был полным двоичным кодом, а не неполным объектом, вам нужен этот адрес. Вот почему вы не видите инструкции ORG в ассемблере gnu (газ), ассемблер gnu создает объекты, оставляющие неполные адреса конкретными инструкциями. как из-за необходимости адреса, так и из-за необходимости связывать его с неизвестными ярлыками. Компонент частично является ассемблером, так как он выполняет последние шаги по кодированию этих оставшихся инструкций, но этого не делает, беря исходный код ассемблера ascii, но использует данные в формате объектного файла.

x86 - это абсолютно последний ассемблерный язык, который я бы порекомендовал вам.Это интересный исторический урок. процессоры так сильно изменились, что на каждом шаге они стали очень быстро микрокодированными (большинство процессоров НЕ микрокодировано, x86 из-за его уродливой сборки/машинного языка почти требовало от него конкуренции). У меня есть язык ассемблера, который я создал, чтобы помочь изучать язык ассемблера, он заимствует различные наборы инструкций. У меня есть серия уроков, которые, возможно, занимают всего полчаса, чтобы пройти, если не меньше, все бесплатное, с открытым исходным кодом, очень простой код (симулятор набора инструкций, сборщик, дизассемблер и т. Д.). http://github.com/dwelch67/lsasim Обратите внимание, что моя слабая попытка использовать компилятор C компилятора не стоит возиться с ним, хотя я все же считаю, что vbcc является очень хорошим компилятором C, с помощью которого вы научитесь писать бэкэнд для gcc и llvm - кошмары, gcc, потому что, как только вы увидите внутренне вы не сможете стереть это изображение из своего ума, потому что документация ужасно устарела и вводит в заблуждение, и вам нужно идти строго из источников, несмотря на то, что, думая, когда вы начнете проект, это будет так же просто, как показывает веб-страница.

В github У меня также есть несколько других симуляторов набора инструкций, все, что лучше, лучше, чем x86 для обучения. msp430, avriss (simavr, вероятно, лучше), даже Lattice Semiconductors mico8. thumbulator является основным, набор инструкций большого пальца руки (сокращенный набор инструкций), что вы найдете gnu, clang и другие компиляторы и ассемблеры, которые будут строить рабочий код. (первоначально написанный для сравнения gcc и clang). Затем некоторые базирующиеся на ядре amber_samples - это arm2, в то время как предшественник в руке, который, как мы знаем, доминирует сегодня в мире процессоров, у него есть некоторые странные вещи, которые не находятся в armv4 до настоящего времени. Все еще можно использовать инструменты полки для генерации кода, который запускается, и это логический симулятор, чтобы вы могли видеть внутри чипа (все бесплатные инструменты). Я портировал процессор mips, а также в форме логического симулятора, я не рекомендую mips в качестве первого набора команд, сначала возьмите несколько под вашим поясом и игнорируйте такие вещи, как слово unsigned, связанное с добавлением команды, очень вводящее в заблуждение и запутывающее, если вы не испытываете. наконец, я разветвил pcemu для образования x86. Я рекомендую получить старое оригинальное справочное руководство по программированию 8088/8086 от Intel, хорошие копии можно использовать с amazon.com за несколько долларов. Я также удалил вызовы bios и dos из этого pcemu, поскольку это не изучает набор команд, который изучает операционную систему/среду. Изучите один, а затем другой. реальные среды pcemu могут быть альтернативными или dosbox и т. д., если вы хотите делать эти вещи. Оттуда вы можете почувствовать базовую линию x86, а затем добавить уровни сложности, которые следуют, когда появятся 80286 и 386 и т. Д.

Наличие x86 не является веской причиной для изучения x86. Вы хотите изучить набор инструкций, где у вас есть инструменты, которые могут входить в процессор. Конечно, с помощью отладчика вы можете сделать один шаг, но с симулятором, который вы можете манипулировать, чтобы выводить что-либо, смотреть что угодно любым способом, или даже лучше логический симулятор, где вы можете видеть все сразу, собирается сделать опыт изучение языка обучения гораздо менее болезненным. Меньше боли означает, что вы должны наслаждаться им больше и придерживаться его, а не сдаваться. Хотя базовые навыки программирования требуются, как и на любом языке, сборка позволяет вам быстро и легко попасть в проблему. Также вы не хотите разбивать компьютер или что-то в этом роде. (здесь снова, если вы доберетесь до того, где чувствуете, что вам нужно сделать системные вызовы из asm, используйте что-то вроде pcemu, dosbox, позже virtualbox, vmware, qemu для запуска виртуальной машины, которая при сбое причиняет вам меньше боли.

+0

Я пошел по вашей ссылке, и я не смог найти точку загрузки, чтобы загрузить ваш ассемблер. Не могли бы вы показать мне, где это сделать? – Progrmr

+0

lsa-as.c, часть урока 1 из LEARNASM.txt предназначена для компиляции симулятора и ассемблера lsa-sim.c и lsa-as.c. –

Смежные вопросы