In: Computer Science
Write an assembly language program that reads move review information from a text file and reports the overall scores for each movie as well as identifying the movie with the highest total score. There are four movie reviewers numbered from 1 to 4. They are submitting reviews for five movies, identified by the letters from “A” through “E”. Reviews are reported by using the letter identifying the movie, the review rating, which is a number from 0 to 100, and the reviewer’s identifying number. For example, to report that movie B was rated a score of 87 by reviewer 3, there will be a line in the text file that looks like this:
B,87,3
The fields within each record are separated from each other by a comma.
Your program must store the movie review scores in a two-dimensional array (4 rows by 5 columns). Each row represents a reviewer. Each column represents a movie. Initialize the array to zeroes and read the movie review information from a file. After reading and processing the whole file, display a report that shows the total score for each movie and the movie that had the highest total score.
Section 9.4 of our textbook discusses two-dimensional arrays. Section 9.4.2 discusses Base-Index Operands and even contains an example of how to calculate a row sum for a two-dimensional array.
Chapter 11 contains an example program named ReadFile.asm that will show you how to prompt the user for a file name, open a file, read its contents, and close the file when you are done. Look in section 11.1.8, Testing the File I/O Procedures.
Each record in a text file is terminated by the two characters, Carriage Return (0Dh) and Line Feed (0Ah).
Assume that you wish to process a text file named “reviews.txt” that is stored on the “C:” drive in the “Data” folder. If you are using a Windows computer, you have two ways to identify the path to the file’s location:
C:/Data/reviews.txt OR C:\\Data\\reviews.txt
Double backslash characters (\) are needed because a single backslash is defined as being the first part of an escape sequence such as newline (\n).
This code can be used to load a reviewer’s score into the array of movie reviews:
; Insert score at reviews[rowIndex][colIndex]
mov edx,rowSize ; row size in bytes
mov eax,rowIndex ; row index
mul edx ; row index * row size
mov index,eax ; save row index * row size
mov eax,colIndex ; load col index
shl eax,2 ; eax = colIndex * 4
add eax,index ; eax contains offset
mov edx,score ; edx = reviewer's score
mov ebx,OFFSET reviews ; array of review scores
mov [ebx + eax],edx ; Store score for movie
Sample Data for Review.txt
D,84,2 A,90,3 A,87,4 B,35,4 B,100,1 C,75,1 D,84,1 B,87,2 A,0,2 C,25,2 D,45,3 E,35,3 A,90,1 B,100,3 C,75,3 E,35,1 C,78,4 E,35,2 D,100,4 E,0,4
;Included the irvine library as stated
INCLUDE Irvine32.
INC .DATA ;size of the array is declared as stated SizeOfMyColumn=5
;indicates the cloumn size SizeOfMyRow=4 ;indicates size of
row
SerialNum DWORD 0 ; serial number is defined
quaNum DWORD 0 ; quantity number is defined
ProductNum DWORD 0 ;product number is defined ask BYTE "Enter
Salespersons num, quantity sold, product num(press _ve num to end
the LOOP): ",0
My1stMessage BYTE "Required Martix is printed",0 My2ndMessage BYTE
"The total sales for salesperson ",0 My3rdMessage BYTE "The total
sales for product ",0 ;
The array value is initilized to 0 MySale
DWORD 0,0,0,0,0
DWORD 0,0,0,0,0
DWORD 0,0,0,0,0
DWORD 0,0,0,0,0 .
CODE ;
this marks the code area of program main PROC ;
main program starts here
readUserInput: ;
program will be termnated when negative number is entered MOV
ebx,
OFFSET MySale MOV edx,
OFFSET ask CALL writestring CALL
crlf CALL
readInt ;
it will get salesman number as integer MOV [SerialNum],eax ;
it will save salesman number into SerialNum cmp eax,0 ;
if negative number entered jl noMoreInput ;
exit the LOOP and stop input CALL readInt MOV [quaNum],eax CALL
readInt MOV [ProductNum],eax ;
this will save the sales into matrix MOV eax,SerialNum dec eax MOV
edi,SizeOfMyColumn MUL edi MOV edi,ProductNum dec edi ADD eax,edi
MOV edi,TYPE DWORD MUL edi ADD ebx,eax MOV eax,quaNum MOV [ebx],eax
;
it will store the quaNum value into matrix jmp readUserInput
;
it will run the program until negative number entered ;
If input value is entered noMoreInput: ;
output the sales matrix
MOV edx,
OFFSET My1stMessage CALL writestring ;
New line is printed
CALL crlf
MOV ecx,
SizeOfMyRow*SizeOfMyColumn MOV ebx,
OFFSET MySale MOV esi,
0 MygetTheValue: ;
gets every values from the matrix
MOV eax,[ebx+esi] ; value is prined
CALL WriteDec
MOV al,32 ; al= ascii of space character ;
it will print space CALL WriteChar
ADD esi,4 ; it prints only five values th the row cdq
MOV eax,esi
MOV edi,20 DIV edi cmp edx,0 jne next
CALL crlf ;
new line is printed next:
LOOP MygetTheValue
MOV ecx,SizeOfMyRow ;
salesmen's sale is printed
MOV esi,0 MOV edi,1
DisplaySales:
MOV ebx,OFFSET MySale
MOV edx,OFFSET My2ndMessage
CALL writestring
MOV eax,edi
CALL WriteDec MOV al,':' CALL WriteChar CALL crlf ;new line is
printed MOV eax,esi CALL sumOfRow CALL WriteDec CALL crlf INC esi
INC edi LOOP DisplaySales CALL crlf ; Display sales for each
product MOV ecx,SizeOfMyColumn MOV esi,0 MOV edi,1
DisplayProductSales: MOV ebx,OFFSET MySale MOV edx,OFFSET
My3rdMessage CALL writestring MOV eax,edi CALL WriteDec MOV al,':'
CALL WriteChar CALL crlf MOV eax,esi CALL sumOfColmn CALL WriteDec
CALL crlf INC esi INC edi LOOP DisplayProductSales CALL crlf exit
main ENDP ;this function will complete the sum of the row sumOfRow
PROC USES ebx ecx edx esi edi MOV edi,SizeOfMyRow INC edi MUL edi
MOV edi,TYPE DWORD MUL edi ADD ebx,eax ; it will store the starting
address of the row MOV eax,0 ; store sum=0 MOV esi,0 ; store
index=0 MOV ecx , SizeOfMyColumn ; it is created to count the loop
L1: ; LOOP starts here MOV edx,[ebx+esi] ; it will take the row
value ADD eax,edx ; row's value is ADDed to the sum ADD esi,4 ;
increment of the index up to the point ;here starts the next value
of the row LOOP L1 ; continue until ecx is not 0 RET ; it will
return ths main sumOfRow ENDP ;it will performs the sum of the
column sumOfColmn PROC USES ebx ecx edx esi edi MOV edi,TYPE DWORD
MUL edi ADD ebx,eax ; it will store the starting address of the
column MOV eax,0 ; store sum=0 MOV esi,0 ; store index=0 MOV ecx ,
SizeOfMyRow ; it is created to count the LOOP L2: ;LOOP satrts here
MOV edx,[ebx+esi] ; it will take the row value ADD eax,edx ; row's
value is added to the sum push eax MOV eax,SizeOfMyColumn MOV
edi,TYPE DWORD MUL edi ADD esi,eax POP eax LOOP L2 ; LOOP is
repeated until ecx value RET ; return to main and is not equal to
zero sumOfColmn ENDP END main ;
end of main
and this is the end of the program