2014-10-20 3 views
-1

Перед тем, как я узнал немного Ассамблеи, вы слышали, что вам нужно «запрограммировать непосредственно на аппаратное обеспечение», «мне пришлось делать все с нуля». Например, чтобы написать персонаж без операционной системы, я подумал, что мне нужно будет знать, как работает мой монитор и пишут пиксель за символом.Что существует в рамках Ассамблеи?

Так что мне стало интересно, и я немногому учусь. И я видел, что это было не так «близко к металлу». Затем хотел, чтобы кто-то объяснил мне, как это работает, и если можно пойти глубже и действительно контролировать все оборудование.

Вот код, который печатает символ:

[BITS 16] 
[ORG 0x7C00] 

MOV AL, 65 
CALL PrintCharacter 
JMP $ 

PrintCharacter: 

MOV AH, 0x0E 
MOV BH, 0x00 
MOV BL, 0x07 

INT 0x10 
RET 

TIMES 510 - ($ - $$) db 0 
DW 0xAA55 
+2

Этот код использует службы BIOS через прерывание 0x10. Таким образом, код, который действительно обеспечивает прямой доступ к аппаратным средствам, был написан вашим поставщиком BIOS. Как показывает этот пример, при использовании сборки вам не нужно напрямую программировать аппаратное обеспечение *, вы можете использовать любые службы, отключающие вашу среду (например, прерывания BIOS или системные вызовы ОС). – Jester

+0

Возможно, с помощью DOSBOX вы все равно хотите использовать службу BIOS 0x10 для входа в режим VGA. В режиме VGA 0x0D диапазон адресов от A000: 0000 до A000: f9ff будет содержать палитры данных пикселей. Или в текстовом режиме следующие 2000 байт, начиная с B800: 0000, позволят написание символа IBM ASCII и его цветового кода на экране как можно более непосредственно. –

+1

Программирование «Монтаж» и «Голый металл» несколько связано, но отнюдь не эквивалентно. Можно использовать код в сборке, используя операционные системы и библиотеки пользовательского пространства. Напротив, многоголосного кода не написано в сборке. – EOF

ответ

3

Ниже, чем ассемблер машинный код.

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

В ранние времена вычислений были компьютеры, где вам приходилось вводить машинный код напрямую. Митса Altair 680b является одним из примеров для такого компьютера:

У него было много переключателей на передней панели, которые позволяли вам изменять содержимое ОЗУ без (!) С использованием CPU: CPU был остановлен, когда были использованы переключатели на передней панели. Вам пришлось перевести код ассемблера в двоичный код и загрузить программу в ОЗУ таким образом. Затем вы запустили CPU.

Позже был выпущен компьютер KIM-1 (как говорят, первый доступный компьютер для любителей). Этот компьютер разрешил вводить машинный код в виде шестнадцатеричного кода, но в отличие от компьютера Митса программа, работающая в фоновом режиме (что означает: ЦП), отвечала за запись данных, введенных клавиатурой в ОЗУ.

Теоретически по-прежнему можно вводить программы Windows в шестнадцатеричном коде (с использованием шестнадцатеричного редактора), который вы хотите. Однако это не принесет пользы по сравнению с кодом ассемблера!

+0

Но сегодня, что мне нужно сделать, чтобы напрямую общаться с оборудованием моего монитора? Я рисую пиксель за пикселем без перерывов, которые делают это для меня? – dromenox

+2

Удовлетворительный факт: иногда сборка не 1: 1 для машинного кода. Например, на x86 вы можете кодировать некоторые команды, такие как 'mov eax, ebx' двумя разными способами для машинного кода. – Jester

+0

В MIPS и в режиме ARM в режиме Thumb, команды сборки и инструкции наиболее определенно не 1-к-1. Тем не менее, специально для прямого вывода пикселей на монитор, вы используете аппаратные устройства VGA через порты ввода/вывода и фреймбуфер на A000: 0000. Читайте на VGA: http://www.osdever.net/FreeVGA/vga/vga.htm –