Архитектура ЭВМ и систем

Электронно-вычислительные машины (ЭВМ), или, как их теперь чаще называют, компьютеры, — одно из самых удивительных творений человека. В узком смысле ЭВМ — это приспособления, выполняющие разного рода вычисления или облегчающие этот процесс. Простейшие устройства, служащие подобным целям, появились в глубокой древности, несколько тысячелетий назад. По мере развития человеческой цивилизации они медленно эвоционировали, непрерывно совершенствуясь. Однако только в 40-е годы нашего столетия было положено начало созданию компьютеров современной архитектуры и с современной логикой. Именно эти годы можно по праву считать временем рождения современных вычислительных машин.

В своем историческом докладе, опубликованном в 1945 году, Джон фон Нейман выделил и детально описал пять ключевых компонентов того, что ныне называют » архитектурой фон Неймана » современного компьютера.

Чтобы компьютер был и эффективным, и универсальным инструментом, он должен включать следующие структуры: центральное арифметико-логическое устройство (АЛУ), центральное устройство управления (УУ), » дирижирующее » операциями, запоминающее устройство, или память, а также устройства ввода-вывода информации.

Фон Нейман отмечал, что эта система должна работать с двоичными числами, быть электронным, а не механическим устройством и выполнять операции последовательно, одну за другой.

Принципы, сформированные фон Нейманом, стали общепринятыми и положены в основу как больших ЭВМ первых поколений, так и более поздних мини- и микро-ЭВМ. И хотя в последнее время идут активные поиски вычислительных машин, построенных на принципах, отличных от классических, большинство компьютеров построено согласно принципам, определенным Нейманом.

Основная часть

Для прямого использования возможностей и особенностей конкретной вычислительной системы необходимо применять низкоуровневое программирование. Это язык программирования близкий к программированию непосредственно в машинных кодах используемого реального или виртуального (например, Java, Microsoft .NET) процессора. Для обозначения машинных команд обычно применяется мнемоническое обозначение. Это позволяет запоминать команды не в виде последовательности двоичных нулей и единиц, а в виде осмысленных сокращений слов человеческого языка (обычно английских).

Для того чтобы писать программы на этом уровне, необходимо знать архитектуру аппаратной части системы:

  • структуру и функционирование системы в целом;
  • организацию оперативной памяти;
  • состав внешних устройств, их адреса и форматы регистров;
  • организацию и функционирование процессора,
  • состав и форматы его регистров, способы адресации,
  • систему команд;
  • систему прерываний и т. д.

При этом не следует забывать, что вычислительная система – это совокупность не только аппаратных, но и программных средств, и особенности имеющегося программного обеспечения (операционной системы) оказывают существенное влияние на разработку программ.

В истории развития программирования существовали три разновидности низкоуровневых языков, последовательно сменивших друг друга:

  • машинный код;
  • мнемокод;
  • ассемблер.

В машинных кодах программа представляется в виде последовательности чисел, являющихся кодами команд процессора, адресами оперативной памяти, номерами регистров процессора и внешних устройств и т. д. Фрагмент последовательности кодов команд микропроцессора Intel 8086 для добавления двухбайтового слова с адресом 36 к слову с адресом 32:

Адрес

Код

0000 A1

0001 20

Очевидно, что в таком виде создание сколько-нибудь сложной программы является весьма трудной задачей. Для решения этой задачи были разработаны так называемые мнемокоды, которые и явились основой для современных ассемблеров. Они вместо чисел позволяли использовать мнемонические (символьные) имена, отражающие смысл выполняемой команды. Приведенная выше последовательность команд в мнемонической записи:

Mov ax ,ds:[32]

Add ax,ds:[36]

Mov ds:[32],ax

В этом фрагменте уже виден смысл команд, из которых складывается сложение двух слов памяти. Ассемблер отличается от своего предшественника – мнемокода обширным набором директив транслятора, существенно упрощающих процесс кодирования программы, в первую очередь директивами оформления программы в виде логически законченных элементов и макросредствами.

В наших лабораторных работах будет использоваться язык программирования – ассемблер. Ассемблер — компилятор с языка ассемблера в команды машинного языка. На сегодняшний день ассемблер как язык программирования, предназначенный для создания программ, используется крайне редко. Это связано с тем, что этот процесс является чрезвычайно трудоемким и получающиеся программы являются системно-зависимыми, их нельзя свободно переносить между компьютерами, имеющими различные аппаратные архитектуры и операционные системы. Поэтому на сегодняшний день ассемблер изучают в учебных целях, так, как только он дает полное представление о реальном устройстве и функционировании аппаратуры и операционной системы. Сейчас разработка программ на ассемблере применяется в основном в программировании небольших микропроцессорных систем (микроконтроллеров), как правило, встраиваемых в какое-либо оборудование. Очень редко возникает потребность использования ассемблера в разрабатываемых программах в тех случаях, когда необходимо, например, получить наивысшую скорость выполнения определенного участка программы, выполнить операцию, которую невозможно реализовать средствами языков высокого уровня, либо уместить программу в память ограниченного объема (типичное требование для загрузчиков операционной системы). Под каждую архитектуру процессора и под каждую ОС или семейство ОС существует свой ассемблер.  Есть также так называемые кросс-ассемблеры, позволяющие на машинах с одной архитектурой (или в среде одной ОС) ассемблировать программы для другой целевой архитектуры или другой ОС и получать исполняемый код в формате, пригодном к исполнению на целевой архитектуре или в среде целевой ОС. Язык ассемблера— тип языка программирования низкого уровня. Команды языка ассемблера один в один соответствуют командам процессора и представляют собой удобную символьную форму записи (мнемокод) команд и аргументов. Язык ассемблера обеспечивает связывание частей программы и данных через метки, выполняемое при ассемблировании (для каждой метки).

Листинг программы

1) Hello world

text  segment ‘code’ ; начало описания сегмента команд

assume CS:text, DS:text ; начало инициализации сегментных регистров

begin:      ; метка начала программы

mov   ax,text     ; загрузка адресса сегмента команд в регистр ds через ax. из ax в ds

mov   ds,ax       ;

mov   ah,09h      ; загрузка номера функции для вывода текста на экран. 09 функция

mov   dx,offset message; загрузка переменной для вывода

int   21h   ; выполнение функции

mov   ah,4ch; загрузка номера функции выхода из программы

mov   al,00h      ; загрузка кода выхода. программа успешно завершена. код 0

int   21h         ; выполнение функции

message db ‘Hello world!$’; объявление переменной message. $-конец строки

text ends   ; конец описания сегмента команд

end begin; указание метки конца программы

 

2) управление курсором с помощью клавиатуры

text  segment ‘code’

assume CS:text, DS:data

 

cursor      proc              ; рисуется крестик

mov   cx,16       ; 16 точек для первой линии

mov   si,curx           ; загрузка координаты по х

line1:                        ; рисование горизонтальной линии

push  cx          ; сохранение счетчика

mov   ah,0ch            ; рисование точки

mov   al,color

mov   bh,0

mov   cx,si

sub   cx,8        ; курсор рисуется в цетре

mov   dx,cury

int   10h

inc   si          ; увелечение координаты на 1

pop   cx          ; восстановление счетчика

loop  line1

 

mov   cx,16

mov   si,cury

line2:                        ; рисование вертикальной линии

push  cx          ;сохранение счетчика

mov   ah,0ch

mov   al,color

mov   bh,0

mov   cx,curx

mov   dx,si

sub   dx,8

int   10h

inc   si          ;увеоичение на 1

pop   cx

loop  line2

ret

cursor      endp

 

main  proc

mov   ax,data

mov   ds,ax

 

mov   ah,00h

mov   al,10h

int   10h

 

mov   curx,600    ;установка начальных координат

mov   cury,300

call  cursor            ;вызов процидуры рисования курсора

readkey:

mov   ah,08h      ;считывает код нажатой клавиши

int   21h         ;запуск

cmp   al,4bh            ;стрелка в лево

je    left

cmp   al,4dh            ;стрелка вправо

je    right

cmp   al,48h      ;стрелка вверх

je    up

cmp   al,50h            ;стрелка вниз

je    down

cmp   al,27       ;нажатие эскейпа

jne   readkey           ;

exit:

mov   ah,00h

mov   al,03h

int   10h

mov   ax,4c00h

int   21h

left:

mov   color,0           ;черный цвет

call  cursor            ;вызов процед курсор

cmp   curx,8            ;сравниваем с 8

je    nocorr

dec   curx        ; уменьшаем на 1

nocorr:

mov   color,4

call  cursor            ; рисуется новый курсор

jmp   readkey

right:

mov   color,0           ;

call  cursor

cmp   curx,630    ; граничная координатаыы

je    nocorr

inc   curx        ; увелечение координаты

nocorr1:

mov   color,4

call  cursor

jmp   readkey

 

up:

mov   color,0

call  cursor

cmp   cury,8

je    nocorr2

dec   cury

nocorr2:

mov   color,4

call  cursor

jmp   readkey

down:

mov   color,0

call  cursor

cmp   cury,300

je    nocorr3

inc   cury

nocorr3:

mov   color,4

call  cursor

jmp   readkey

main  endp

text ends

 

data  segment

curx  dw ?

cury  dw ?

color db 4

data ends

 

stk   segment stack ‘stack’

dw 128 dup(0)

stk ends

end main

 

3) Рисование линии по заданным координатам

text  segment ‘code’

 

assume CS:text, DS:data

 

main:

mov   ax,data

mov   ds,ax

 

mov   ah,00h

mov   al,10h

int   10h

 

finit

fild  ix1

fild  dv

fdiv

fstp  x1

fild  ix2

fild  dv

fdiv

fstp  x2

fild  iy1

fild  dv

fdiv

fstp  y1

fild  iy2

fild  dv

fdiv

fstp  y1

fild  iy2

fild  dv

fdiv

fstp  y2

 

fld   x1

fld   y2

fmul

fld   x2

fld   y1

fmul

fsub

fld   x1

fld   x2

fsub

fdiv

fild  dv

fmul

fstp  b

 

fld   y1

fld   y2

fsub

fld   x1

fld   x2

fsub

fdiv

fstp  k

 

mov   ax,ix1

mov   bx,ix2

cmp   ax,bx

ja    l1

sub   bx,ax

mov   cycx,bx

jmp   cont

l1:

sub   ax,bx

mov   cycx,ax

cont:

mov   ax,iy1

mov   bx,iy2

cmp   ax,bx

ja    l2

sub   bx,ax

mov   cycy,bx

jmp   cont1

l2:

sub   ax,bx

mov   cycy,ax

cont1:

mov   ax,cycx

mov   bx,cycy

cmp   ax,bx

ja    l3

mov   cx,cycy

jmp   liney

l3:

mov   cx,cycx

linex:

push  cx

mov   ah,0ch

mov   al,4

mov   bh,0

mov   cx,ix1

 

fild  ix1

fld   k

fmul

fld   b

fadd

fabs

fistp ly

 

mov   dx,ly

int   10h

cmp   cx,ix2

ja    decc

inc   ix1

jmp   OK1

decc:

dec   ix1

OK1:

pop   cx

loop  linex

jmp   exit

liney:

push  cx

mov   ah,0ch

mov   al,4

mov   bh,0

 

fild  iy1

fld   b

fsub

fld   k

fdiv

fabs

fistp lx

 

mov   cx,lx

mov   dx,iy1

int   10h

cmp   dx,iy2

ja    decc1

inc   iy1

jmp   OK2

decc1:

dec   iy1

OK2:

pop   cx

loop  liney

exit:

mov   ah,08h

int   21h

mov   ah,00h

mov   al,04h

int   10h

mov   ax,4c00h

int   21h

text ends

 

data  segment

k     dd ?

b     dd ?

y1    dd ?

x1    dd ?

x2    dd ?

y2    dd ?

ix1   dw 600

iy1   dw 100

ix2   dw 120

iy2   dw 300

dv    dw 100

cycx  dw ?

cycy  dw ?

lx    dw ?

ly    dw ?

data ends

 

stk   segment     stack ‘stack’

dw 128 dup(0)

stk ends

end main

Читайте также:


Добавить комментарий