Сюда скидываем свои лабы (кто изучает асм в универе). Я в свою очередь буду добавлять свои(у меня 15 вариант из методички "system programming and operating systems(NAU)" кто знает тот поймёт:))
Лабы по Ассемблеру
Сообщений 1 страница 10 из 13
Поделиться2Tue:02,October,2007 1:09:27
Вот 1я: Надо посчитать выражение a * b – a / b (пока что пишем с ассемблерными вставками на СИ):
#include <stdio.h>
#include <conio.h>
//Calculation of expression a * b - a / b
void main(){
clrscr();
int a,b,c;
printf("The expression a * b - a / b is to be calculated\n");
printf("Please input variables, a and b (integers)\n");
scanf("%i%i",&a,&b);
asm{
mov ax, a
mov c, ax
cwd //расширяем word из AX до dword DX:AX
imul b
mov c, ax
mov ax, a
cwd
idiv b
sub c, ax
}
printf("%i",c);
getch()
}
Поделиться3Tue:02,October,2007 1:13:50
2я:
Дан массив из 10 целых чисел. надо найти сумму минимального и максимального:
#include <stdio.h>
#include <conio.h>
void main(){
clrscr();
int i,c,sum,min=32767,max=-32766,a[10];
printf("Please input array of 10 integer elements\n");
for(i=0;i<10;i++) //init array
scanf("%i",&a[i]);
asm{
lea si,a
mov cx,10
}
p:
asm{
lodsw
cmp min,ax
jl p1
mov min,ax
}
p1:
asm{
loop p
mov cx,10
sub si,2
std
}
p2:
asm{
lodsw
cmp max,ax
jg p3
mov max,ax
}
p3:
asm{
loop p2
mov sum,0
mov ax,min
add sum,ax
mov ax,max
add sum,ax
}
printf("the sum of maximum & minimum element is:\n");
printf("%i",sum);
getch();
}
Поделиться4Tue:02,October,2007 16:30:46
Эт ты не плохо придумал- +1
Поделиться5Sat:06,October,2007 16:35:38
Ууу… Полезная вещь, лабораторки.
Добавляю ваш форум себе в избранное.
Поделиться6Sat:06,October,2007 22:13:24
Ты не забудь сюда курсач выложить когда напишеш))
Поделиться7Sun:07,October,2007 23:54:19
Ты не забудь сюда курсач выложить когда напишеш))
Выложу всё!! До курсача ещё дожить надо)
Поделиться8Sat:20,October,2007 13:17:27
3я:
Дано 2 массива(integer). Из первого перенести во второй только те элементы, которые соответствуют фильтру, и используя только битовые логические операции и/или сдвиги.
После выполнения вывести оба массива.
мой 15 вариант: negative even (отрицательные чётные)
#include <stdio.h>
#include <conio.h>
main(){
clrscr();
int i,mas1[12],mas2[12],s=0;
printf("task: copy negative even elements to the second array\n");
printf("please fill the first array:\n");
for (i=0;i<12;i++)
{printf("input element number %d ",i+1);
scanf("%d",&mas1[i]);}
asm{
lea si,mas1
lea di,mas2
mov cx,12
}
a:
asm{
lodsw
mov bx,ax
or bx,0
jge c
}
b:
asm{
and bx,1
jnz c
inc s
stosw
}
c:
asm{
loop a
}
printf("\nsource array:\n");
for (i=0;i<12;i++)
{printf(" %d ",mas1[i]);}
printf("\nfiltered array:\n");
for (i=0;i<s;i++)
{printf(" %d ",mas2[i]);}
getch();
}
Поделиться9Mon:29,October,2007 19:44:24
4 лаба. FPU - floaing-point unit. Последняя в 1м модуле.
Задание: написать прогу на си, которая задаёт масив из 10 чисел с плавающей точкой, инициализирует его и выводит результат, высчситанный в ассемблерных вставках.
Мой вариант - The difference between two minimum elements(разница двух минимальных элементов масива).
#include<stdio.h>
#include<conio.h>
void main()
{
float min1,min2,stn,arr[10],u;
int i;
clrscr();
printf("Please input 10 real numbers:\n");
for(i=0;i<10;i++) scanf("%f",&arr[i]);
u=arr[1];
asm{
finit
lea si,arr
mov cx,10
fld dword ptr[si]
fstp min1
fstp min2}
p1:
asm{
fld dword ptr[si]
fcom min1
fstsw ax
sahf
ja p2
fstp min1}
p2:
asm{
fstp
add si,4
loop p1}
asm{
lea si,arr
mov cx,10}
p3:
asm{
fld dword ptr[si]
fcom min2
fstsw ax
sahf
ja p4
fcom min1
fstsw ax
sahf
je p4
jne p5
}
p5:
asm{fstp min2}
p4:
asm{
fstp
add si,4
loop p3}
asm{
fld min1
fsub min2
fst stn}
printf("%.3f,%.3f,%.3f",min1,min2,stn);
getch();
}
Поделиться10Tue:13,November,2007 21:53:16
5 лаба, пишем в TASMе:
Tasks:
1. Learn the operation program construction in the Assembly language.
2. Study the data declaration directives in the Assembly language.
3. Study the directives of program segments in the Assembly language.
4. Introduce the interrupt system.
5. Obtain practical skills to work with integrated environment TASM.
6. Write a program in the assembly language which applies appropriate data declaration directives and takes the following actions:
- input by typing character string (use interrupt 21h function 0ah) and output it (use interrupt 21h function 09h);
- declare, initialize and process the array of integer values(choose variant in Tab.3)
Tab.3
№ variant Length Compute
15. 10 The sum of two maximum elements
Source code:
.model tiny
.stack 100h
.data
max db 255
len db ?
string db 255 dup(?)
db ?
ent db 13,10,'$'
mass dw 34,6,-8,11,3,5,18,23,21,78
max_el_1 dw ?
max_el_2 dw ?
sum dw 0
pos_max dw ?
for_input db 'Please type any string of 255 chars max:',13,10,'$'
.code
begin:
mov ax,0003h
int 10h
mov ax,@data
mov ds,ax
mov ah,9
lea dx,for_input
int 21h
mov ah,0ah
lea dx,max
int 21h
mov bl,len
xor bh,bh
mov [bx+string],'$'
lea dx,ent
mov ah,09h
int 21h
lea dx,string
int 21h
lea si,mass
push si
xor ax,ax
mov pos_max,si
lodsw
mov max_el_1,ax
mov max_el_2,ax
mov cx,9
next_element:
xor ax,ax
lodsw
cmp ax,max_el_1
jng skip_max
mov max_el_1,ax
mov pos_max,si
skip_max:
dec cx
jnz next_element
pop si
mov cx,10
cmp pos_max,si
jne skip_equal
push word ptr [si+2]
pop max_el_2
add si,4
mov cx,8
skip_equal:
xor ax,ax
lodsw
cmp ax,max_el_2
jng skip_max_2
cmp pos_max,si
je skip_max_2
mov max_el_2,ax
skip_max_2:
dec cx
jnz skip_equal
xor ax,ax
mov ax,max_el_1
add ax,max_el_2
mov sum,ax
mov ah,4ch
int 21h
end begin
Похожие темы
Лабораторные по ассемблеру Я & Гордый =) | Ассемблер | Tue:05,February,2008 |
Форум о програмировании для всех | Новости и события форума | Mon:24,September,2007 |