System Software and Microprocessor Labmanual
System Software and Microprocessor Labmanual
INDEX
An Operating System is a program that manages the Computer hardware. It controls and coordinates
the use of the hardware among the various application programs for the various users.
Apart from the program code, it includes the current activity represented by
• Program Counter,
• Contents of Processor registers,
• Process Stack which contains temporary data like function parameters, return
addresses and local variables
• Data section which contains global variables
• Heap for dynamic memory allocation
A Multi-programmed system can have many processes running simultaneously with the CPU
multiplexed among them. By switching the CPU between the processes, the OS can make the computer
more productive. There is Process Scheduler which selects the process among many processes that are
ready, for program execution on the CPU. Switching the CPU to another process requires performing a state
save of the current process and a state restore of new process, this is Context Switch.
Scheduling Algorithms
CPU Scheduler can select processes from ready queue based on various scheduling algorithms.
Different scheduling algorithms have different properties, and the choice of a particular algorithm may
favour one class of processes over another. The scheduling criteria include
• CPU utilization:
• Throughput: The number of processes that are completed per unit time.
• Waiting time: The sum of periods spent waiting in ready queue.
• Turnaround time: The interval between the time of submission of process to the time
of completion.
• Response time: The time from submission of a request until the first response is produced.
• The process with the minimal arrival time will get the CPU first.
• The lesser the arrival time, the sooner will the process gets the CPU.
• It is the non-pre-emptive type of scheduling.
• The Turnaround time and the waiting time are calculated by using the following formula.
• The job with the shortest burst time will get the CPU first.
• The lesser the burst time, the sooner will the process get the CPU.
• It is the non-pre-emptive type of scheduling.
• However, it is very difficult to predict the burst time needed for a process hence this algorithm is
very difficult to implement in the system.
• In the following example, there are five jobs named as P1, P2, P3, P4 and P5. Their arrival time and
burst time are given in the table below.
5 9 8 21 12 4
Since, No Process arrives at time 0 hence; there will be an empty slot in the Gantt chart from time 0 to 1
(the time at which the first process arrives)
.
• According to the algorithm, the OS schedules the process which is having the lowest burst time among
the available processes in the ready queue.
• Till now, we have only one process in the ready queue hence the scheduler will schedule this to the
processor no matter what is its burst time.
• This will be executed till 8 units of time.
• Till then we have three more processes arrived in the ready queue hence the scheduler will choose the
process with the lowest burst time.
• Among the processes given in the table, P3 will be executed next since it is having the lowest burst
time among all the available processes.
• It is the pre-emptive form of SJF. In this algorithm, the OS schedules the Job according to the
remaining time of the execution
4. Priority Scheduling
• In the Round Robin scheduling algorithm, the OS defines a time quantum (slice).
• All the processes will get executed in the cyclic way.
• Each of the process will get the CPU for a small amount of time (called time quantum) and then get
back to the ready queue to wait for its next turn. It is a pre-emptive type of scheduling.
• A multi-level queue scheduling algorithm partitions the ready queue into several separate queues.
• The processes are permanently assigned to one queue, generally based on some property of the
process, such as memory size, process priority, or process type.
• Each queue has its own scheduling algorithm.
• Multilevel feedback queue scheduling, however, allows a process to move between queues.
• The idea is to separate processes with different CPU-burst characteristics.
• If a process uses too much CPU time, it will be moved to a lower-priority queue.
• Similarly, a process that waits too long in a lower-priority queue may be moved to a higher-priority
queue.
• This form of aging prevents starvation.
Pgm.No.1
CPU SCHEDULING
AIM
Similate the following non pre-emptive CPU scheduling algorithms to find turnaround time and waiting tme.
a). FCFS
b). SJF
c). Priority
d). Round Robin (Pre-emptive)
ALGORITHM
Step 1: Start
Step 2: Enter the number of processors.
Step 3: Enter the processes name, arrival time and burst time.
Step 4: Make the waiting time of the first process as the arrival of the first process. Step 5: Calculate the
waiting time of each process ie burst time – arrival time.
Step 6: Calculate the turnaround time of each process ie waiting time + burst time
Step7: Calculate average waiting time by adding waiting time of each process and divide by the total
number of processes and also display it.
Step 8: Calculate the average turnaround time and display it. Step 9: Call function display ()
Step 10: Stop.
PROGRAM
#include<stdio.h>
void main()
{
int i=0,j=0,b[i],g[20],p[20],w[20],t[20],a[20],n=0,m;
float avgw=0,avgt=0;
printf("Enter the number of process : ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Process ID : ");
scanf("%d",&p[i]);
scanf("%d",&a[i]);
}
int temp=0;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
temp=b[j];
b[j]=b[j+1];
b[j+1]=temp;
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
g[0]=0;
for(i=0;i<=n;i++)
g[i+1]=g[i]+b[i];
for(i=0;i<n;i++)
{
t[i]=g[i+1]-a[i];
w[i]=t[i]-b[i];
avgw+=w[i];
avgt+=t[i];
}
avgw=avgw/n;
avgt=avgt/n;
printf("pid\tarrivalT\tBrustT\tCompletionT\tWaitingtime\tTurnaroundTi\n");
for(i=0;i<n;i++)
{
printf("%d\t%d\t%d\t%d\t\t%d\t\t\t%d\n",p[i],a[i],b[i],g[i+1],w[i],t[i]);
}
printf("\nAverage waiting time %f",avgw);
printf("\nAverage turnarround time %f",avgt);
COLLGE OF ENGINEERING KALLOOPPARAPage 8
System Software and Microprocessor Lab
OUTPUT 1
1 0 4 4 0 4
2 1 3 7 3 6
3 2 1 8 5 6
4 3 2 10 5 7
5 4 5 15 6 11
OUTPUT 2
OUTPUT 3
ALGORITHM
Step 1: Start
Step 2: Enter the number of processors.
Step 3: Enter the processes name, and burst time.
Step 4: Sort processes in ascending order of the burst time, if they arrive within the burst time of the
previous processes
Step 5: Calculate the average turnaround time and display it. Step 6: Call function display ( ).
Step 7: Stop.
PROGRAM
#include<stdio.h>
void main()
{
int i=0,j=0,p[i],b[i],g[20],w[20],t[20],a[20],n=0,m;
int k=1,min=0,btime=0;
float avgw=0,avgt=0;
printf("Enter the number of process : ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("\nProcess id : ");
scanf("%d",&p[i]);
temp=b[j];
b[j]=b[j+1];
b[j+1]=temp;
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
for(i=0;i<n;i++)
{
btime=btime+b[i];
min=b[k];
for(j=k;j<n;j++)
{
if(btime >= a[j] && b[j]<min)
{
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
temp=b[j];
b[j]=b[j-1];
b[j-1]=temp;
temp=p[j];
p[j]=p[j-1];
p[j-1]=temp;
}
}
k++;
}
g[0]=a[0];
for(i=0;i<n;i++)
{
g[i+1]=g[i]+b[i];
if(g[i]<a[i])
g[i]=a[i];
}
for(i=0;i<n;i++)
{
t[i]=g[i+1]-a[i];
w[i]=t[i]-b[i];
avgw+=w[i];
avgt+=t[i];
}
avgw=avgw/n;
avgt=avgt/n;
printf("pid\tBrustTime\tGantChart\tWaiting time\t\tTurnarround Time\n");
for(i=0;i<n;i++)
{
COLLGE OF ENGINEERING KALLOOPPARAPage 12
System Software and Microprocessor Lab
OUTPUT 1
Process id : 1
Burst Time : 7
Arrival Time: 0
Process id : 2
Burst Time : 5
Arrival Time: 1
Process id : 3
Burst Time : 1
Arrival Time: 2
Process id : 4
Burst Time : 2
Arrival Time: 3
Process id : 5
Burst Time : 8
Arrival Time: 4
OUTPUT 2
COLLGE OF ENGINEERING KALLOOPPARAPage 13
System Software and Microprocessor Lab
Process id : 1
Burst Time : 7
Arrival Time: 0
Process id : 2
Burst Time : 4
Arrival Time: 2
Process id : 3
Burst Time : 1
Arrival Time: 4
Process id : 4
Burst Time : 4
Arrival Time: 5
PRIORITY SCHEDULING
ALGORITHM
Step 1: Start
Step 2: Enter the number of processors.
Step 3: Enter the processes name, priority and burst time. Step 4: Sort processes in ascending order of the
priority.
Step 5: Calculate and display the average waiting time and turnaround time. Step 7: Call function display()
Step 10: Stop
PROGRAM
#include<stdio.h>
int main()
{
COLLGE OF ENGINEERING KALLOOPPARAPage 14
System Software and Microprocessor Lab
OUTPUT
Process id : 1
Burst Time : 15
Priority: 3
Process id : 2
Burst Time : 10
Priority: 2
Process id : 3
Burst Time : 90
Priority: 1
ROUND ROBIN(PRE-EMPTIVE)
ALGORITHM
Step 1: Start
Step 2: Enter the number of processors. Step 3: Enter the time slice.
Step 4: If burst time < time slice, then execute process completely, go to step 7
Step 5: Execute the process upto the time slice and save the remaining burst time and start the next process.
Step 6: Calculate and display the average waiting time and turnaround time. Step 7: Call function display()
Step 8: Stop.
PROGRAM
#include<stdio.h>
int main()
{
int i, limit, total = 0, x, counter = 0, time_quantum;
int wait_time = 0, turnaround_time = 0, arrival_time[10], burst_time[10], temp[10];
float average_wait_time, average_turnaround_time;
printf("\nEnter Total Number of Processes:\t");
scanf("%d", &limit);
x = limit;
for(i = 0; i < limit; i++)
{
printf("\nEnter Details of Process[%d]\n", i + 1);
printf("Arrival Time:\t");
scanf("%d", &arrival_time[i]);
printf("Burst Time:\t");
scanf("%d", &burst_time[i]);
temp[i] = burst_time[i];
}
printf("\nEnter Time Quantum:\t");
scanf("%d", &time_quantum);
printf("\nProcess ID\t\tBurst Time\t Turnaround Time\t Waiting Time\n");
for(total = 0, i = 0; x != 0;)
{
if(temp[i] <= time_quantum && temp[i] > 0)
{
total = total + temp[i];
temp[i] = 0;
counter = 1;
}
else if(temp[i] > 0)
{
temp[i] = temp[i] - time_quantum;
total = total + time_quantum;
}
if(temp[i] == 0 && counter == 1)
COLLGE OF ENGINEERING KALLOOPPARAPage 17
System Software and Microprocessor Lab
{
x--;
printf("\nProcess[%d]\t\t%d\t\t %d\t\t\t %d", i + 1, burst_time[i], total - arrival_time[i], total -
arrival_time[i] - burst_time[i]);
wait_time = wait_time + total - arrival_time[i] - burst_time[i];
turnaround_time = turnaround_time + total - arrival_time[i];
counter = 0;
}
if(i == limit - 1)
{
i = 0;
}
else if(arrival_time[i + 1] <= total)
{
i++;
}
else
{
i = 0;
}
}
average_wait_time = wait_time * 1.0 / limit;
average_turnaround_time = turnaround_time * 1.0 / limit;
printf("\n\nAverage Waiting Time:\t%f", average_wait_time);
printf("\nAvg Turnaround Time:\t%f\n", average_turnaround_time);
return 0;
}
OUTPUT
Process[2] 5 9 4
Process[3] 3 11 8
Process[4] 4 14 10
Process[1] 9 21 12
Viva Questions
The round-robin (RR) scheduling algorithm is designed especially for timesharing systems. CPU
switch between the processes based on a small unit of time called time slice.
8. What is Throughput?
The amount of work is being done by the CPU. One unit of work is the number of processes that are
completed per unit time, called throughput
9. What is Turnaround time.
The interval from the time of submission of a process to the time of completion is the turnaround
time
DEADLOCK
Deadlock :
A set of processes is deadlocked if each process in the set is waiting for an event that only another process in
the set can cause (including itself).
Deadlock Avoidance
• This approach to the deadlock problem anticipates deadlock before it actually occurs.
• This approach employs an algorithm to access the possibility that deadlock could occur and acting
accordingly.
• This method differs from deadlock prevention, which guarantees that deadlock cannot occur by denying
one of the necessary conditions of deadlock.
• If the necessary conditions for a deadlock are in place, it is still possible to avoid deadlock by being
careful when resources are allocated.
• Perhaps the most famous deadlock avoidance algorithm, due to Dijkstra [1965], is the Banker’s
algorithm.
Safe State
• To avoid deadlocks, we try to make only those transitions that will take you from one safe state to another.
• We avoid transitions to unsafe state (a state that is not deadlocked, and is not safe).
COLLGE OF ENGINEERING KALLOOPPARAPage 21
System Software and Microprocessor Lab
Pgm.No.2
BANKER’S ALGORITHM FOR DEADLOCK AVOIDANCE
AIM
Implement banker’s algorithm for deadlock avoidance
PROGRAM
#include<stdio.h>
struct pro{
int all[10],max[10],need[10];
int flag;
};
int i,j,pno,r,nr,id,k=0,safe=0,exec,count=0,wait=0,max_err=0;
struct pro p[10];
int aval[10],seq[10];
void safeState()
{
while(count!=pno){
safe = 0;
for(i=0;i<pno;i++){
if(p[i].flag){
exec = r;
for(j=0;j<r;j++)
{
if(p[i].need[j]>aval[j]){
exec =0;
}
}
if(exec == r){
for(j=0;j<r;j++){
aval[j]+=p[i].all[j];
}
p[i].flag = 0;
seq[k++] = i;
safe = 1;
count++;
}
}
}
if(!safe)
{
printf("System is in Unsafe State\n");
break;
}
}
if(safe){
printf("\n\nSystem is in safestate \n");
scanf("%d",&nr);
if( nr <= p[id].need[i])
{
if( nr <= aval[i]){
aval[i] -= nr;
p[id].all[i] += nr;
p[id].need[i] -= nr;
}
else
wait = 1;
}
else
max_err = 1;
}
if(!max_err && !wait)
safeState();
else if(max_err){
printf("\nProcess has exceeded its maximum usage \n");
}
else{
printf("\nProcess need to wait\n");
}
}
void main()
{
printf("\n\n---Resourse Details---");
for(i=0;i<pno;i++){
}
// Calcualting need
for(i=0;i<pno;i++){
for(j=0;j<r;j++){
p[i].need[j] = p[i].max[j] - p[i].all[j];
}
}
reqRes();
}while(ch!=0);
//end:printf("\n");
OUTPUT
Enter no of process 5
Enter no. of resourses 3
Enter Available Resourse of each type 3
3
2
---Resourse Details---
Resourses for process 0
Allocation Matrix
010
Maximum Resourse Request
753
Allocation Matrix
302
Maximum Resourse Request
322
Allocation Matrix
302
Maximum Resourse Request
902
Allocation Matrix
211
Maximum Resourse Request
222
Allocation Matrix
002
Maximum Resource Request
433
Process Details
Pid Allocation Max Need
0 0 1 0 7 5 3 7 4 3
1 3 0 2 3 2 2 0 2 0
2 3 0 2 9 0 2 6 0 0
3 2 1 1 2 2 2 0 1 1
4 0 0 2 4 3 3 4 3 1
Viva questions
1. What is deadlock?
Deadlock is a situation that when two or more process waiting for each other and holding the resource
which is required by another process.
DISK SCHEDULING
Disk scheduling is is done by operating systems to schedule I/O requests arriving for disk. It is also known
as I/O scheduling.
Disk scheduling is important because:
▪ Multiple I/O requests may arrive by different processes and only one I/O request can be served at a
time by disk controller. Thus other I/O requests need to wait in waiting queue and need to be
scheduled.
▪ Two or more request may be far from each other so can result in greater disk arm movement.
▪ Hard drives are one of the slowest parts of computer system and thus need to be accessed in an
efficient manner.
There are many Disk Scheduling Algorithms but before discussing them let’s have a quick look at some of
the important terms:
▪ Seek Time:Seek time is the time taken to locate the disk arm to a specified track where the data is to
be read or write. So the disk scheduling algorithm that gives minimum average seek time is better.
▪ Rotational Latency: Rotational Latency is the time taken by the desired sector of disk to rotate into a
position so that it can access the read/write heads. So the disk scheduling algorithm that gives
minimum rotational latency is better.
▪ Transfer Time: Transfer time is the time to transfer the data. It depends on the rotating speed of the
disk and number of bytes to be transferred.
▪ Disk Access Time: Disk Access Time is:
▪ Disk Response Time: Response Time is the average of time spent by a request waiting to perform
its I/O operation. Average Response time is the response time of the all requests. Variance Response
Time is measure of how individual request are serviced with respect to average response time. So the
disk scheduling algorithm that gives minimum variance response time is better.
1. FCFS: FCFS is the simplest of all the Disk Scheduling Algorithms. In FCFS, the requests are
addressed in the order they arrive in the disk queue.
Advantages:
• Every request gets a fair chance
• No indefinite postponement
Disadvantages:
• Does not try to optimize seek time
• May not provide the best possible service
3. SCAN: In SCAN algorithm the disk arm moves into a particular direction and services the requests
coming in its path and after reaching the end of disk, it reverses its direction and again services the
request arriving in its path. So, this algorithm works like an elevator and hence also known
as elevator algorithm. As a result, the requests at the midrange are serviced more and those arriving
behind the disk arm will have to wait.
Advantages:
▪ High throughput
▪ Low variance of response time
▪ Average response time
Disadvantages:
• Long waiting time for requests for locations just visited by disk arm. These situations are avoided
in CSAN algorithm in which the disk arm instead of reversing its direction goes to the other end
of the disk and starts servicing the requests from there. So, the disk arm moves in a circular
fashion and this algorithm is also similar to SCAN algorithm and hence it is known as C-SCAN
(Circular SCAN).
Advantages:
• Provides more uniform wait time compared to SCAN
4. CSCAN: In SCAN algorithm, the disk arm again scans the path that has been scanned, after
reversing its direction. So, it may be possible that too many requests are waiting at the other end or
there may be zero or few requests pending at the scanned area.
Pgm.No.4
ALGORITHM
Step 1: Start
Step 2: Declare necessary variables Step 3: Get number of tracks
Step 4: Get the number of tracks to be traversed
Step 5: By using the for loop, tohm[i]=t[i+1]-t,if that variable <0, multiply it with -1.
Step 6: calculate total header and movements and then its average. Step 7: Print the track traversed
Step 8: Print average movement. Step 9: Stop.ITHM
PROGRAM
#include<stdio.h>
void main(){
int ioq[20],i,n,ihead,tot;
float seek=0,avgs;
avgs = seek/(n);
OUTPUT 2
Enter the number of requests :5
Enter the initial head position :100
Enter the I/O queue requests
23
89
132
42
187
42 145
187 0
SCAN
ALGORITHM
Step 1: Start
Step 2: Declare necessary variables.
Step 3: Get the tracks to be traversed.
Step 4: Get position head.
Step 5: Sort the tracks using bubble sort
Step 6: while the tracks become 0,atr[p]=t[j]; j--; p++; Step 7: for j=0;jatr[j+1]d[j]=atr[j]-atr[j+1];else
d[j]=atr[j+1]-atr[j]; sum+=d[j];
Step 8: Find the sum f the total movements and average Step 9: Print the values
Step 10: Stop.
PROGRAM
#include<stdio.h>
void main()
{
int ioq[20],i,n,j,ihead,temp,scan,tot;
float seek=0,avgs;
for(i=0;i<n-1;i++){
for(j=0;j<n-1;j++)
{
COLLGE OF ENGINEERING KALLOOPPARAPage 34
System Software and Microprocessor Lab
temp = ioq[j];
ioq[j] = ioq[j+1];
ioq[j+1] = temp;
}
}
ioq[n]=ioq[n-1];
for(i=0;i<n;i++){
if(ihead == ioq[i]){
scan = i;
break;
for(i=scan+1;i<n;i++){
tot = ioq[i+1] - ioq[i];
if(tot < 0)
tot = tot * -1;
//seek += tot;
printf("%d\t%d\n",ioq[i],tot);
}
seek = ihead + ioq[n-1];
COLLGE OF ENGINEERING KALLOOPPARAPage 35
System Software and Microprocessor Lab
avgs = seek/(n-2);
}
OUTPUT
53 16
37 23
14 14
0 65
65 2
67 31
98 24
122 2
124 59
183 0
C-SCAN
ALGORITHM
Step 1: Start
Step 2: Declare necessary variables.
Step 3: Get tracks to be traversed
Step 4: Get position head
Step 5: Sort tracks using bubble sorting
Step 6: For I to n+2 Check track=header then break
Step 7: while t[j]!=tot-1atr[p]=t[j]; j++;p++;
Step 8: Find the sum f the total movements and average Step 9: Print the values
Step 10: Stop.
PROGRAM
#include<stdio.h>
void main()
{
int ioq[20],i,n,j,ihead,itail,temp,scan,tot=0;
float seek=0,avgs;
for(i=0;i<n-1;i++){
for(j=0;j<n-1;j++)
{
temp = ioq[j];
ioq[j] = ioq[j+1];
ioq[j+1] = temp;
}
COLLGE OF ENGINEERING KALLOOPPARAPage 37
System Software and Microprocessor Lab
}
}
for(i=0;i<n+1;i++){
if(ihead == ioq[i]){
scan = i;
break;
i = scan;
temp = n;
while(i != temp){
if(tot < 0)
tot = tot * -1;
seek += tot;
}
printf("%d --> ",ioq[i]);
// printf("%d\t%d\n",ioq[i],tot);
i++;
if(i == n){
i = 0;
temp = scan;
seek += itail;
avgs = seek/(n-3);
OUTPUT
50 --> 65 --> 68 --> 90 --> 120 --> 122 --> 128 --> 200 --> 0 --> 35 --> 38 -->
• Initially all slots are empty, so when 1, 3, 0 came they are allocated to the empty slots —> 3 Page
Faults.
when 3 comes, it is already in memory so —> 0 Page Faults.
Then 5 comes, it is not available in memory so it replaces the oldest page slot i.e 1. —>1 Page
Fault.
6 comes, it is also not available in memory so it replaces the oldest page slot i.e 3 —>1 Page
Fault.
Finally when 3 come it is not avilable so it replaces 0 1 page fault
Belady’s anomaly – Belady’s anomaly proves that it is possible to have more page faults when
increasing the number of page frames while using the First in First Out (FIFO) page replacement
algorithm. For example, if we consider reference string 3, 2, 1, 0, 3, 2, 4, 3, 2, 1, 0, 4 and 3 slots, we
get 9 total page faults, but if we increase slots to 4, we get 10 page faults.
• Initially all slots are empty, so when 7 0 1 2 are allocated to the empty slots —> 4 Page faults
0 is already there so —> 0 Page fault.
when 3 came it will take the place of 7 because it is not used for the longest duration of time in
the future.—>1 Page fault.
0 is already there so —> 0 Page fault..
4 will takes place of 1 —> 1 Page Fault.
• Now for the further page reference string —> 0 Page fault because they are already available
in the memory.
• Optimal page replacement is perfect, but not possible in practice as the operating system cannot
know future requests. The use of Optimal Page replacement is to set up a benchmark so that
other replacement algorithms can be analyzed against it.
• Initially all slots are empty, so when 7 0 1 2 are allocated to the empty slots —> 4 Page faults
0 is already their so —> 0 Page fault.
when 3 came it will take the place of 7 because it is least recently used —>1 Page fault
0 is already in memory so —> 0 Page fault.
4 will takes place of 1 —> 1 Page Fault
Now for the further page reference string —> 0 Page fault because they are already available
in the memory.
Pgm.No.7
AIM
PROGRAM
#include<stdio.h>
void main()
{
int n,f,fr[20],p[50],rep=0, found,fi=0;
int i,k;
printf("Enter the number of pages ");
scanf("%d",&n);
for(i=0;i<f;i++)
fr[i] = -1;
printf("\n\nPages\t\tFrames\n\n");
for(i=0;i<n;i++)
{
printf("%d\t\t",p[i]);
found = 1;
for(k=0;k<f;k++)
{
if(p[i] == fr[k]){
found = 0;
break;
COLLGE OF ENGINEERING KALLOOPPARAPage 42
System Software and Microprocessor Lab
}
if(found)
{
fr[fi] = p[i];
rep++;
fi = (fi+1)%f;
for(k=0;k<f;k++)
printf("%d\t",fr[k]);
}
printf("\n");
}
printf("\n\nNumber of page fault : %d\n",rep);
}
OUTPUT
Pages Frames
7 7 -1 -1
0 7 0 -1
1 7 0 1
2 2 0 1
0
3 2 3 1
0 2 3 0
4 4 3 0
2 4 2 0
3 4 2 3
0 0 2 3
3
2
1 0 1 3
2 0 1 2
0
1
7 7 1 2
0 7 0 2
1 7 0 1
#include<stdio.h>
int findLRU(int time[], int n){
int i, minimum = time[0], pos = 0;
int main()
{
int no_of_frames, no_of_pages, frames[10], pages[30], counter = 0, time[10], flag1, flag2, i, j, pos, faults
= 0;
printf("Enter number of frames: ");
scanf("%d", &no_of_frames);
printf("Enter number of pages: ");
scanf("%d", &no_of_pages);
printf("Enter reference string: ");
for(i = 0; i < no_of_pages; ++i){
scanf("%d", &pages[i]);
}
if(flag1 == 0){
for(j = 0; j < no_of_frames; ++j){
if(frames[j] == -1){
counter++;
faults++;
frames[j] = pages[i];
time[j] = counter;
flag2 = 1;
break;
}
}
}
if(flag2 == 0){
pos = findLRU(time, no_of_frames);
counter++;
faults++;
frames[pos] = pages[i];
time[pos] = counter;
}
printf("\n");
return 0;
}
OUTPUT
#include<stdio.h>
int main()
{
int total_frames, total_pages, hit = 0;
int pages[25], frame[10], arr[25], time[25];
int m, n, page, flag, k, minimum_time, temp;
printf("Enter Total Number of Pages:\t");
scanf("%d", &total_pages);
printf("Enter Total Number of Frames:\t");
scanf("%d", &total_frames);
for(m = 0; m < total_frames; m++)
{
frame[m] = -1;
}
for(m = 0; m < 25; m++)
{
arr[m] = 0;
}
printf("Enter Values of Reference String\n");
for(m = 0; m < total_pages; m++)
{
printf("Enter Value No.[%d]:\t", m + 1);
scanf("%d", &pages[m]);
}
printf("\n");
for(m = 0; m < total_pages; m++)
{
arr[pages[m]]++;
time[pages[m]] = m;
flag = 1;
k = frame[0];
for(n = 0; n < total_frames; n++)
{
if(frame[n] == -1 || frame[n] == pages[m])
{
if(frame[n] != -1)
{
hit++;
}
flag = 0;
frame[n] = pages[m];
break;
}
COLLGE OF ENGINEERING KALLOOPPARAPage 46
System Software and Microprocessor Lab
OUTPUT
Viva Questions
5. Which page replacement algorithm will have less page fault rate?
Optimal Page Replacement
6. What is thrashing?
It is situation that CPU spends more time on paging than executing.
7. What is swapping
A process must be in memory to be executed. A process, however, can be swapped temporarily out
of memory to a backing store and then brought back into memory for continued execution. This
process is called swapping.
8. What is fragmentation?
fragmentation is a phenomenon in which storage space is used inefficiently, reducing capacity or
performance.
and allocate memory in units based on block size. With this approach, the memory allocated to a
process may be slightly larger than the requested memory. The difference between these two
numbers is internal fragmentation.
14. What is the best page size when designing an operating system?
The best paging size varies from system to system, so there is no single best when it comes to page
size. There are different factors to consider in order to come up with a suitable page size, such as
page table, paging time, and its effect on the overall efficiency of the operating system.
16. What is Throughput, Turnaround time, waiting time and Response time?
Throughput – number of processes that complete their execution per time unit. Turnaround time –
amount of time to execute a particular process. Waiting time – amount of time a process has been
waiting in the ready queue. Response time – amount of time it takes from when a request was
submitted until the first response is produced, not output (for time-sharing environment).
too much external fragmentation occurs, the amount of usable memory is drastically reduced.
Total memory space exists to satisfy a request, but it is not contiguous
• Internal Fragmentation: Internal fragmentation is the space wasted inside of allocated memory
blocks because of restriction on the allowed sizes of allocated blocks. Allocated memory may be
slightly larger than requested memory; this size difference is memory internal to a partition, but
not being used Reduce external fragmentation by compaction
->Shuffle memory contents to place all free memory together in one large block.
->Compaction is possible only if relocation is dynamic, and is done at execution time.
20. Under what circumstances do page faults occur? Describe the actions taken by the operating system
when a page fault occurs?
A page fault occurs when an access to a page that has not been brought into main memory takes
place. The operating system verifies the memory access, aborting the program if it is invalid. If it is
valid, a free frame is located and I/O is requested to read the needed page into the free frame. Upon
completion of I/O, the process table and page table are updated and the instruction is restarted
Information about files is maintained by Directories. A directory can contain multiple files. It can even have
directories inside of them. In Windows we also call these directories as folders.
Two-Level Directory
In this separate directories for each user is maintained.
Path name: Due to two levels there is a path name for every file to locate that file.
So same file name for different user are possible. Searching is efficient in this method.
Single-Level Directory
In this a single directory is maintained for all the users.
Pgm.No.8
AIM
Simulate the following file organization techniques
a). Single level
b). Two level
c). Hierarchical
ALGORITHM
Step 1: Start
Step 2: Initialize values gd=DETECT,gm,count,i,j,mid,cir_x; Initialize character array fname[10][20];
Step 3: Initialize graph function as Initgraph(& gd, &gm," c:/tc/bgi"); Clear device();
Step 4: Set back ground color with setbkcolor();
Step 5: Read number of files in variable count.
Step 6: If check i<count
Step 7: For i=0 & i<count i increment; Cleardevice();setbkcolor(GREEN); read file
name;setfillstyle(1,MAGENTA);
Step 8: mid=640/count;
cir_x=mid/3; bar3d(270,100,370,150,0,0);settextstyle(2,0,4); settextstyle(1,1);
outtextxy(320,125,"rootdirectory"); setcolor(BLUE);i++;
Step 9: For j=0&&j<=i&&cir_x+=mid j increment; line(320,150,cir_x,250); fillellipse(cir_x,250,30,30);
outtextxy(cir_x,250,fname[i]);
Step 10: End
PROGRAM
#include<stdio.h>
#include<string.h>
struct dirct{
char dir[20],file[20][10];
int findex;
};
void main(){
int i, ch=1;
struct dirct d;
char ser[20];
d.findex=0;
printf("Enter the directory name ");
scanf("%s",d.dir);
do{
switch(ch){
}
break;
}while(ch);
printf("\n");
}
OUTPUT
a
b
c
Search completed
File found at 2 position
Search completed
No such file or directory
ALGORITHM
Step 1: Start
Step 2: Initialize structure elementsstruct tree_ element char name[20];Initialize integer variables x, y, ftype,
lx, rx, nc, level; struct tree_element
*link[5];}typedef structure tree_element node;
Step 3: Start main function
Step 4: Step variables gd=DETECT,gm; node *root;root=NULL;
Step 5: Create structure using create(&root,0,"null",0,639,320);
Step 6: initgraph(&gd, &gm,"c:\tc\bgi"); display(root);closegraph();
Step 7: End main function
Step 8: Initialize variables i,gap;
Step 9: If check *root==NULL (*root)=(node*)malloc(sizeof(node)); enter name of ir file name in dname;
fflush(stdin);gets((*root)->name);
Step 10: If check lev==0||lev==1 (*root)->ftype=1; else(*root)->ftype=2; (*root)->level=lev; (*root)-
>y=50+lev*5; (*root)->x=x;
(*root)->lx=lx; (*root)->rx=rx;
Step 11: For i=0&&i<5increment i
(*root)->link[i]=NULL;
if check (*root)->ftype==1
Step 12: If check (lev==0||lev==1)
if check(*root)->level==0
print "how many users" else print"how many files" print (*root)->name
read (*root)->nc
Step 13: Then (*root)->nc=0;
if check(*root)->nc==0 gap=rx-lx;
else gap=(rx-lx)/(*root)->nc;
Step 14: For i=0&&i<(*root)->nc increment i;
create(&((*root)->link[i]),lev+1,(*root)->name, lx+gap*i,lx+gap*i+gap,lx+gap*i+gap/2);
then
(*root)->nc=0;
Step 15: Initialize e display function Initialize i
set textstyle(2,0,4); set textjustify(1,1); set fillstyle(1,BLUE);
setcolor(14); step 13:if check root!=NULL
Step 16: For i=0&&i<root->nc
increment i
line(root->x,root->y,root->link[i]->x,root->link[i]->y);
Step 17: If check root->ftype==1
bar3d(root->x-20,root->y-10,root->x+20,root->y+10,0,0); else fill ellipse(root->x,root->y,20,20);
out textxy(root->x,root->y,root->name);
Step 18: For i=0&&i<root->nc increment i display(root->link[i]);
Step 19: End
PROGRAM
#include<stdio.h>
#include<string.h>
struct dirct{
char dir[20],file[20][10];
int findex;
};
void main(){
int i,j,ch=1,dindex=0,found=0;
struct dirct d[10];
char ser[20];
for(i=0;i<10;i++)
d[i].findex=0;
do{
switch(ch){
if(i==dindex){
printf("\nSearch completed\n");
printf("No such file or directory\n");
}
break;
if(!strcmp(ser,d[i].file[j]))
{
printf("%s is removed\n", d[i].file[j]);
strcpy(d[i].file[j],d[i].file[d[i].findex-1]);
d[i].findex--;
found=1;
break;
}
}
if(!found){
printf("\nSearch completed\n");
printf("No such file or directory\n");
}
break;
case 4: printf("\nEnter the file name ");
scanf("%s",ser);
found = 0;
for(i=0;i<dindex;i++){
for(j=0;j<d[i].findex;j++){
if(!strcmp(ser,d[i].file[j]))
{
printf("%s is removed\n", d[i].file[j]);
found=1;
break;
}
COLLGE OF ENGINEERING KALLOOPPARAPage 58
System Software and Microprocessor Lab
if(!found){
printf("\nSearch completed\n");
printf("No such file or directory\n");
}
break;
case 5: for(i=0;i<dindex;i++){
printf("\nThe files in the directory %s are;\n",d[i].dir);
for(j=0;j<d[i].findex;j++)
printf("%s\n", d[i].file[j]);
}
break;
}while(ch);
printf("\n");
}
OUTPUT
Search completed
No such file or directory
PAGING
Paging is a memory management scheme that eliminates the need for contiguous allocation of physical
memory. This scheme permits the physical address space of a process to be non – contiguous.
• Logical Address or Virtual Address (represented in bits): An address generated by the CPU
• Logical Address Space or Virtual Address Space( represented in words or bytes): The set of all
• Physical Address Space (represented in words or bytes): The set of all physical addresses
In computer operating systems, memory paging is a memory management scheme by which a computer
stores and retrieves data from secondary storage[a] for use in main memory.[1] In this scheme, the operating
system retrieves data from secondary storage in same-size blocks called pages. Paging is an important part
of virtual memory implementations in modern operating systems, using secondary storage to let programs
Pgm.No.9
AIM
PROGRAM
#include<stdio.h>
void main()
{
int memsize=15;
int pagesize,nofpage;
int p[100];
int frameno,offset;
int logadd,phyadd;
int i;
int choice=0;
printf("\nYour memsize is %d ",memsize);
printf("\nEnter page size:");
scanf("%d",&pagesize);
nofpage=memsize/pagesize;
for(i=0;i<nofpage;i++)
{
printf("\nEnter the frame of page%d:",i+1);
scanf("%d",&p[i]);
}
do
{
printf("\nEnter a logical address:");
scanf("%d",&logadd);
frameno=logadd/pagesize;
offset=logadd%pagesize;
phyadd=(p[frameno]*pagesize)+offset;
printf("\nPhysical address is:%d",phyadd);
printf("\nDo you want to continue(1/0)?:");
scanf("%d",&choice);
}while(choice==1);
}
OUTPUT:
Your memsize is 15
Enter page size:5
The purpose of file allocation in operating systems is first of all the efficient use of the disk space or
efficient disk utilization.
Pgm.No.10
AIM
PROGRAM
Sequencial
//exit();
return 0
//getch();
}
OUTPUT
Files Allocated are :
Enter starting block and length of files: 14 3
14 1
15 1
16 1
The file is allocated to disk
Do you want to enter more file(Yes - 1/No - 0)1
Enter starting block and length of files: 14 1
The file is not allocated
Do you want to enter more file(Yes - 1/No - 0)1
Enter starting block and length of files: 14 4
The file is not allocated
Do you want to enter more file(Yes - 1/No - 0)0
Indexed
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void main()
{
int f[50], index[50],i, n, st, len, j, c, k, ind,count=0;
clrscr();
for(i=0;i<50;i++)
f[i]=0;
x:printf("Enter the index block: ");
scanf("%d",&ind);
if(f[ind]!=1)
{
printf("Enter no of blocks needed and no of files for the index %d on the disk : \n", ind);
scanf("%d",&n);
}
else
{
printf("%d index is already allocated \n",ind);
goto x;
}
y: count=0;
for(i=0;i<n;i++)
{
scanf("%d", &index[i]);
if(f[index[i]]==0)
count++;
}
if(count==n)
{
for(j=0;j<n;j++)
f[index[j]]=1;
printf("Allocated\n");
printf("File Indexed\n");
for(k=0;k<n;k++)
printf("%d-------->%d : %d\n",ind,index[k],f[index[k]]);
}
else
{
printf("File in the index is already allocated \n");
printf("Enter another file indexed");
goto y;
}
printf("Do you want to enter more file(Yes - 1/No - 0)");
scanf("%d", &c);
if(c==1)
goto x;
else
exit(0);
getch();
}
OUTPUT
Enter the index block: 5
Enter no of blocks needed and no of files for the index 5 on the disk :
4
1234
Allocated
File Indexed
5-------->1 : 1
5-------->2 : 1
5-------->3 : 1
5-------->4 : 1
Do you want to enter more file(Yes - 1/No - 0)1
Enter the index block: 4
4 index is already allocated
Enter the index block: 6
Enter no of blocks needed and no of files for the index 6 on the disk :
2
78
A5llocated
File Indexed
6-------->7 : 1
6-------->8 : 1
Do you want to enter more file(Yes - 1/No - 0)0
Linked
#include<stdio.h>
#include<conio.h>
struct file
{
char fname[10];
int start,size,block[10];
}f[10];
main()
{
int i,j,n;
clrscr();
printf("Enter no. of files:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Enter file name:");
scanf("%s",&f[i].fname);
printf("Enter starting block:");
scanf("%d",&f[i].start);
f[i].block[0]=f[i].start;
printf("Enter no.of blocks:");
scanf("%d",&f[i].size);
printf("Enter block numbers:");
for(j=1;j<=f[i].size;j++)
{
scanf("%d",&f[i].block[j]);
}
}
printf("File\tstart\tsize\tblock\n");
for(i=0;i<n;i++)
{
printf("%s\t%d\t%d\t",f[i].fname,f[i].start,f[i].size);
for(j=1;j<=f[i].size-1;j++)
printf("%d--->",f[i].block[j]);
printf("%d",f[i].block[j]);
printf("\n");
}
getch();
OUTPUT
. First Fit: In the first fit, the partition is allocated which is the first sufficient block from the
top of Main Memory. It scans memory from the beginning and chooses the first available
block that is large enough. Thus it allocates the first hole that is large enough.
2. Best Fit Allocate the process to the partition which is the first smallest sufficient
partition among the free available partition. It searches the entire list of holes to find the
smallest hole whose size is greater than or equal to the size of the process.
3. Worst Fit Allocate the process to the partition which is the largest sufficient among the
freely available partitions available in the main memory. It is opposite to the best-fit
algorithm. It searches the entire list of holes to find the largest hole and allocate it to
process.
Although best fit minimizes the wastage space, it consumes a lot of processor time for
searching the block which is close to the required size. Also, Best-fit may perform poorer
than other algorithms in some cases.
ASSEMBLER
• System software which is used to convert assembly language program to its equivalent object code.
Input to the assembler is a source code written in assembly language. Output is the object code.
Design of assembler depends upon the machine architecture as the language used is mnemonic
language.
Analysis Phase
➢ Look at the mnemonics table and get the opcode corresponding to the mnemonic.
➢ Obtain the address of a memory operand from the symbol table.
➢ Synthesize the machine instruction.
TYPES OF ASSEMBLER
➢ In the first pass it reads the entire source file, looking only the label definitions.
➢ All labels are collected, assigned values and placed in the symbol table in this pass.
➢ No instructions are assembled and at the end of the pass, the symbol table should contain all the labels
defined in the program.
➢ In the second pass, the instructions are again read and are assembled using the symbol table.
i. Assembler instructions.
ii. Generate data values defined by BYTE, WORD, etc.
iii. Perform processing of assembler directives not done during pass 1.
iv. Write object program and assembly listing.
Pgm.No.10
ALGORITHM
Step 1: Open the files fp1 and fp4 in read mode and fp2 and fp3 in write mode Step 2: Read the source
program
Step 3: If the opcode read in the source program is START, the variable location counter is initialized with
the operand value.
Step 4: Else the location counter is initialized to 0.
Step 5: The source program is read line by line until the reach of opcode END. Step 6: Check whether the
opcode read is present in the operation code table. Step 7: If the opcode is present, then the location counter
is incremented by 3. Step 8: If the opcode read is WORD, the location counter is incremented by3.
Step 9: If the opcode read is RESW, the operand value is multiplied by 3 and then the location counter is
incremented.
Step 10: If the opcode read is RESB, the location counter value is incremented by operand value.
Step 11: If the opcode read is BYTE, the location counter is auto incremented.
The length of the source program is found using the location counter value.
Step 12: stop.
PROGRAM
#include<stdio.h>
#include<string.h>
void main()
{
FILE *f1,*f2,*f3,*f4;
char s[100],lab[30],opcode[30],opa[30],opcode1[30],opa1[30];
int locctr,x=0;
f1=fopen("input.txt","r");
f2=fopen("opcode.txt","r");
f3=fopen("out1.txt","w");
f4=fopen("sym1.txt","w");
while(fscanf(f1,"%s%s%s",lab,opcode,opa)!=EOF)
{
if(strcmp(lab,"**")==0)
{
if(strcmp(opcode,"START")==0)
{
fprintf(f3,"%s %s %s",lab,opcode,opa);
locctr=(atoi(opa));
}
else
{
rewind(f2);
x=0;
while(fscanf(f2,"%s%s",opcode1,opa1)!=EOF)
{
if(strcmp(opcode,opcode1)==0)
{
x=1;
}
}
if(x==1)
{
fprintf(f3,"\n %d %s %s %s",locctr,lab,opcode,opa);
locctr=locctr+3;
}
}
}
else
{
if(strcmp(opcode,"RESW")==0)
COLLGE OF ENGINEERING KALLOOPPARAPage 75
System Software and Microprocessor Lab
{
fprintf(f3,"\n %d %s %s %s",locctr,lab,opcode,opa);
fprintf(f4,"\n %d %s",locctr,lab);
locctr=locctr+(3*(atoi(opa)));
}
else if(strcmp(opcode,"WORD")==0)
{
fprintf(f3,"\n %d %s %s %s",locctr,lab,opcode,opa);
fprintf(f4,"\n %d %s",locctr,lab);
locctr=locctr+3;
}
else if(strcmp(opcode,"BYTE")==0)
{
fprintf(f3,"\n %d %s %s %s",locctr,lab,opcode,opa);
fprintf(f4,"\n %d %s",locctr,lab);
locctr=locctr+1;
}
else if(strcmp(opcode,"RESB")==0)
{
fprintf(f3,"\n %d %s %s %s",locctr,lab,opcode,opa);
fprintf(f4,"\n %d %s",locctr,lab);
locctr=locctr+1;
}
else
{
fprintf(f3,"\n %d %s %s %s",locctr,lab,opcode,opa);
fprintf(f4,"\n %d %s",locctr,lab);
locctr=locctr+(atoi(opa));
}
}
}
}
INPUT FILES
input.txt
** START 2000
** LDA FIVE
** STA ALPHA
** LDCH CHARZ
** STCH C1
ALPHA RESW 1
FIVE WORD 5
COLLGE OF ENGINEERING KALLOOPPARAPage 76
System Software and Microprocessor Lab
OUTPUT FILES
out1.txt
** START 2000
2000 ** LDA FIVE
2003 ** STA ALPHA
2006 ** LDCH CHARZ
2009 ** STCH C1
2012 ALPHA RESW 1
2015 FIVE WORD 5
2018 CHARZ BYTE C'Z'
2019 C1 RESB 1
2020 ** END **
sym1.txt
2012 ALPHA
2015 FIVE
2018 CHARZ
2019 C1
Pgm.No.11
AIM
ALGORITHM
PROGRAM
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
char opcode[20],operand[20],symbol[20],label[20],code[20],mnemonic[25], character,
add[20],objectcode[20];
int flag,flag1,locctr,location,loc;
FILE *fp1,*fp2,*fp3,*fp4;
fp1=fopen("out3.txt","r"); fp2=fopen("twoout.txt","w");
fp3=fopen("opcode.txt","r"); fp4=fopen("sym1.txt","r");
fscanf(fp1,"%s%s%s",label,opcode,operand);
if(strcmp(opcode,"START")==0)
{ fprintf(fp2,"%s\t%s\t%s\n",label,opcode,operand);
fscanf(fp1,"%d%s%s%s",&locctr,label,opcode,operand);
}
while(strcmp(opcode,"END")!=0)
{ flag=0;
fscanf(fp3,"%s%s",code,mnemonic);
while(strcmp(code,"END")!=0)
{ if((strcmp(opcode,code)==0) && (strcmp(mnemonic,"*"))!=0)
{ flag=1;
break;
}
fscanf(fp3,"%s%s",code,mnemonic);
}
if(flag==1)
{ flag1=0; rewind(fp4);
while(!feof(fp4))
{
fscanf(fp4,"%s%d",symbol,&loc);
if(strcmp(symbol,operand)==0)
{
flag1=1; break;
}}
if(flag1==1)
{
sprintf(add,"%d",loc);
strcpy(objectcode,strcat(mnemonic,add));
}}
else if(strcmp(opcode,"BYTE")==0 || strcmp(opcode,"WORD")==0)
{
if((operand[0]=='C') || (operand[0]=='X'))
{
character=operand[2];
sprintf(add,"%d",character);
strcpy(objectcode,add);
}
else
{
strcpy(objectcode,add);
}}
else
strcpy(objectcode,"\0");
fprintf(fp2,"%s\t%s\t%s\t%d\t%s\n",label,opcode,operand,locctr,objectcode);
fscanf(fp1,"%d%s%s%s",&locctr,label,opcode,operand);
COLLGE OF ENGINEERING KALLOOPPARAPage 79
System Software and Microprocessor Lab
}
fprintf(fp2,"%s\t%s\t%s\t%d\n",label,opcode,operand,locctr);
fclose(fp1);
fclose(fp2);
fclose(fp3);
fclose(fp4);
}
INPUT FILES
opcode.txt
START *
LDA 03
STA 0F
LDCH 53
STCH 57
END +
out3.txt
** START 2000
2000 ** LDA FIVE
2003 ** STA ALPHA
2006 ** LDCH CHARZ
2009 ** STCH C1
2012 ALPHA RESW 1
2015 FIVE WORD 5
2018 CHARZ BYTE C'Z'
2019 C1 RESB 1
2020 ** END **
sym1.txt
2012 ALPHA
2015 FIVE
2018 CHARZ
2019 C1
OUTPUT FILES
twoout.txt
** START 2000
** LDA FIVE 2000 032018
** STA ALPHA 2003 0F2015
** LDCH CHARZ 2006 532019
** STCH C1 2009 572019
ALPHA RESW 1 2012
FIVE WORD 5 2015 2019
CHARZ BYTE C'Z' 2018 90
C1 RESB 1 2019
** END ** 2020
10. Write the steps required to translate the source program to object program.
• Convert mnemonic operation codes to their machine language
equivalents.
• Convert symbolic operands to their equivalent machine addresses
• Build the machine instruction in the proper format.
• Convert the data constants specified in the source program into their internal machine representation
• Write the object program and assembly listing.
11. What is the use of the variable LOCCTR (location counter) in assembler?
This variable is used to assign addresses to the symbols. LOCCTR is
initialized to the beginning address specified in the START statement. After each source statement is
processed the length of the assembled instruction or data area to be generated is added to LOCCTR and
hence whenever we reach a label in the source program the current value of
LOCCTR gives the address associated with the label.
12. Define load and go assembler.
One pass assembler that generates their object code in memory for
immediate execution is known as load and go assembler. Here no object programmer is written out and
hence no need for loader.
13. What are the two different types of jump statements used in MASM assembler?
• Near jump
A near jump is a jump to a target in the same segment and it is
assembled by using a current
code segment CS.
• Far jump
A far jump is a jump to a target in a different code segment and it is
assembled by using different segment registers .
17. Write down the pass numbers (PASS 1/ PASS 2) of the following activities that occur in a two pass
assembler:
a. Object code generation
b. Literals added to literal table
c. Listing printed
d. Address location of local symbols
Answer:
a. Object code generation - PASS 2
b. Literals added to literal table – PASS 1
c. Listing printed – PASS2
d. Address location of local symbols – PASS1
18. What is meant by machine independent assembler features?
The assembler features that do not depend upon the machine
architecture are known as machine independent assembler features.
Eg: program blocks, Literals.
• The source program written in assembly language or high level language will be converted to object
program, which is in the machine language form for execution.
• This conversion is either from assembler or from compiler, contains translated instructions and data
values from the source program, or specific addresses in primary memory where these items are to
be loaded for execution.
• This contain three processes:
1. Loading- It allocates memory location and brings the object program in to memory for execution.
2. Linking- It combines two or more separate object programs and supplies the information needed
to allow references between them.
3. Relocation- It modifies the object program so that it can be loaded at address different from the
location originally specified.
LOADER: It is a utility of an operating system. It copies program from a storage device to a computer’s
main memory, where the program can then be executed.
1. Read executable file’s header to determine the size of text and data segments.
2. Create new address space for the program.
3. Copies instructions and add data in to address space.
4. Copies arguments passed to the program on the stack.
5. Initializes the machine registers including the stack pointer.
6. Jumps to a start-up routine that copies the program’s arguments from the stack to registers and calls
the program’s main routine.
Types of Loader
ABSOLUTE LOADER
➢ It is also known as Bootstrap Loader.
➢ It is the simplest loader.
➢ It can read a machine language program from the specified back up storage and place it in memory
starting from a pre- determined address.
➢ Machine language program so loaded will work correctly only if it is loaded starting from the
specified address.
➢ Absolute type of loader is impractical, there are lots of complications involved in loading the
program.
➢ “Bootstrap loader” is an example of absolute loader.
Advantage:
o It simply performs input and output operation to load a program into the main memory.
o It is coded in very few machine instructions.
o Program is stored in the library in their ready to execute form. Such a library is called a Phase
Library.
Disadvantage:
o Programmer must explicitly specify the assembler the memory where the program is to be
loaded.
o Handling multiple subroutine become difficult since the programmer must specify the
address of the routines whenever they are referenced to perform subroutine linkage.
o When dealing with lots of subroutines the manual shuffling and re-shuffling of memory
address references in the routines become tedious and complex.
Design of Absolute Loader
➢ Because this loader is used in a unique situation, the program to be loaded can be represented in
very simple format:
i. Each byte of object code to be loaded is represented on device F1 as two hexadecimal digits.
ii. The object code from device F1 is always loaded into consecutive bytes of memory, starting
at address 80.
iii. After loading, the bootstrap jumps to address 80 to execute loaded program
Algorithm
➢ Clear the accumulator content.
➢ The index register ‘X’ is initialized to the hexadecimal value of 80.
➢ Test the input device to see if it is ready.
➢ When the input device becomes ready, read an ASCII character code.
➢ The input characters that have ASCII code less than hexadecimal 30 is skipped which will prevent
the bootstrap, from misinterpreting any control bytes as end of file marker.
➢ Convert the ASCII character code to hexadecimal digit.
➢ Save the hexadecimal digit in register ‘S’ and left shift it 4 bit position.
➢ Repeat the processing from step 4 to 6 to get the next character from the input device and convert it
to hexadecimal form.
➢ The hexadecimal value of the 2nd character read is added with the left shifted hexadecimal value of
the 1st character which is already stored in register ‘S’.
➢ The resultant byte is stored in the address currently in register ‘X’.
➢ Increment the value of index register by 1, to make it hold the next address location
➢ Repeat steps 3 to 11 until an end of the file is encountered.
➢ If the character read indicate the end of the file, jump to the starting location of the program just
loaded to begin the program execution.
Repeat the steps from 3 to 13 until there is no input
Pgm.No.12
ABSOLUTE LOADER
AIM
ALGORITHM
Step 1: Start
Step 2: Declare necessary variables
Step 3: Open input file in read mode
Step 4: Read the program name
Step 5: Read first line from the file until space occur
Step 6: Access the name from the line and put ‘\0’ at the end
Step 7: Display the name
Step 8: If program name and object name are same and then continue
Step 9: Read next line from file and check line [0]==’T’ then continue
Step 10: Read address into straddr[j] and put ‘\0’ at the end
Step 11: While line[i]!=’$’ then continue
Step 12: Convert address into integer, set i=12
Step 13: If line[i]!=’^’
Step 14: Display address, line, data and increment i by 2, go back to step 13
Step 15: Increment i by 1, go back to step 12
Step 16: If line[0]=’E’ then break
Step 17: Close the file
Step 18: Stop
PROGRAM
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
FILE *fp;
int i,addr1,l,j,staddr1;
char name[10],line[50],name1[10],addr[10],rec[10],ch,staddr[10];
fp=fopen("objectcode.txt","r");
fscanf(fp,"%s",line);
for(i=2,j=0;i<8,j<6;i++,j++)
name1[j]=line[i];
name1[j]='\0';
printf("name from obj. %s\n",name1);
if(strcmp(name,name1)==0)
{
fscanf(fp,"%s",line);
do
{
if(line[0]=='T')
{
for(i=2,j=0;i<8,j<6;i++,j++)
staddr[j]=line[i];
staddr[j]='\0';
staddr1=atoi(staddr);
i=12;
while(line[i]!='$')
{
if(line[i]!='^')
{
printf("00%d \t %c%c\n", staddr1,line[i],line[i+1]);
staddr1++;
i=i+2;
}
else i++;
}
}
else if(line[0]='E')
printf("jump to execution address:%s",&line[2]);
fscanf(fp,"%s",line);
}while(!feof(fp) );
}
fclose(fp);
}
objectcode.txt
H^SAMPLE^001000^0035
T^001000^0C^001003^071009$
T^002000^03^111111$
COLLGE OF ENGINEERING KALLOOPPARAPage 90
System Software and Microprocessor Lab
H^SAMPLE^001000^0035
T^001000^0C^001003^071009$
T^002000^03^111111$
E^001000
OUTPUT
Pgm.No.13
RELOCATING LOADER
AIM
PROGRAM
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
void convert(char h[12]);
char bitmask[12];
char bit[12]={0};
void main()
{char add[6],length[10],input[10],binary[12],relocbit,ch,pn[5];
int start,inp,len,i,address,opcode,addr,actualadd,tlen;
FILE *fp1,*fp2;
clrscr();
printf("\n\n Enter the actual starting address : ");
scanf("%x",&start);
fp1=fopen("RLIN.txt","r");
fp2=fopen("RLOUT.txt","w");
fscanf(fp1,"%s",input);
fprintf(fp2," ----------------------------\n");
fprintf(fp2," ADDRESS\tCONTENT\n");
fprintf(fp2," ----------------------------\n");
while(strcmp(input,"E")!=0)
{
if(strcmp(input,"H")==0)
{
fscanf(fp1,"%s",pn);
fscanf(fp1,"%x",add);
fscanf(fp1,"%x",length);
fscanf(fp1,"%s",input);
}
if(strcmp(input,"T")==0)
{
fscanf(fp1,"%x",&address);
fscanf(fp1,"%x",&tlen);
fscanf(fp1,"%s",bitmask);
address+=start;
convert(bitmask);
len=strlen(bit);
if(len>=11)
len=10;
for(i=0;i<len;i++)
{
fscanf(fp1,"%x",&opcode);
fscanf(fp1,"%x",&addr);
relocbit=bit[i];
if(relocbit=='0')
actualadd=addr;
else
actualadd=addr+start;
fprintf(fp2,"\n %x\t\t%x%x\n",address,opcode,actualadd);
address+=3;
}
fscanf(fp1,"%s",input);
}
}
fprintf(fp2," ----------------------------\n");
fcloseall();
printf("\n\n The contents of output file(RLOUT.TXT n\n");
fp2=fopen("RLOUT.txt","r");
COLLGE OF ENGINEERING KALLOOPPARAPage 92
System Software and Microprocessor Lab
ch=fgetc(fp2);
while(ch!=EOF)
{
printf("%c",ch);
ch=fgetc(fp2);
}
fclose(fp2);
getch();
}
void convert(char h[12])
{
int i,l;
strcpy(bit,"");
l=strlen(h);
for(i=0;i<l;i++)
{
switch(h[i])
{
case '0':
strcat(bit,"0");
break;
case '1':
strcat(bit,"1");
break;
case '2':
strcat(bit,"10");
break;
case '3':
strcat(bit,"11");
break;
case '4':
strcat(bit,"100");
break;
case '5':
strcat(bit,"101");
break;
case '6':
strcat(bit,"110");
break;
case '7':
strcat(bit,"111");
break;
case '8':
strcat(bit,"1000");
break;
COLLGE OF ENGINEERING KALLOOPPARAPage 93
System Software and Microprocessor Lab
case '9':
strcat(bit,"1001");
break;
case 'A':
strcat(bit,"1010");
break;
case 'B':
strcat(bit,"1011");
break;
case 'C':
strcat(bit,"1100");
break;
case 'D':
strcat(bit,"1101");
break;
case 'E':
strcat(bit,"1110");
break;
case 'F':
strcat(bit,"1111");
break;
}
}
}
INPUT file:
RLIN.TXT
OUTPUT
MACRO PROCESSORS
A macro instruction (macro) is a notational convenience for the programmer. It allow the
programmer to write a shorthand version of a program . A macro represents a commonly used group of
statements in the source programming language. It replaces each macro instruction with the corresponding
group of source language statements.
A macro processor Essentially involve the substitution of one group of characters or lines for
another. Normally, it performs no analysis of the text it handles. It doesn’t concern the meaning of the
involved statements during macro expansion The design of a macro processor generally is machine
independent.
label op operands
name MACRO parameters
:
body
:
MEND
Parameters: the entries in the operand field identify the parameters of the macro instruction . We require
each parameter begins with ‘&’
Body: the statements that will be generated as the expansion of the macro.
Prototype for the macro: The macro name and parameters define a pattern or prototype for the macro
instructions used by the programmer
Pgm.No.16
PROGRAM
#include<stdio.h>
#include<string.h>
void main()
{
fp1=fopen("inputm.txt","r");
fscanf(fp1,"%s%s%s",label,opcode,operand);
while(strcmp(opcode,"END")!=0)
{
if(!strcmp(opcode,"MACRO")){
fp[m]=fopen(operand,"w");
m++;
fscanf(fp1,"%s%s%s",label,opcode,operand);
while(strcmp(opcode,"MEND")!=0){
fprintf(fp[m-1],"%s\t%s\t%s\n",label,opcode,operand);
fscanf(fp1,"%s%s%s",label,opcode,operand);
}
}
fscanf(fp1,"%s%s%s",label,opcode,operand);
}
}
INPUT FILES
inputm.txt
** MACRO m1
** LDA ALPHA
** STA BETA
** MEND **
** MACRO m2
** MOV a,b
** MEND **
** START 1000
** LDA a
** CALL m1
** CALL m2
** END **
OUTPUT FILES
m1.txt
** LDA ALPHA
** STA BETA
m2.txt
** MOV a,b
ALGORITHM
Step 1: Start
Step 2: Declare necessary variables
Step 3: Open input.c in read mode and output,c in write mode
Step 4: Read first character from input.c
Step 5: While ch!=EOF do
Step 6: If ch==’#’ then continue otherwise go to step 16
Step 7: Call subfunction valid(ch) to check ch is valid or not.if valid continue, otherwise go to step 8
Step 8: Assign ch into a[j],j++,get next character and go back to step 7 Step 9: If ch is invalid, then set
a[j]=’\0’,j=0
Step10: Check if a[]=define then read next word file and check valid otherwise go to step15
Step11: While valid(ch) is true,then set b[i][j]=ch,j++,ch=getc(fp)
Step12: Otherwise b[i][j]=’\0’ and j=0
Step 13: Read next character and call valid()
Step 14: If valid of ch is true, then assign the macro value into array called c[]
Step 15: Write character into output file and continue fetching by set j=0
Step 16: Write character into output
Step 17: Read next word in d[j] and compare with b[j]
Step 18: Read whitespaces and symbols and save into output file
Step 19: If both matches then go to step 21
Step 20: Replace the macroname with value
Step 21: Stop
PROGRAM
#include<stdio.h>
#include<string.h>
void main()
{
fp1=fopen("inputm.txt","r");
fp2=fopen("macro_out.txt","w");
fscanf(fp1,"%s%s%s",label,opcode,operand);
while(strcmp(opcode,"END")!=0)
{
if(!strcmp(opcode,"CALL"))
{
fp[m]=fopen(operand,"r");
m++;
fscanf(fp[m-1],"%s%s%s",label,opcode,operand);
while(!feof(fp[m-1]))
{
fprintf(fp2,"%s\t%s\t%s\n",label,opcode,operand);
fscanf(fp[m-1],"%s%s%s",label,opcode,operand);
}
}
else
{
fprintf(fp2,"%s\t%s\t%s\n",label,opcode,operand);
}
fscanf(fp1,"%s%s%s",label,opcode,operand);
}
fprintf(fp2,"%s\t%s\t%s\n",label,opcode,operand);
}
INPUT FILES
inputm.txt
** MACRO m1
** LDA ALPHA
** STA BETA
** MEND **
** MACRO m2
** MOV a,b
COLLGE OF ENGINEERING KALLOOPPARAPage 99
System Software and Microprocessor Lab
** MEND **
** START 1000
** LDA a
** CALL m1
** CALL m2
** END **
OUTPUT FILES
m1.txt
** LDA ALPHA
** STA BETA
m2.txt
** MOV a,b
output file
** MACRO m1
** LDA ALPHA
** STA BETA
** MEND **
** MACRO m2
** MOV a,b
** MEND **
** START 1000
** LDA a
** END **
Pgm.No.17
AIM
PROGRAM
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include<string.h>
int m=0,i,j,flag=0;
char c,*s1,*s2,*s3,*s4,str[50]=" ",str1[50]=" ";
char mac[10][10];
void main()
{
FILE *fpm=fopen("macro.txt","r");
FILE *fpi=fopen("minput.txt","r");
FILE *fpo=fopen("moutput.txt","w");
clrscr();
while(!feof(fpm))
{
fgets(str,50,fpm);
s1=strtok(str," ");
s2=strtok(NULL," ");
if(strcmp(s1,"MACRO")==0)
{
strcpy(mac[m],s2);
m++;
}
s1=s2=NULL;
}
fgets(str,50,fpi);
while(!feof(fpi))
{
flag=0;
strcpy(str1,str);
for(i=0;i<m;i++)
{
if(strcmp(str1,mac[i])==0)
{
rewind(fpm);
while(!feof(fpm))
{
fgets(str,50,fpm);
s2=strtok(str," ");
s3=strtok(NULL," ");
if(strcmp(s2,"MACRO")==0&&strcmp(s3,str1)==0)
{
fgets(str,50,fpm);
strncpy(s4,str,4);
s4[4]='\0';
while(strcmp(s4,"MEND")!=0)
{
fprintf(fpo,"%s",str);
printf("\n####%s",str);
fgets(str,50,fpm);
strncpy(s4,str,4);
s4[4]='\0';
}
COLLGE OF ENGINEERING KALLOOPPARAPage 101
System Software and Microprocessor Lab
}
}
flag=1;
break;
}
}
if(flag==0)
{
fprintf(fpo,"%s",str);
printf("%s",str);
}
fgets(str,50,fpi);
}
fclose(fpm);
fclose(fpi);
fclose(fpo);
}
INPUT FILES
Macro.txt
MACRO ADD1
MOV A,B
ADD C
MEND
MACRO SUB1
STORE C
MEND
MInput.txt
MOV B,10
MOV C,20
ADD1
MUL C
SUB1
END
OUTPUT
MOutput.txt
MOV B,10
MOV C,20
COLLGE OF ENGINEERING KALLOOPPARAPage 102
System Software and Microprocessor Lab
MOV A,B
ADD C
MUL C
STORE C
END
VIVA QUESTIONS
16. What are the important factors considered while designing general purpose macro processors?
• comments
• grouping of statements
• tokens
• syntax used for macro definitions
The Microsoft macro assembler is an assembler for the x86 family of microprocessors.It was
originally produced by Microsoft for development work on their MS-DOS operating system and was for
some time the most popular assembler available for that operating system.
mount c c:\masm
edit pgmname.asm
masm pgmname.asm
link pgmname.obj
debug pgmname.exe
DEBUG COMMANDS
It has a number of commands to facilitate users to write, execute and debug programs. A DEBUG
command is represented by one letter symbol. DEBUG commands are not case sensitive.
➢ A – Assemble command : It allows users to enter assembly language program and convert it into
machine code.
Syntax: A[offset-address]
➢ U – Unassemble command : It disassemble machinecodes of specified memory addresses and give
ninemonics
Syntax: U [address-range]
➢ R – Register Command : Used to display the contents of one or more registers.It also displaythe
status of flags.
➢ G – Go Commands: It is used to execute a program
Syntax: G[= address]
➢ T - Trace command: It is used to runa program in single step mode.
Syntax: T= address [step]
➢ D – Display or Dump command : It is used to display the contents of specified locations
Syntax: D address – range or D –address
➢ E – Enter command: It is used to enter the data or mahine code. It default register.
Syntax: E –address
➢ F – Fill command: It is used to fill specified range of locations with the values given in a list.
➢ M – Move command : It copies the block of data from one memory area to another
Synatx: M range address
DIRECTIVES
• DB – Define Byte : It defines a byte type variable. It directs the assembler to reserve one byte
of memory and initialise it with a specified value. It candefine single or multiple variables.
Example: Temperature DB 10, Temp DB 100 DUP (?)
• DW – Define Word : It directs assembler to reserve two bytes of memory and initialise it
with specified value.
Example: Temp DW 1234H, TEMP DW 2 DUP (0)
• DQ – Define Quad Word: It defines aquad word type varaiable. It directs assembler to
reserve eight byte of memory.
Example: Temp DQ12345678
• EXTERN – External: It tells the assembler that names or labels following the directives are
some other assembly module.
Example: EXTERN Temperature: word
• PUBLIC – It informs the assembler that the defined name or label can be accessed from other
program modules.
Example : PUBLIC Temperature 1, Temperature?
• SEGMENT – It indicate the beginning of a logical segment
Syntax: Segment name SEGMENT [word/public]
• ENDS - ENDP , It indicate the end of procedure and segment
Synatx: Procedure name ENDP , segment name ENDS.
• END : It indicates the end of a program.
• EQU : It assign name to some value.
Example: TEMP EQU 04H
• ASSUME : This tells the assembler the name of a logical segment which is to be used for a
specific segment.
ASSUME CS: CODE, DS:DATA
• ORG:It tells the assembler to assign address, to data items or instructions in a program.
Example: ORG 0100H
• STRUCT or STRUE : It is used to define the start of a data structure.
• PTR: It is an operator. It points the type of memory access.
Example: MOV byte Ptr [bx], 58h
• LENGTH: It tells the assembler to determine the number of elements in a specified variable.
Example: Mov cx, length arry 1
COLLGE OF ENGINEERING KALLOOPPARAPage 107
System Software and Microprocessor Lab
Pgm.No.18
16 BIT ADDITION
PROGRAM:
DATA SEGMENT
N1 DW 1731H
N2 DW 9212H
N3 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS :CODE;DS:DATA
START:
MOV AX,DATA
MOV DS,AX
XOR AX,AX
COLLGE OF ENGINEERING KALLOOPPARAPage 108
System Software and Microprocessor Lab
MOV BX,AX
MOV AX,N1
ADD AX,N2
MOV N3,AX
JNC STOP
INC BX
STOP:
MOV CX,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
OUTPUT
32 BIT ADDITION
PROGRAM:
DATA SEGMENT
LIST DD 12121212H,12121212H
N3 DW ?
N4 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS :CODE;DS:DATA
START:
MOV AX,DATA
MOV DS,AX
XOR AX,AX
MOV CL,AL
MOV AX,[SI]
ADD AX,[SI+4]
MOV BX,AX
MOV N3,BX
MOV AX,[SI+2]
ADD AX,[SI+6]
MOV DX,AX
MOV N4,DX
JNC STOP
INC CL
STOP:
MOV AX,4CH
INT 21H
CODE ENDS
COLLGE OF ENGINEERING KALLOOPPARAPage 110
System Software and Microprocessor Lab
END START
OUTPUT
16 BIT SUBTRACTION
PROGRAM:
DATA SEGMENT
N1 DW 8888H
N2 DW 4444H
N3 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS :CODE;DS:DATA
START:
MOV AX,DATA
MOV DS,AX
XOR AX,AX
MOV BX,AX
MOV AX,N1
SUB AX,N2
MOV N3,AX
JNC STOP
INC BX
STOP:
MOV CX,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
OUTPUT
32 BIT SUBTRACTION
PROGRAM:
DATA SEGMENT
LIST DD 12121212H,12121212H
N3 DW ?
N4 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS :CODE;DS:DATA
START:
MOV AX,DATA
MOV DS,AX
XOR AX,AX
MOV CL,AL
MOV AX,[SI]
ADD AX,[SI+4]
MOV BX,AX
MOV N3,BX
MOV AX,[SI+2]
ADD AX,[SI+6]
MOV DX,AX
MOV N4,DX
JNC STOP
INC CL
STOP:
MOV AX,4CH
INT 21H
CODE ENDS
COLLGE OF ENGINEERING KALLOOPPARAPage 113
System Software and Microprocessor Lab
END START
OUTPUT
16 BIT MULTIPLICATION
PROGRAM:
DATA SEGMENT
N1 DW 8888H
N2 DW 4444H
N3 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS :CODE;DS:DATA
START:
MOV AX,4343
MOV BX,1111
INT 3
CODE ENDS
END START
OUTPUT
Pgm.No.19
STRING DISPLAY
AIM
PROGRAM
DATA SEGMENT
DATA ENDS
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX
MOV AH,09H
INT 21H
MOV AH,4CH
MOV AL,00H
INT 21H
CODE ENDS
END START
OUTPUT
Pgm.No.20
STRING CONCATENATE
AIM
PROGRAM
DATA SEGMENT
MSG1 DB "HELLO$"
MSG2 DB "WORLD$"
DATA ENDS
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX
MOV AH,09H
INT 21H
MOV AH,09H
INT 21H
CODE ENDS
END START
OUTPUT
Pgm.No.21
SORTING
AIM
PROGRAM:
DATA SEGMENT
STRING1 DB 99H,12H,56H,45H,36H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MOV DS,AX
MOV CH,04H
LEA SI,STRING1
UP1:MOV AL,[SI]
MOV BL,[SI+1]
CMP AL,BL
JNC DOWN
MOV DL,[SI+1]
XCHG [SI],DL
MOV [SI+1],DL
DOWN: INC SI
DEC CL
JNZ UP1
DEC CH
JNZ UP2
INT 3
CODE ENDS
END START
OUTPUT
Pgm.No.22
SEARCHING
AIM
PROGRAM:
DATA SEGMENT
STRING1 DB 11H,22H,33H,44H,55H
MSG1 DB "FOUND$"
SE DB 33H
DATA ENDS
INT 21H
INT 3
ENDM
CODE SEGMENT
START:
MOV DS, AX
MOV AL, SE
UP:
MOV BL,[SI]
CMP AL, BL
JZ FO
INC SI
DEC CX
JNZ UP
PRINT MSG2
JMP END1
FO:
PRINT MSG1
END1:
INT 3
CODE ENDS
END START
OUTPUT
8086
16 bit addition
16 bit subtraction
BCD to hexadecimal conversion
Sorting in ascending order
Pgm.No.23
ADDITION-16 BIT
AIM
PROGRAM
ADDRESS MNEMONICS
INPUT
ADDRESS VALUE
0500 B5
0501 7A
0550 2A
0551 E6
OUTPUT
ADDRESS VALUE
0600 DF
0601 5F
0602 01
Pgm.No.24
SUBTRACTION-16 BIT
AIM
PROGRAM
ADDRESS MNEMONICS
0400 CLC
0401 MOV BX,0900
0404 MOV SI,0700
0407 MOV DI,0800
040A MOV AX,[SI]
040C SSB AX,[DI]
040E MOV [BX],AX
0410 HLT
INPUT
ADDRESS VALUE
0700 18
0701 08
0800 40
0801 10
OUTPUT
ADDRESS VALUE
0900 D8
0901 F7
Pgm.No.25
MULTIPLICATION-16 BIT
AIM
PROGRAM
ADDRESS MNEMONICS
2008 MUL BX
2014 HLT
INPUT
ADDRESS VALUE
3003 07
3002 08
3001 04
3000 03
OUTPUT
ADDRESS VALUE
3007 00
3006 1C
3005 35
3004 18
Pgm.No.26
SORTING-ASCENDING (check descending from the maual)
AIM
PROGRAM
ADDRESS MNEMONICS
400 MOV SI, 500
403 MOV CL, [SI]
405 DEC CL
407 MOV SI, 500
40A MOV CH, [SI]
40C DEC CH
40E INC SI
40F MOV AL, [SI]
411 INC SI
412 CMP AL, [SI]
414 JC 41C
416 XCHG AL, [SI]
418 DEC SI
419 XCHG AL, [SI]
41B INC SI
41C DEC CH
41E JNZ 40F
420 DEC CL
422 JNZ 407
424 HLT
INPUT
ADDRESS VALUE
500 04
501 F9
502 F2
503 39
504 05
OUTPUT
ADDRESS VALUE
501 05
502 39
503 F2
504 F9
Pgm.No.26
BCD TO HEXADECIMAL
AIM
Write a program to perform conversion of 8 bit BCD number into hexadecimal number
PROGRAM
ADDRESS MNEMONICS
400 MOV SI, 500
403 MOV DI, 600
406 MOV BL, [SI]
408 AND BL, 0F
040A MOV AL, [SI]
040C AND AL, F0
040E MOV CL, 04
410 ROR AL, CL
412 MOV DL, 0A
414 MUL DL
416 ADD AL, BL
418 MOV [DI], AL
041A HLT
INPUT
ADDRESS VALUE
500 25
OUTPUT
ADDRESS VALUE
600 19
Pgm.No.27
ASCII TO BCD
AIM
Write a program to perform conversion of ASCII(in hex) value of number to its BCD(decimal) number
BCD 00 01 02 03 04 05 06 07 08 09
PROGRAM
MOV AL,[2050]
AND AL,0F
MOV [3050],AL
HLT
INPUT
ADDRESS VALUE
2050 39
OUTPUT
ADDRESS VALUE
3050 09
Pgm.No.28
BCD TO ASCII
AIM
PROGRAM
ADDRESS MNEMONICS
413 HLT
INPUT
ADDRESS VALUE
2000 98
OUTPUT
ADDRESS VALUE
3000 38
3001 39