КАПУСТА: почитай,обсуди,отдохни!

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » КАПУСТА: почитай,обсуди,отдохни! » Ассемблер » Лабы по Ассемблеру


Лабы по Ассемблеру

Сообщений 1 страница 10 из 13

1

Сюда скидываем свои лабы (кто изучает асм в универе). Я в свою очередь буду добавлять свои(у меня 15 вариант из методички "system programming and operating systems(NAU)" кто знает тот поймёт:))

0

2

Вот 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()
}

0

3

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();
}

0

4

Эт ты не плохо придумал- +1 :D

0

5

Ууу… Полезная вещь, лабораторки.
Добавляю ваш форум себе в избранное.

0

6

Ты не забудь сюда курсач выложить когда напишеш))

0

7

Гордый написал(а):

Ты не забудь сюда курсач выложить когда напишеш))

Выложу всё!! До курсача ещё дожить надо)

0

8

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();
}

0

9

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();
}

0

10

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

0


Вы здесь » КАПУСТА: почитай,обсуди,отдохни! » Ассемблер » Лабы по Ассемблеру