Ассемблер и программирование
Содержание
Задание 2
Блок-схема к заданию 1 3
ASM 1 4
Блок-схема к заданию 2 7
ASM 2 8
Блок-схема к заданию 3 11
ASM 3 12
Блок-схема к заданию 4 16
ASM 4 17
Блок-схема к заданию 5 19
ASM 5 20
Блок-схема к заданию 6 23
ASM 6 24
KOMP.CPP 26
Руководство пользователя 36
Список литературы 39
Задание
Информатика - курсовое задание, вариант 1
Три байтовые переменные A, B, и C содержат целые значения. Упорядочить эти значения по возрастанию так, чтобы A содержала минимальное значение, а С - максимальное.
Задан байтовый массив из N элементов в неупакованном BCD формате. Написать процедуру преобразования исходного массива
Задан байтовый массив из N элементов. Написать процедуру, отыскивающую: номер максимального и минимального элементов, а также разность между максимальным и минимальным элементами.
Написать процедуру нормализации значения, содержащегося в AX. Нормализация заключается в сдвиге содержимого AX влево до тех пор, пока старший из битов, имеющих значение 1, не попадет в 15-й разряд. Если же сразу (AX)=0 или 15-й разряд содержит 1, то процедура не должна выполняться. При выходе из процедуры регистр BX должен содержать число, равное количеству выполненных сдвигов.
Считая содержимое регистров DX:AX 32-битной величиной, написать программу, загружающую в регистр DL номер самого младшего бита, содержащего 1.
Индивидуальное задание: определить размер файла из DTA.
1. Блок-схема к заданию 1
2. ASM 1
mes macro msg
mov ah,9
lea dx,msg
int 21h
endm
abc macro char
add char,'0'
mov dl,char
mov ah,2
int 21h
sub> char,'0'
endm
d_seg segment
a db 5
b db 9
c db 3
str db 'Ishodnie dannie:',10,13,'$'
str2 db 'Resultat sortirovki po vozrastaniyu',10,13,'$'
str3 db 'Press any key.........$'
enter db 10,13,'$'
space db ' ','$'
strA db 'A=','$'
strB db 'B=','$'
strC db 'C=','$'
d_seg ends
c_seg segment
assume ds:d_seg,cs:c_seg
start:mov ax,d_seg
mov ds,ax
mes enter
mes str
mes enter
mes strA
abc a
mes space
mes strB
abc b
mes space
mes strC
abc c
mes enter
mov al,a
mov bl,b
mov cl,c
cmp al,bl
jl continue
xchg al,bl
continue:
cmp al,cl
jl continue2
xchg al,cl
continue2:
cmp bl,cl
jl continue3
xchg bl,cl
continue3:
mov a,al
mov b,bl
mov c,cl
mes enter
mes str2
mes enter
mes strA
abc a
mes space
mes strB
abc b
mes space
mes strC
abc c
mes enter
mes enter
mes str3
mov ah,1
int 21h
mov ah,4ch
int 21h
c_seg ends
end start
3. Блок-схема к заданию 2
4. ASM 2
mes macro msg
mov ah,9
lea dx,msg
int 21h
endm
dseg segment
k dw 10
mdb10
masdb1,3,6,8,9,1,4,7,2,3,7,9,4,5,8,9
str db 'Ishodnii massiv elementov v neupakovannom BCD formate:',10,13,'$'
str1 db 10,13,'Poluchenii massiv elementov v ypakovannom BCD formate:',10,13,'$'
str2 db 10,13,'Press any key.........',10,13,'$'
enter db 10,13,'$'
space db ' $'
dseg ends
cseg segment
assume cs:cseg, ds:dseg
vivod proc
xor cx,cx
k_del:
mov dx,0
div k
add dx,'0'
push dx
inc cx
cmp ax,0
jne k_del
k3:
pop dx
mov ah,2
int 21h
loop k3
ret
vivod endp
abcproc
xorsi,si
xordi,di
movbx,16
movcx,16
decbx
m2:
moval,mas[si]
mulm
incsi
addal,mas[si]
movmas[di],al
cmpsi,bx
jem1
incdi
incsi
loop m2
m1:
ret
abcendp
start:
movax,dseg
movds,ax
mes enter
mes str
mes enter
mov bx, 0
met2: mov al, mas[bx]
mov ah,0
call vivod
mes space
inc bx
cmp bx,15
jle met2
call abc
mes enter
mes str1
mes enter
mov bx, 0
met1: mov al, mas[bx]
mov ah,0
call vivod
mes space
inc bx
cmp bx,7
jle met1
mes enter
mes str2
mov ah,1
int 21h
movah, 4ch
int21h
cseg ends
end start
5. Блок-схема к заданию 3
6. ASM 3
char1 macro b
add b,'0'
mov dl,b
mov ah,2
int 21h
sub> b, '0'
endm
char macro a
xor dx, dx
mov ax, a
mov bx, 10
div bx
add dl,'0'
mov ah, 2
int 21h
endm
mes macro str
mov ah,9
lea dx,str
int 21h
endm
d_seg segment
mindb0
maxdb0
n_mindw1
n_maxdw1
razdb0
adb2,6,4,1,7,9,3
n=$-a
enter db 10,13,'$'
str db 10,13,'Ishodnii massiv: $'
str1 db 10,13,'Resultat: $'
str2 db 10,13,'Number min chisla: $'
str3 db 10,13,'Number max chisla: $'
str4 db 10,13,'Raznost mezhdu max i min chislami: $'
str5 db 10,13,'Press any key........$'
space db ' $'
d_seg ends
c_seg segment
assume cs:c_seg, ds:d_seg
start:
movax,d_seg
movds,ax
xorsi,si
moval,a[si]
movmin,al
movmax,al
incsi
m3:
moval,a[si]
cmpal,max
jlem1
movmax,al
movbx,si
incbx
movn_max,bx
m1:
cmpal,min
jgem2
movmin,al
movbx,si
incbx
movn_min,bx
m2:
incsi
cmpsi,n
jlm3
moval,max
sub>al,min
movraz,al
mes str
mes enter
xor si,si
povtor:
char1 a[si]
mes space
inc si
cmp si,n
jne povtor
mes enter
mes str1
mes enter
mes str2
char n_min
mes enter
mes str3
char n_max
mes enter
mes str4
char1 raz
mes enter
mes enter
mes str5
mov ah, 1
int 21h
movah,4ch
int21h
c_seg ends
end start
7. Блок-схема к заданию 4
8. ASM 4
mes macro str
mov ah,9
lea dx,str
int 21h
endm
dseg segment
str db 10,13,'AX soderzhit znachenie 2345h$'
str1 db 10,13,'Posle normalizacii znacheniya AX, BX soderzhit chislo vipolnenih sdvigov$' $'
str2 db 10,13,'BX = $'
str3 db 10,13,'Press any key........$'
enter db 10,13,'$'
x dw 2345h
dseg ends
cseg segment
assume cs:cseg, ds:dseg
start: mov ax,dseg
mov ds,ax
mov ax,x
push ax
xor dx, dx
cmp ax, dx
je exit
xor si, si
cont: mov cx, 2
mov dx, 1000000000000000b
mov bx, ax
or bx, dx
cmp bx, ax
je exit
inc si
shl ax, 1
loop cont
exit: mes str
mes enter
mes str1
mes enter
mes str2
mov bx,si
xor dx,dx
push bx
mov ax,bx
mov bx,10
div bx
add dx,'0'
mov ah,2
int 21h
pop ax
pop bx
mes enter
mes str3
mov ah,1
int 21h
mov ah, 4ch
int 21h
cseg ends
end start
9. Блок-схема к заданию 5
10. ASM 5
mes macro msg
mov ah,9
lea dx,msg
int 21h
endm
d_seg segment
k dw 10
str1 db 'Registr AX soderzhit 0110000b, a registr DX soderzhit 1000100b',10,13,'$'
str2 db 'Nomer samogo mladshego bita, soderzhaschego 1',10,13,'$'
str3 db 10,13,'Press any key......',10,13,'$'
enter db 10,13,'$'
d_seg ends
c_seg segment
assume ds:d_seg, cs:c_seg
vivod proc
xor cx,cx
k_del:
sub> dx,dx
div k
add dx,'0'
push dx
inc cx
cmp ax,0
jne k_del
k3:
pop dx
mov ah,2
int 21h
loop k3
ret
vivod endp
start:
mov ax, d_seg
mov ds, ax
mov ax, 0110000b
mov dx, 1000100b
nachalo:
clc
rcr ax, 1
inc bx
jc vivod1
cmp ax,0
jne nachalo
mov bx,7
m1:
clc
rcr dx, 1
inc bx
jc vivod1
cmp dx,0
jne m1
vivod1:
mes enter
mes str1
mes enter
mes str2
mes enter
mov dl, bl
mov ax, dx
call vivod
mes enter
mes str3
mov ah,1
int 21h
mov ah, 4ch
int 21h
c_seg ends
end start
11. Блок-схема к заданию 6
12. ASM 6
mes macro str
mov ah,9
lea dx,str
int 21h
endm
dseg segment
ten dw 10
filename db 8 dup(0)
dta db 2ch dup(' '),0,10,13,'$'
error db 10,13,'File not found',10,13,'$'
exit db 10,13,'Press any key........$'
inp db 'Input filename:',10,13,'$'
out1 db 10,13,10,13,'Size file in DTA:',10,13,10,13,'$'
out2 db 'FILE_NAME - $'
out3 db 'FILE_SIZE - $'
out4 db ' bytes',10,13,'$'
dseg ends
cseg segment
assume cs:cseg, ds:dseg
start: mov ax,dseg
mov ds,ax
mes inp
mov ah,1ah
lea dx,dta
int 21h
xor si,si
povtor: mov ah, 1
int 21h
cmp al, 13
je ok
mov filename[si], al
inc si
jmp povtor
ok:mov ah,4eh
lea dx,filename
mov cx,0
int 21h
jc err
mes out1
mes out2
mes dta[1eh]
mes out3
mov dx,word ptr dta[1ah]+2
mov ax,word ptr dta[1ah]
mov cx,0
jmp next
l1:mov dx,0
next:div ten
push dx
inc cx
cmp ax,0
jne l1
n: pop dx
add dx,'0'
mov ah,2
int 21h
loop n
mes out4
jmp quit
err:mes error
quit:mes exit
mov ah,1
int 21h
mov ah,4ch
int 21h
cseg ends
end start
13. KOMP.CPP
#include<graphics.h>
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
#include<bios.h>
#include<process.h>
void pomehi(int x, int y, int i)
{
setcolor(i);
line(x-100,y-60,x-80,y-60);
line(x-60,y-50,x-40,y-50);
line(x-20,y-60,x,y-60);
line(x+20,y-50,x+40,y-50);
line(x+60,y-60,x+80,y-60);
line(x-100,y-20,x-80,y-20);
line(x-60,y-10,x-40,y-10);
line(x-20,y-20,x,y-20);
line(x+20,y-10,x+40,y-10);
line(x+60,y-20,x+80,y-20);
line(x-100,y+20,x-80,y+20);
line(x-60,y+30,x-40,y+30);
line(x-20,y+20,x,y+20);
line(x+20,y+30,x+40,y+30);
line(x+60,y+20,x+80,y+20);
line(x-100,y+60,x-80,y+60);
line(x-60,y+70,x-40,y+70);
line(x-20,y+60,x,y+60);
line(x+20,y+70,x+40,y+70);
line(x+60,y+60,x+80,y+60);
}
void komp(int x, int y)
{
int i;
///////////////monitor////////////////
i=8;
setcolor(i);
rectangle(x-120, y-100, x+120, y+100);
setfillstyle(SOLID_FILL,i);
floodfill(x-115,y-95,i);
i=0;
setcolor(i);
rectangle(x-110, y-90, x+110, y+90);
setfillstyle(SOLID_FILL,i);
floodfill(x,y,i);
i=0;
setcolor(i);
line(x-120, y-100, x-110, y-110);
line(x+120, y+100, x+130, y+90);
line(x+120, y-100, x+130, y-110);
line(x-110, y-110, x+130, y-110);
line(x+130, y-110, x+130, y+90);
line(x+20, y+110, x+20, y+100);
line(x-20, y+110, x-20, y+100);
rectangle(x+60, y+110, x-60, y+120);
line(x+60, y+110, x+70, y+100);
line(x+60, y+120, x+80, y+100);
line(x-60, y+110, x-50, y+100);
line(x+20, y+110, x+30, y+100);
circle(x+110,y+95,3);
circle(x+100,y+95,2);
circle(x+90,y+95,2);
///////////////sistemnik//////////////
i=0;
setcolor(i);
rectangle(x-130, y+120, x-200, y-100);
line(x-200, y-100, x-110, y-190);
line(x-130, y-100, x-40, y-190);
line(x-110, y-190, x-40, y-190);
line(x-130, y+120, x-110, y+100);
line(x-40, y-190, x-40, y-110);
rectangle(x-190, y-90, x-140, y-80);
rectangle(x-190, y-70, x-140, y-60);
rectangle(x-190, y-50, x-140, y-40);
rectangle(x-190, y-30, x-140, y-20);
rectangle(x-180, y-10, x-150, y);
rectangle(x-180, y+10, x-150, y+20);
rectangle(x-190, y+100, x-140, y+110);
circle(x-165,y+80,5);
circle(x-165,y+60,4);
line(x-165,y+80,x-165,y+84);
circle(x-165,y+80,2);}
void kolonki(int x, int y, int i)
{int k;
//////////////left//////////////////
k=i;
i=15;
setfillstyle(INTERLEAVE_FILL,i);
i=k;
setcolor(i);
rectangle(x-210, y+120, x-260, y+60);
line(x-210, y+120, x-200, y+110);
line(x-210, y+60, x-200, y+50);
line(x-260, y+60, x-240, y+40);
line(x-240, y+40, x-200, y+40);
i=k;
setcolor(i);
pieslice(x-235, y+90, 0, 180, 20);
rectangle(x-255, y+90, x-215, y+110);
floodfill(x-245,y+95,i);
//////////////right/////////////////
rectangle(x+140, y+120, x+190, y+60);
line(x+190, y+120, x+210, y+100);
line(x+190, y+60, x+210, y+40);
line(x+140, y+60, x+160, y+40);
line(x+160, y+40, x+210, y+40);
line(x+210, y+100, x+210, y+40);
i=k;
setcolor(i);
pieslice(x+165, y+90, 0, 180, 20);
rectangle(x+145, y+90, x+185, y+110);
floodfill(x+155,y+95,i);
circle(x+165,y+115,4);
circle(x+155,y+115,3);
circle(x+175,y+115,3);
arc(x+165,y+40,0,150,40);
}
void main()
{int dr=DETECT,mod;
float snd[] = {659.26, 880.00, 1046.50, 987.77, 880.00, 1046.50, 880.00, 987.77, 880.00,
698.46, 783.99, 659.26, 659.26, 880.00, 1046.50, 987.77, 880.00, 1046.50, 880.00, 987.77, 880.00,
659.26, 622.25, 587.33, 587.33, 698.46, 880.00, 987.77, 587.33, 698.46,
830.61, 880.00, 440.00, 523.25, 698.46, 698.46, 659.26, 783.95, 698.46, 698.46,
659.26, 493.88, 523.25, 440.00, 987.77, 987.77, 932.33, 880.00, 987.77, 987.77,
880.00, 783.99, 698.46, 659.26, 659.26, 783.99, 659.26, 587.33, 587.33,
698.46, 587.33, 493.88} ;
int x,y,err,i,ki,key,r,h,c,x1,x2,y1,y2;
char s,str[80]={'K','U','R','S','O','V','A','Y','A',' ','R','A','B','O','T','A'};
initgraph(&dr,&mod," ");
err=graphresult();
if(err){
cout<<"error initgraph"<<grapherrormsg(err);
exit(1); }
snachala:
cleardevice();
i=7;
x=getmaxx()/2;
y=getmaxy()/2;
setfillstyle(SOLID_FILL,i);
floodfill(x,y,i);
setcolor(4);
outtextxy(400,70,"Press any key for STOP Music");
outtextxy(400,80,"Press 'P' for PLAY Music");
outtextxy(400,90,"Press 'M' for GOTO MENU");
outtextxy(400,100,"Press 'Esc' for exit");
settextstyle(0,0,3);
setcolor(2);
outtextxy(150,15,str);
settextstyle(0,0,2);
setcolor(6);
outtextxy(330,380,"KAFEDRA: EVM");
setcolor(5);
outtextxy(330,420,"SPECIALNOST: VMKSiS");
setcolor(4);
outtextxy(30,380,"VIPOLNIL:");
settextstyle(0,0,1);
setcolor(1);
outtextxy(180,380,"STUDENT FITU 1-2a");
settextstyle(0,0,1);
setcolor(0);
outtextxy(180,390,"XLINTCEV A.G.");
settextstyle(0,0,2);
setcolor(4);
outtextxy(30,420,"PROVERIL:");
settextstyle(0,0,1);
setcolor(1);
outtextxy(180,420,"KOLOMEICEVA T.G.");
settextstyle(0,0,1);
setcolor(0);
outtextxy(180,430,"BELIKOV I.Yu.");
komp(x,y); m1:
for(r=0;r<62;r++)
{
if (kbhit()) break;
i=15;
pomehi(x,y,i);
delay(100);
i=7;
kolonki(x,y,i);
i=0;
kolonki(x,y-10, i);
i=0;
pomehi(x,y,i);
delay(100);
sound(snd[r]/1.5);
if (r==11 ^ r==23 ^ r==27 ^ r==31 ^ r==43) { delay (1500); nosound (); delay (600); }
else if (r==53 ^ r==57 ^ r==61) { delay (300); nosound(); delay (1400); }
else if (r==47) { delay (500); nosound (); delay (700); }
else delay(50);
i=7;
kolonki(x,y-10,i);
i=0;
kolonki(x,y,i);
}
nosound();
setcolor(RED);
m:
s=getch();
if (s==27) exit(1);
if (s=='p') {setfillstyle(SOLID_FILL,0); floodfill(getmaxx()/2,getmaxy()/2,8); goto m1;}
if (s!='m') goto m;
cleardevice();
i=15;
setcolor(i);
setfillstyle(SOLID_FILL,i);
floodfill(x,y,i);
settextstyle(0,0,2);
setcolor(RED);
outtextxy(150,30,"MENU");
settextstyle(0,0,1);
setcolor(2);
outtextxy(20,100,"Zadanie po assembleru #1");
setcolor(3);
outtextxy(20,135,"Zadanie po assembleru #2");
setcolor(4);
outtextxy(20,170,"Zadanie po assembleru #3");
setcolor(5);
outtextxy(20,205,"Zadanie po assembleru #4");
setcolor(6);
outtextxy(20,240,"Zadanie po assembleru #5");
setcolor(0);
outtextxy(20,275,"Zadanie po assembleru #6");
setcolor(8);
outtextxy(20,310,"Zadanie po programmirovaniu");
setcolor(9);
outtextxy(20,345,"Back to previos display");
setcolor(12);
outtextxy(20,380,"Exit");
ki=1; x1=14; y1=95; x2=250; y2=115;
rectangle(x1,y1,x2,y2);
sled:
key=bioskey(0);
switch(key)
{
case 18432:{setcolor(15);
rectangle(x1,y1,x2,y2);
if (y1==95) {y1=375;y2=395; ki=9;}
else {y1=y1-35; y2=y2-35; ki--;}
setcolor(RED);
rectangle(x1,y1,x2,y2);
break; }
case 20480:
{setcolor(15);
rectangle(x1,y1,x2,y2);
if (y1==375) {y1=95;y2=115; ki=1;}
else {y1=y1+35; y2=y2+35; ki++;}
setcolor(RED);
rectangle(x1,y1,x2,y2);
break; }
case 7181: switch(ki)
{ case 1: spawnl(P_WAIT, "1.EXE", NULL); break;
case 2: spawnl(P_WAIT, "2.EXE", NULL); break;
case 3: spawnl(P_WAIT, "3.EXE", NULL); break;
case 4: spawnl(P_WAIT, "4.EXE", NULL); break;
case 5: spawnl(P_WAIT, "5.EXE", NULL); break;
case 6: spawnl(P_WAIT, "6.EXE", NULL); break;
case 7: spawnl(P_WAIT, "CPP.EXE", NULL); break;
case 8: goto snachala;
case 9: closegraph(); exit(1); }
}
goto sled;
}
14. Руководство пользователя
Для запуска курсовой работы воспользуйтесь файлом KOMP.EXE.В случае возникновения ошибки «Error initialization» убедитесь, что в папке с приложением также есть файл графического драйвера egavga.bgi и его путь в программе указан правильно.
Для нормального функционирования курсовой работы необходимо наличие в папке следующих файлов:
KOMP.EXE
1.EXE
2.EXE
3.EXE
4.EXE
5.EXE
6.EXE
EGAVGA.BGI
TRIP.CHR
SANS.CHR
LITT.CHR
INPUT.ASM
Любой файл размером < 1 мегабайта (потребуется для индивидуального задания)
При запуске приложения отображается графическая заставка, сопровождаемая мелодией и анимацией, а также содержащая информацию об авторе.
Нажмите “M” для отображения меню курсовой работы. Выход производится с помощью клавиши Esc. При нажатии любой другой клавиши останавливается мелодия и анимация.
Для запуска задания, наведите курсор на задание которое вам нужно и нажмите Enter. Запускается программа из курсовой работы, после выхода из неё, программа автоматически перейдёт в меню
В индивидуальном задании потребуется ввести имя файла, после чего нажать ENTER.
Курсовая работа тестировалась на операционных системах MS DOS и Microsoft Windows 95/2000/XP, для запуска на операционных системах Windows более высокой версии потребуется специальное программное обеспечение.
Список литературы
Калашников О. «Ассемблер? Это просто!»
Питер Абель. Ассемблер и программирование для IBM PC
Курс лекций по предмету «Информатика»
Методические указания к выполнению лабораторных работ по предмету «Информатика»
Крупник А. - Ассемблер Самоучитель
Крупник А. - Изучаем ассемблер
Митницкий В. - Архитектура IBM PC и язык Ассемблера
Голубь Н. - Искусство программирования на Ассемблере
1