Лабораторная работа №1
.doc
Липецкий государственный технический университет
Кафедра автоматизированных систем управления
ЛАБОРАТОРНАЯ РАБОТА №1
по Организации ЭВМ
Архитектура фон Неймана. Основные принципы устройства и работы ЭВМ
|
Студент |
|
|
|
Ключанских А.С |
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
АС-10 |
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
|
|
||||||||
|
ассистент |
|
|
|
Болдырихин О.В. |
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2013
Цель работы
Цель работы — изучение основ устройства и принципов работы компьютера фон-неймановской архитектуры.
Вариант 23
Нахождение в массиве всех элементов, не больших заданного.
Экспериментальные результаты
Программа на языке C
#include<stdio.h>
#include<conio.h>
#include<locale.h>
void main()
{
setlocale( LC_ALL,"Russian" );
int i, a[5]={3,4,2,5,7};
int x=4;
int k=0;
printf("Исходный массив: ");
for(i=0;i<5;i++)
{
printf("%d ",a[i]);
}
printf("\n\nЗаданное число: %d\n\n",x);
printf("Число элементов, не больших заданного числа %d:",x);
for(i=0;i<5;i++)
{
if(a[i]<=x)
{
k++;
}
}
printf(" %d\n",k);
getch();
}
Программа на языке ассемблер
data segment
arr dw 3, 4, 2, 7
data ends
code segment
x dw 4
assume cs:code, ds:data
begin:
mov ax, data
mov ds, ax
mov bx, offset arr
mov cx, 4
cycle:
mov ax, [bx]
cmp ax, x
ja metka
inc dx
metka:
add bx,2
loop cycle
mov ax, 4C00h
int 21h
code ends
end begin
Машинный код программы
1 0000 data segment
2 0000 0003 0004 0002 0007 arr dw 3, 4, 2, 7
3 0008 data ends
4 0000 code segment
5 0000 0004 x dw 4
6 assume cs:code, ds:data
7 0002 begin:
8 0002 B8 0000s mov ax, data
9 0005 8E D8 mov ds, ax
10 0007 BB 0000r mov bx, offset arr
11 000A B9 0004 mov cx, 4
12 000D cycle:
13 000D 8B 07 mov ax, [bx]
14 000F 2E: 3B 06 0000r cmp ax, x
15 0014 77 01 ja metka
16 0016 42 inc dx
17 0017 metka:
18 0017 83 C3 02 add bx,2
19 001A E2 F1 loop cycle
20 001C B8 4C00 mov ax, 4C00h
21 001F CD 21 int 21h
22 0021 code ends
23 end begin
Обработка и анализ результатов работы
Таблица состояния системы после выполнения каждой команды программы
№ |
Адрес (IP) |
Команда на машинном языке |
Команда на языке ассемблера |
Регистр команд |
Регистры |
1 |
0005 |
8ED8 |
mov ds,ax |
8E |
ax=1033 bx=0000 cx=0000 dx=0000 si=0000 di=0000 bp=0000 sp=0000 ds=1023 es=1023 ss=1033 cs=1034 ip=0005 |
2 |
0007 |
BB0000 |
mov bx,0000 |
BB |
ax=1033 bx=0000 cx=0000 dx=0000 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0007 |
3 |
0009 |
B90500 |
mov cx,0005 |
B9 |
ax=1033 bx=0000 cx=0000 dx=0000 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=000А |
4 |
000D |
8B07 |
mov ax,[bx] |
8B |
ax=1033 bx=0000 cx=0005 dx=0000 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=000D |
5 |
000F |
2E3B060000 |
cmp ax,cs:[0000] |
2E |
ax=0003 bx=0000 cx=0005 dx=0000 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=000F |
6 |
0014 |
7701 |
ja 0017 |
77 |
ax=0003 bx=0000 cx=0005 dx=0000 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0014 |
7 |
0016 |
42 |
inc dx |
42 |
ax=0003 bx=0000 cx=0005 dx=0000 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0016 |
8 |
0017 |
83C302 |
add bx, 0002 |
83 |
ax=0003 bx=0000 cx=0005 dx=0001 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0017 |
9 |
001A |
E2F1 |
loop 000D |
E2 |
ax=0003 bx=0002 cx=0005 dx=0001 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=001A |
10 |
000D |
8B07 |
mov ax, [bx] |
8B |
ax=0003 bx=0002 cx=0004 dx=0001 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=000D |
11 |
000F |
2E3B060000 |
cmp ax, cs:[0000] |
2E |
ax=0004 bx=0002 cx=0004 dx=0001 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=000F |
12 |
0014 |
7701 |
ja 0017 |
77 |
ax=0004 bx=0002 cx=0004 dx=0001 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0014 |
13 |
0016 |
42 |
inc dx |
42 |
ax=0004 bx=0002 cx=0004 dx=0001 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0016 |
14 |
0017 |
83C302 |
add bx, 0002 |
83 |
ax=0004 bx=0002 cx=0004 dx=0002 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0017 |
15 |
001A |
E2F1 |
loop 000D |
E2 |
ax=0004 bx=0004 cx=0004 dx=0002 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=001A |
16 |
000D |
8B07 |
mov ax,[bx] |
8B |
ax=0004 bx=0004 cx=0003 dx=0002 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=000D |
17 |
000F |
2E3B060000 |
cmp ax, cs:[0000] |
2E |
ax=0002 bx=0004 cx=0003 dx=0002 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=000F |
18 |
0014 |
7701 |
ja 0017 |
77 |
ax=0002 bx=0004 cx=0003 dx=0002 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0014 |
19 |
0016 |
42 |
inc dx |
42 |
ax=0002 bx=0004 cx=0003 dx=0002 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0016 |
20 |
0017 |
83C302 |
add bx, 0002 |
83 |
ax=0002 bx=0004 cx=0003 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0017 |
21 |
001A |
E2F1 |
loop 000D |
E2 |
ax=0002 bx=0006 cx=0003 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=001A |
22 |
000D |
8B07 |
mov ax,[bx] |
8B |
ax=0002 bx=0006 cx=0002 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=000D |
23 |
000F |
2E3B060000 |
cmp ax,cs:[0000] |
2E |
ax=0007 bx=0006 cx=0002 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=000F |
24 |
0014 |
7701 |
ja 0017 |
77 |
ax=0007 bx=0006 cx=0002 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0014 |
25 |
0017 |
83C302 |
add bx, 0002 |
83 |
ax=0007 bx=0006 cx=0002 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0017 |
26 |
001A |
E2F1 |
loop 000D |
E2 |
ax=0007 bx=0008 cx=0002 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=001A |
27 |
000D |
8B07 |
mov ax,[bx] |
8B |
ax=0007 bx=0008 cx=0001 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=000D |
28 |
000F |
2E3B060000 |
cmp ax,cs:[0000] |
2E |
ax=0005 bx=0008 cx=0001 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=000F |
29 |
0014 |
7701 |
ja 0017 |
77 |
ax=0005 bx=0008 cx=0001 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0014 |
30 |
0017 |
83C302 |
add bx,0002 |
83 |
ax=0005 bx=0008 cx=0001 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=0017 |
31 |
001A |
E2F1 |
loop 000D |
E2 |
ax=0005 bx=000A cx=0001 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=001A |
32 |
001C |
B8004C |
mov ax,4C00 |
B8 |
ax=0005 bx=000A cx=0000 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=001C |
33 |
001F |
CD21 |
int 21 |
CD |
ax=4C00 bx=000A cx=0000 dx=0003 si=0000 di=0000 bp=0000 sp=0000 ds=1033 es=1023 ss=1033 cs=1034 ip=001F |
Вывод
В данной лабораторной работе я написал программу для нахождения в массиве всех элементов, меньших или равных заданному числу. В ней я объявил переменные двумя способами – в сегменте данных и в сегменте кода.
Так же для работы с массивом были использованы команды mov bx, offset arr для получения исполнительного (эффективного) адреса массива и mov ax,[bx] для загрузки в регистр aх элементов массива, что означает пересылку в аккумулятор содержимого ячейки памяти с адресом, находящимся в регистре bx. Так же выяснил что все, что заключено в квадратные скобки, интерпретируется Турбо Ассемблером как адрес.
Суть программы заключается в поэлементном сравнении всех элементов массива с заданным числом. Результат заносится в регистр dx. Для повторных сравнений я использовал команду loop, предварительно занес количество элементов массива в регистр cx, который будет указывать на количество повторений тела цикла. По достижению команды loop, содержимое регистра cx автоматически уменьшается на 1. Пока содержимое регистра cx не равно нулю, управление передается на метку, указанную в операнде. В противном случае управление передается на следующую после loop команду, а именно add bx,2 что означает переход к следующему элементу массива.
Также я выяснил, что если операнд находится в команде, то он следует "непосредственно" за кодом операции. Такая адресация называется непосредственной. Пример — команды передачи непосредственных данных в регистр. В моей программе этому соответствует команда mov cx,4.
Если операнд находится в памяти данных, то указать его местоположение можно двумя способами.
-
поместить его адрес в команду. Такая адресация называется прямой.
-
поместить его адрес в регистр процессора. Такая адресация называется косвенной или косвенно-регистровой.
В моей программе этому соответствует команда mov aх,[bx].