Initial revision
commit
870b4bb8d0
|
@ -0,0 +1,175 @@
|
|||
; twocalc.asm
|
||||
; Andrew Coleman
|
||||
; This contains several algorithms for performing calculations on
|
||||
; two dimensional matrices.
|
||||
include irvine32.inc
|
||||
|
||||
MAXIMUM_COLUMN_SIZE = 10
|
||||
|
||||
.data
|
||||
|
||||
matrix_row_length dword 4 * MAXIMUM_COLUMN_SIZE
|
||||
element_input_message byte "Enter matrix element: ",0
|
||||
left_coordinate_message byte "(",0
|
||||
middle_coordinate_message byte ",",0
|
||||
right_coordinate_message byte ")",0
|
||||
|
||||
.code
|
||||
|
||||
; Fills a matrix with user supplied values.
|
||||
; Arguments:
|
||||
; 1. address of array
|
||||
; 2. address of the row counting variable
|
||||
; 3. address of the column counting variable
|
||||
PopulateMatrixWithUserValues proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov edi, [ebp + 08h]
|
||||
mov ebx, 0
|
||||
StartMatrixElementRow:
|
||||
mov esi, edi
|
||||
mov ecx, 0
|
||||
GetMatrixElement:
|
||||
mov edx, offset left_coordinate_message
|
||||
call writeString
|
||||
mov eax, ebx
|
||||
call writeInt
|
||||
mov edx, offset middle_coordinate_message
|
||||
call writeString
|
||||
mov eax, ecx
|
||||
call writeInt
|
||||
mov edx, offset right_coordinate_message
|
||||
call writeString
|
||||
mov edx, offset element_input_message
|
||||
call writeString
|
||||
call readInt
|
||||
mov [esi], eax
|
||||
add esi, 4
|
||||
inc ecx
|
||||
mov eax, [ebp + 10h]
|
||||
cmp ecx, [eax]
|
||||
jl GetMatrixElement
|
||||
inc ebx
|
||||
mov eax, [ebp + 0Ch]
|
||||
cmp ebx, [eax]
|
||||
je FinishUpMatrixInputAndReturn
|
||||
add edi, matrix_row_length
|
||||
jmp StartMatrixElementRow
|
||||
FinishUpMatrixInputAndReturn:
|
||||
popad
|
||||
pop ebp
|
||||
ret 12
|
||||
PopulateMatrixWithUserValues endp
|
||||
|
||||
; CountPositiveMatrixElements counts the number of elements greater than 0
|
||||
; Arguments:
|
||||
; 1. Address of array
|
||||
; 2. Address of row counter
|
||||
; 3. Address of column counter
|
||||
; 4. Address of result counter
|
||||
CountPositiveMatrixElements proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov edi, [ebp + 08h]
|
||||
mov eax, [ebp + 0Ch]
|
||||
mov edx, [eax]
|
||||
xor esi, esi
|
||||
BeginCountingElementsInRow:
|
||||
push edi
|
||||
mov eax, [ebp + 10h]
|
||||
mov ecx, [eax]
|
||||
CountInRow:
|
||||
mov eax, [edi]
|
||||
cmp eax, 0
|
||||
jl FinishUpElementAndContinueCounting
|
||||
inc esi
|
||||
FinishUpElementAndContinueCounting:
|
||||
add edi, 4
|
||||
dec ecx
|
||||
jg CountInRow
|
||||
pop edi
|
||||
add edi, matrix_row_length
|
||||
dec edx
|
||||
jg BeginCountingElementsInRow
|
||||
mov eax, [ebp + 14h]
|
||||
mov [eax], esi
|
||||
popad
|
||||
pop ebp
|
||||
ret 16
|
||||
CountPositiveMatrixElements endp
|
||||
|
||||
; SumMatrixDiagonalSquares
|
||||
; Arguments:
|
||||
; 1. Address of array
|
||||
; 2. Address of dimension
|
||||
; 3. Address of result counter
|
||||
SumMatrixDiagonalSquares proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov edi, [ebp + 08h]
|
||||
mov eax, [ebp + 0Ch]
|
||||
mov ecx, [eax]
|
||||
xor esi, esi
|
||||
DiagonalCount:
|
||||
mov eax, [edi]
|
||||
imul eax
|
||||
add esi, eax
|
||||
add edi, matrix_row_length
|
||||
add edi, 4
|
||||
dec ecx
|
||||
jg DiagonalCount
|
||||
mov eax, [ebp + 10h]
|
||||
mov [eax], esi
|
||||
popad
|
||||
pop ebp
|
||||
ret 12
|
||||
SumMatrixDiagonalSquares endp
|
||||
|
||||
; SumMatrices
|
||||
; Arguments
|
||||
; 1. Address of first matrix
|
||||
; 2. Address of second matrix
|
||||
; 3. Address of third matrix
|
||||
; 4. Address of row counter
|
||||
; 5. Address of column counter
|
||||
SumMatrices proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov edi, [ebp + 08h]
|
||||
mov esi, [ebp + 0Ch]
|
||||
mov edx, [ebp + 10h]
|
||||
mov eax, [ebp + 14h]
|
||||
mov ebx, [eax]
|
||||
StartMatrixRow:
|
||||
mov eax, [ebp + 18h]
|
||||
mov ecx, [eax]
|
||||
push edi
|
||||
push esi
|
||||
push edx
|
||||
CalculateMatrixRow:
|
||||
mov eax, [edi]
|
||||
add eax, [esi]
|
||||
mov [edx], eax
|
||||
add edi, 4
|
||||
add esi, 4
|
||||
add edx, 4
|
||||
dec ecx
|
||||
jg CalculateMatrixRow
|
||||
pop edx
|
||||
pop esi
|
||||
pop edi
|
||||
add edx, matrix_row_length
|
||||
add esi, matrix_row_length
|
||||
add edi, matrix_row_length
|
||||
dec ebx
|
||||
jg StartMatrixRow
|
||||
popad
|
||||
pop ebp
|
||||
ret 20
|
||||
SumMatrices endp
|
||||
|
||||
end
|
|
@ -0,0 +1,11 @@
|
|||
@echo off
|
||||
set MASM=C:\Masm615
|
||||
set PATH=%PATH%;%MASM%
|
||||
set INCLUDE=%MASM%\include
|
||||
set LIB=%MASM%\lib
|
||||
|
||||
ml -Zi -c -Fl -coff three.asm threecalc.asm threefile.asm
|
||||
if errorLevel 1 goto endp
|
||||
link32 three.obj threecalc.obj threefile.obj irvine32.lib kernel32.lib /subsystem:console /debug
|
||||
|
||||
:endp
|
|
@ -0,0 +1,255 @@
|
|||
include irvine32.inc
|
||||
|
||||
CR=0Dh
|
||||
LF=0Ah
|
||||
NULL=0
|
||||
|
||||
.data
|
||||
|
||||
; simple numbers to keep track of various bits of information about the array
|
||||
array dword 100 dup (?)
|
||||
avg dword ?
|
||||
pdelt dword ?
|
||||
ndelt dword ?
|
||||
dev dword ?
|
||||
numa dword ?
|
||||
numb dword ?
|
||||
numc dword ?
|
||||
numd dword ?
|
||||
numf dword ?
|
||||
n dword ?
|
||||
gradereport dword ?
|
||||
|
||||
; string messages for I/O
|
||||
imsg byte "input a number or 999 to quit: ",NULL
|
||||
mainmsg byte CR,LF,"array analysis",CR,LF,NULL
|
||||
minmsg byte "minimum value: ",NULL
|
||||
maxmsg byte "maximum value: ",NULL
|
||||
summsg byte "sum of values: ",NULL
|
||||
avgmsg byte "avg of values: ",NULL
|
||||
posmsg byte "most positive change from x[i] to x[i+1]: ",NULL
|
||||
negmsg byte "most negative change from x[i] to x[i+1]: ",NULL
|
||||
devmsg byte "average deviation from mean: ",NULL
|
||||
amsg byte "Number of A's ",NULL
|
||||
bmsg byte "Number of B's ",NULL
|
||||
cmsg byte "Number of C's ",NULL
|
||||
dmsg byte "Number of D's ",NULL
|
||||
fmsg byte "Number of F's ",NULL
|
||||
nogrademsg byte "This is not a grade report",CR,LF,NULL
|
||||
goodbyemsg byte "Goodbye",CR,LF,NULL
|
||||
|
||||
.code
|
||||
|
||||
main proc
|
||||
|
||||
; counter
|
||||
mov ecx, 0
|
||||
; average
|
||||
mov avg, 0
|
||||
; values for max / min
|
||||
mov edi, 0
|
||||
mov edx, 0
|
||||
; values for pos / neg delt
|
||||
mov pdelt, 0
|
||||
mov ndelt, 0
|
||||
; sum of values
|
||||
mov ebx, 0
|
||||
; array pointer
|
||||
mov esi, offset array
|
||||
; flag for gradereport
|
||||
mov gradereport, 0
|
||||
|
||||
; read in all numbers, find maximum, find minimum, add sum, calc average, and determine if a grade report is needed
|
||||
ReadAnotherInt:
|
||||
push edx
|
||||
mov edx, offset imsg
|
||||
call writeString
|
||||
call readInt
|
||||
pop edx
|
||||
cmp eax, 999
|
||||
je CheckForValidity
|
||||
inc ecx
|
||||
mov [esi], eax
|
||||
add ebx, eax
|
||||
cmp eax, edx
|
||||
jg SetMax
|
||||
jmp CheckMinimum
|
||||
SetMax:
|
||||
mov edx, eax
|
||||
CheckMinimum:
|
||||
cmp ecx, 1
|
||||
jg CheckMinimum2
|
||||
mov edi, eax
|
||||
jmp DoneMaxMinCheck
|
||||
CheckMinimum2:
|
||||
cmp eax, edi
|
||||
jg DoneMaxMinCheck
|
||||
mov edi, eax
|
||||
DoneMaxMinCheck:
|
||||
cmp ecx, 1
|
||||
jle ReadAnotherInt2
|
||||
sub eax, [esi-04h]
|
||||
cmp eax, edi
|
||||
jge CheckPosDelt
|
||||
mov ndelt, eax
|
||||
jmp ReadAnotherInt2
|
||||
CheckPosDelt:
|
||||
cmp eax, pdelt
|
||||
jle CheckMinDelt
|
||||
mov pdelt, eax
|
||||
CheckMinDelt:
|
||||
cmp eax, ndelt
|
||||
jg ReadAnotherInt2
|
||||
mov ndelt, eax
|
||||
ReadAnotherInt2:
|
||||
add esi, 4
|
||||
jmp ReadAnotherInt
|
||||
|
||||
; only calculate things if someone entered some values
|
||||
CheckForValidity:
|
||||
mov n, ecx
|
||||
cmp ecx, 0
|
||||
jg DisplayMaxMin
|
||||
jmp GoodBye
|
||||
|
||||
; show all the maximums and minimums that the program has calculated
|
||||
DisplayMaxMin:
|
||||
push edx
|
||||
mov edx, offset mainmsg
|
||||
call writeString
|
||||
mov edx, offset maxmsg
|
||||
call writeString
|
||||
pop edx
|
||||
mov eax, edx
|
||||
call writeInt
|
||||
call Crlf
|
||||
cmp edx, 100
|
||||
jg ContinueWithDisplayMaxMin
|
||||
cmp edi, 0
|
||||
jl ContinueWithDisplayMaxMin
|
||||
mov gradereport, 1
|
||||
ContinueWithDisplayMaxMin:
|
||||
mov edx, offset minmsg
|
||||
call writeString
|
||||
mov eax, edi
|
||||
call writeInt
|
||||
call Crlf
|
||||
mov edx, offset summsg
|
||||
call writeString
|
||||
mov eax, ebx
|
||||
call writeInt
|
||||
call Crlf
|
||||
mov edx, offset avgmsg
|
||||
call writeString
|
||||
cdq
|
||||
idiv n
|
||||
mov avg, eax
|
||||
call writeInt
|
||||
call Crlf
|
||||
mov edx, offset posmsg
|
||||
call writeString
|
||||
mov eax, pdelt
|
||||
call writeInt
|
||||
call Crlf
|
||||
mov edx, offset negmsg
|
||||
call writeString
|
||||
mov eax, ndelt
|
||||
call writeInt
|
||||
call Crlf
|
||||
|
||||
mov ebx, 0
|
||||
CalculateDeviation:
|
||||
mov eax, [esi]
|
||||
sub eax, avg
|
||||
cmp eax, 0
|
||||
jg CalculateDeviation2
|
||||
neg eax
|
||||
CalculateDeviation2:
|
||||
sub esi, 4
|
||||
add ebx, eax
|
||||
loopd CalculateDeviation
|
||||
; finalize calculations for deviation
|
||||
mov eax, ebx
|
||||
mov ecx, n
|
||||
cdq
|
||||
idiv ecx
|
||||
mov edx, offset devmsg
|
||||
call writeString
|
||||
call writeInt
|
||||
call Crlf
|
||||
|
||||
; determine if a grade report is needed
|
||||
cmp gradereport, 1
|
||||
je CalcGrades
|
||||
call Crlf
|
||||
mov edx, offset nogrademsg
|
||||
call writeString
|
||||
jmp GoodBye
|
||||
|
||||
mov numa, 0
|
||||
mov numb, 0
|
||||
mov numc, 0
|
||||
mov numd, 0
|
||||
mov numf, 0
|
||||
mov ecx, n
|
||||
mov esi, offset array
|
||||
sub esi, 4
|
||||
CalcGrades:
|
||||
add esi, 4
|
||||
mov eax, [esi]
|
||||
cmp eax, 90
|
||||
jl CheckForB
|
||||
inc numa
|
||||
loopd CalcGrades
|
||||
CheckForB:
|
||||
cmp eax, 80
|
||||
jl CheckForC
|
||||
inc numb
|
||||
loopd CalcGrades
|
||||
CheckForC:
|
||||
cmp eax, 70
|
||||
jl CheckForD
|
||||
inc numc
|
||||
loopd CalcGrades
|
||||
CheckForD:
|
||||
cmp eax, 60
|
||||
jl Flunked
|
||||
inc numd
|
||||
loopd CalcGrades
|
||||
Flunked:
|
||||
inc numf
|
||||
loopd CalcGrades
|
||||
call Crlf
|
||||
mov edx, offset amsg
|
||||
call writeString
|
||||
mov eax, numa
|
||||
call writeInt
|
||||
call Crlf
|
||||
mov edx, offset bmsg
|
||||
call writeString
|
||||
mov eax, numb
|
||||
call writeInt
|
||||
call Crlf
|
||||
mov edx, offset cmsg
|
||||
call writeString
|
||||
mov eax, numc
|
||||
call writeInt
|
||||
call Crlf
|
||||
mov edx, offset dmsg
|
||||
call writeString
|
||||
mov eax, numd
|
||||
call writeInt
|
||||
call Crlf
|
||||
mov edx, offset fmsg
|
||||
call writeString
|
||||
mov eax, numf
|
||||
call writeInt
|
||||
call Crlf
|
||||
|
||||
GoodBye:
|
||||
mov edx, offset goodbyemsg
|
||||
call writeString
|
||||
exit
|
||||
main endp
|
||||
|
||||
end main
|
|
@ -0,0 +1,115 @@
|
|||
; three.asm
|
||||
; This program should demonstrate various capabilities of assembly
|
||||
; calculations of contiguous chunks of memory (i.e. arrays).
|
||||
; This program will logically assign and populate values in two arrays,
|
||||
; find the total number of positive elements in the first,
|
||||
; the sum of the squares of the diagonal if the matrix is square,
|
||||
; and then compute the sum of the two arrays if possible
|
||||
include irvine32.inc
|
||||
|
||||
MAXIMUM_COLUMN_SIZE = 10
|
||||
|
||||
.data
|
||||
|
||||
matrix_row_length dword 4 * MAXIMUM_COLUMN_SIZE
|
||||
|
||||
matrix_one dword 100 dup (?)
|
||||
matrix_two dword 100 dup (?)
|
||||
matrix_three dword 100 dup (?)
|
||||
|
||||
matrix_one_row_size dword ?
|
||||
matrix_one_column_size dword ?
|
||||
matrix_two_row_size dword ?
|
||||
matrix_two_column_size dword ?
|
||||
|
||||
random_calculation_variable dword ?
|
||||
matrix_sum_exists dword ?
|
||||
|
||||
matrix_one_initial_message byte "Initial First Matrix",0
|
||||
matrix_one_positive_count_message byte "Number of positive elements in first matrix: ",0
|
||||
matrix_one_diagonal_square_count_message byte "Sum of squares of main diagonal in first matrix: ",0
|
||||
matrix_two_initial_message byte "Initial Second Matrix",0
|
||||
matrix_three_initial_message byte "Sum Matrix = First Matrix + Second Matrix",0
|
||||
|
||||
.code
|
||||
|
||||
main proc
|
||||
PopulateMatrixWithFileValues proto
|
||||
CountPositiveMatrixElements proto
|
||||
SumMatrixDiagonalSquares proto
|
||||
SumMatrices proto
|
||||
PrettyPrintMatrix proto
|
||||
InitFile proto
|
||||
CloseFile proto
|
||||
|
||||
call InitFile
|
||||
push offset matrix_two_column_size
|
||||
push offset matrix_two_row_size
|
||||
push offset matrix_one_column_size
|
||||
push offset matrix_one_row_size
|
||||
push offset matrix_two
|
||||
push offset matrix_one
|
||||
call PopulateMatrixWithFileValues
|
||||
push offset random_calculation_variable
|
||||
push offset matrix_one_column_size
|
||||
push offset matrix_one_row_size
|
||||
push offset matrix_one
|
||||
call CountPositiveMatrixElements
|
||||
mov edx, offset matrix_one_positive_count_message
|
||||
call writeString
|
||||
mov eax, random_calculation_variable
|
||||
call writeInt
|
||||
call Crlf
|
||||
call CloseFile
|
||||
BeginCalculations:
|
||||
mov eax, matrix_one_row_size
|
||||
xor eax, matrix_one_column_size
|
||||
jne CalculateSum
|
||||
push offset random_calculation_variable
|
||||
push offset matrix_one_row_size
|
||||
push offset matrix_one
|
||||
call SumMatrixDiagonalSquares
|
||||
mov edx, offset matrix_one_diagonal_square_count_message
|
||||
call writeString
|
||||
mov eax, random_calculation_variable
|
||||
call writeInt
|
||||
call Crlf
|
||||
CalculateSum:
|
||||
call Crlf
|
||||
mov matrix_sum_exists, 0
|
||||
mov eax, matrix_one_row_size
|
||||
xor eax, matrix_two_row_size
|
||||
jne DisplayMatrices
|
||||
mov eax, matrix_one_column_size
|
||||
xor eax, matrix_two_column_size
|
||||
jne DisplayMatrices
|
||||
inc matrix_sum_exists
|
||||
push offset matrix_one_column_size
|
||||
push offset matrix_one_row_size
|
||||
push offset matrix_three
|
||||
push offset matrix_two
|
||||
push offset matrix_one
|
||||
call SumMatrices
|
||||
DisplayMatrices:
|
||||
push offset matrix_one_initial_message
|
||||
push matrix_one_column_size
|
||||
push matrix_one_row_size
|
||||
push offset matrix_one
|
||||
call PrettyPrintMatrix
|
||||
push offset matrix_two_initial_message
|
||||
push matrix_two_column_size
|
||||
push matrix_two_row_size
|
||||
push offset matrix_two
|
||||
call PrettyPrintMatrix
|
||||
cmp matrix_sum_exists, 0
|
||||
je DoneWithDisplaying
|
||||
push offset matrix_three_initial_message
|
||||
push matrix_one_column_size
|
||||
push matrix_one_row_size
|
||||
push offset matrix_three
|
||||
call PrettyPrintMatrix
|
||||
DoneWithDisplaying:
|
||||
exit
|
||||
main endp
|
||||
|
||||
end main
|
|
@ -0,0 +1,125 @@
|
|||
; threecalc.asm
|
||||
; Andrew Coleman
|
||||
; This contains several algorithms for performing calculations on
|
||||
; two dimensional matrices.
|
||||
include irvine32.inc
|
||||
|
||||
MAXIMUM_COLUMN_SIZE = 10
|
||||
|
||||
.data
|
||||
|
||||
matrix_row_length dword 4 * MAXIMUM_COLUMN_SIZE
|
||||
|
||||
.code
|
||||
|
||||
; CountPositiveMatrixElements counts the number of elements greater than 0
|
||||
; Arguments:
|
||||
; 1. Address of array
|
||||
; 2. Address of row counter
|
||||
; 3. Address of column counter
|
||||
; 4. Address of result counter
|
||||
CountPositiveMatrixElements proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov edi, [ebp + 08h]
|
||||
mov eax, [ebp + 0Ch]
|
||||
mov edx, [eax]
|
||||
xor esi, esi
|
||||
BeginCountingElementsInRow:
|
||||
push edi
|
||||
mov eax, [ebp + 10h]
|
||||
mov ecx, [eax]
|
||||
CountInRow:
|
||||
mov eax, [edi]
|
||||
cmp eax, 0
|
||||
jl FinishUpElementAndContinueCounting
|
||||
inc esi
|
||||
FinishUpElementAndContinueCounting:
|
||||
add edi, 4
|
||||
dec ecx
|
||||
jg CountInRow
|
||||
pop edi
|
||||
add edi, matrix_row_length
|
||||
dec edx
|
||||
jg BeginCountingElementsInRow
|
||||
mov eax, [ebp + 14h]
|
||||
mov [eax], esi
|
||||
popad
|
||||
pop ebp
|
||||
ret 16
|
||||
CountPositiveMatrixElements endp
|
||||
|
||||
; SumMatrixDiagonalSquares
|
||||
; Arguments:
|
||||
; 1. Address of array
|
||||
; 2. Address of dimension
|
||||
; 3. Address of result counter
|
||||
SumMatrixDiagonalSquares proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov edi, [ebp + 08h]
|
||||
mov eax, [ebp + 0Ch]
|
||||
mov ecx, [eax]
|
||||
xor esi, esi
|
||||
DiagonalCount:
|
||||
mov eax, [edi]
|
||||
imul eax
|
||||
add esi, eax
|
||||
add edi, matrix_row_length
|
||||
add edi, 4
|
||||
dec ecx
|
||||
jg DiagonalCount
|
||||
mov eax, [ebp + 10h]
|
||||
mov [eax], esi
|
||||
popad
|
||||
pop ebp
|
||||
ret 12
|
||||
SumMatrixDiagonalSquares endp
|
||||
|
||||
; SumMatrices
|
||||
; Arguments
|
||||
; 1. Address of first matrix
|
||||
; 2. Address of second matrix
|
||||
; 3. Address of third matrix
|
||||
; 4. Address of row counter
|
||||
; 5. Address of column counter
|
||||
SumMatrices proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov edi, [ebp + 08h]
|
||||
mov esi, [ebp + 0Ch]
|
||||
mov edx, [ebp + 10h]
|
||||
mov eax, [ebp + 14h]
|
||||
mov ebx, [eax]
|
||||
StartMatrixRow:
|
||||
mov eax, [ebp + 18h]
|
||||
mov ecx, [eax]
|
||||
push edi
|
||||
push esi
|
||||
push edx
|
||||
CalculateMatrixRow:
|
||||
mov eax, [edi]
|
||||
add eax, [esi]
|
||||
mov [edx], eax
|
||||
add edi, 4
|
||||
add esi, 4
|
||||
add edx, 4
|
||||
dec ecx
|
||||
jg CalculateMatrixRow
|
||||
pop edx
|
||||
pop esi
|
||||
pop edi
|
||||
add edx, matrix_row_length
|
||||
add esi, matrix_row_length
|
||||
add edi, matrix_row_length
|
||||
dec ebx
|
||||
jg StartMatrixRow
|
||||
popad
|
||||
pop ebp
|
||||
ret 20
|
||||
SumMatrices endp
|
||||
|
||||
end
|
|
@ -0,0 +1,358 @@
|
|||
; threefile.asm
|
||||
; This file contains all of the file-driven procedures for
|
||||
; the matrix input and output.
|
||||
|
||||
include irvine32.inc
|
||||
|
||||
MAX_FILENAME_SIZE = 120
|
||||
DEFAULT_BUFFER_SIZE = 80
|
||||
MAXIMUM_COLUMN_SIZE = 10
|
||||
|
||||
.data
|
||||
|
||||
matrix_row_length dword 4 * MAXIMUM_COLUMN_SIZE
|
||||
|
||||
error_message byte "Could not open the file... bailing",0Dh,0Ah,0
|
||||
filename_message byte "Enter name of file ( <120 chars ): ",0
|
||||
buffer_size_message byte "Enter size of input buffer ( <=500 ): ",0
|
||||
cmsg byte "format int: ",0
|
||||
|
||||
filename dword MAX_FILENAME_SIZE dup (?)
|
||||
filename_size dword ?
|
||||
|
||||
consolehandle dword ?
|
||||
filestruct label dword
|
||||
file_handle dword ?
|
||||
file_buffer byte 500 dup (?)
|
||||
buffer_size dword ?
|
||||
bytes_remaining dword ?
|
||||
buffer_offset dword ?
|
||||
|
||||
number_flag dword ?
|
||||
negative_flag dword ?
|
||||
|
||||
.code
|
||||
|
||||
InitFile proc
|
||||
pushad
|
||||
mov edx, offset filename_message
|
||||
call writeString
|
||||
mov edx, offset filename
|
||||
mov ecx, MAX_FILENAME_SIZE
|
||||
call readString
|
||||
mov filename_size, eax
|
||||
mov edx, offset buffer_size_message
|
||||
call writeString
|
||||
call readInt
|
||||
cmp eax, 1
|
||||
jl BadBufferSize
|
||||
cmp eax, 500
|
||||
jle GoodBufferSize
|
||||
BadBufferSize:
|
||||
mov eax, DEFAULT_BUFFER_SIZE
|
||||
GoodBufferSize:
|
||||
mov buffer_size, eax
|
||||
push 0
|
||||
push FILE_ATTRIBUTE_NORMAL
|
||||
push OPEN_EXISTING
|
||||
push NULL
|
||||
push DO_NOT_SHARE
|
||||
push GENERIC_READ
|
||||
push offset filename
|
||||
call CreateFile
|
||||
mov file_handle, eax
|
||||
cmp eax, INVALID_HANdlE_VALUE
|
||||
jne Continue
|
||||
call QuitProgramByError
|
||||
Continue:
|
||||
push STD_OUTPUT_HANDLE
|
||||
call GetStdHandle
|
||||
mov consolehandle, eax
|
||||
call Crlf
|
||||
popad
|
||||
ret
|
||||
InitFile endp
|
||||
|
||||
QuitProgramByError proc
|
||||
mov edx, offset error_message
|
||||
call writeString
|
||||
exit
|
||||
QuitProgramByError endp
|
||||
|
||||
CloseFile proc
|
||||
push file_handle
|
||||
call closeHandle
|
||||
ret
|
||||
CloseFile endp
|
||||
|
||||
; Formats a computer integer into an output buffer
|
||||
; Arguments:
|
||||
; 1. Address of Buffer
|
||||
; 2. Number to format
|
||||
FormatInteger proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov edi, [ebp + 08h]
|
||||
add edi, buffer_size
|
||||
dec edi
|
||||
mov eax, [ebp + 0Ch]
|
||||
mov negative_flag, 0
|
||||
mov ebx, 10
|
||||
cmp eax, 0
|
||||
jge ProcessNumber
|
||||
mov negative_flag, 1
|
||||
neg eax
|
||||
ProcessNumber:
|
||||
cdq
|
||||
idiv ebx
|
||||
add dl, 30h
|
||||
mov byte ptr [edi], dl
|
||||
dec edi
|
||||
cmp eax, 0
|
||||
jnz ProcessNumber
|
||||
cmp negative_flag, 1
|
||||
jne FinishFormatNumber
|
||||
mov dl, '-'
|
||||
mov byte ptr [edi], dl
|
||||
FinishFormatNumber:
|
||||
popad
|
||||
pop ebp
|
||||
ret 8
|
||||
FormatInteger endp
|
||||
|
||||
; PrettyPrintMatrix displays a matrix in a pretty format using tabs.
|
||||
; Arguments:
|
||||
; 1. Address of array
|
||||
; 2. Row value of matrix
|
||||
; 3. Column value of matrix
|
||||
; 4. Address of string message to display
|
||||
PrettyPrintMatrix proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov edi, [ebp + 08h]
|
||||
mov edx, [ebp + 14h]
|
||||
call writeString
|
||||
call Crlf
|
||||
mov buffer_size, 8
|
||||
mov ebx, [ebp + 0Ch]
|
||||
PrettyPrintMatrixBeginRow:
|
||||
mov ecx, DEFAULT_BUFFER_SIZE
|
||||
mov esi, offset file_buffer
|
||||
StartBlank:
|
||||
mov byte ptr [esi], ' '
|
||||
inc esi
|
||||
dec ecx
|
||||
jg StartBlank
|
||||
push edi
|
||||
mov ecx, [ebp + 10h]
|
||||
mov esi, offset file_buffer
|
||||
PrettyPrintMatrixPrintRow:
|
||||
push [edi]
|
||||
push esi
|
||||
call FormatInteger
|
||||
add edi, 4
|
||||
add esi, buffer_size
|
||||
dec ecx
|
||||
je PrettyPrintMatrixEndOfRow
|
||||
jmp PrettyPrintMatrixPrintRow
|
||||
PrettyPrintMatrixEndOfRow:
|
||||
push 0
|
||||
push offset bytes_remaining
|
||||
push DEFAULT_BUFFER_SIZE
|
||||
push offset file_buffer
|
||||
push consolehandle
|
||||
call WriteConsole
|
||||
pop edi
|
||||
add edi, matrix_row_length
|
||||
dec ebx
|
||||
jg PrettyPrintMatrixBeginRow
|
||||
popad
|
||||
pop ebp
|
||||
ret 16
|
||||
PrettyPrintMatrix endp
|
||||
|
||||
; This procedure reads in a series of ascii numbers from a file
|
||||
; and fills the two respective matrices with values
|
||||
; Arguments:
|
||||
; 1. offset of first matrix
|
||||
; 2. offset of second matrix
|
||||
; 3. offset of matrix 1's row
|
||||
; 4. offset of matrix 1's column
|
||||
; 5. offset of matrix 2's row
|
||||
; 6. offset of matrix 2's column
|
||||
PopulateMatrixWithFileValues proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov edi, [ebp + 10h]
|
||||
mov esi, [ebp + 14h]
|
||||
push edi
|
||||
call ReadInteger
|
||||
mov eax, [edi]
|
||||
cmp eax, 1
|
||||
jl BadOneRow
|
||||
cmp eax, 10
|
||||
jl GoodOneRow
|
||||
BadOneRow:
|
||||
mov eax, 1
|
||||
mov [edi], eax
|
||||
GoodOneRow:
|
||||
push esi
|
||||
call ReadInteger
|
||||
mov eax, [esi]
|
||||
cmp eax, 1
|
||||
jl BadOneCol
|
||||
cmp eax, 10
|
||||
jl GoodOneCol
|
||||
BadOneCol:
|
||||
mov eax, 1
|
||||
mov [esi], eax
|
||||
GoodOneCol:
|
||||
mov edi, [ebp + 08h]
|
||||
mov ebx, 0
|
||||
StartMatrixOneElementRow:
|
||||
mov esi, edi
|
||||
mov ecx, 0
|
||||
GetMatrixOneElement:
|
||||
push esi
|
||||
call ReadInteger
|
||||
add esi, 4
|
||||
inc ecx
|
||||
mov eax, [ebp + 14h]
|
||||
cmp ecx, [eax]
|
||||
jl GetMatrixOneElement
|
||||
inc ebx
|
||||
mov eax, [ebp + 10h]
|
||||
cmp ebx, [eax]
|
||||
je StartMatrixTwo
|
||||
add edi, matrix_row_length
|
||||
jmp StartMatrixOneElementRow
|
||||
StartMatrixTwo:
|
||||
mov edi, [ebp + 18h]
|
||||
mov esi, [ebp + 1Ch]
|
||||
push edi
|
||||
call ReadInteger
|
||||
mov eax,[edi]
|
||||
cmp eax, 1
|
||||
jl BadTwoRow
|
||||
cmp eax, 10
|
||||
jl GoodTwoRow
|
||||
BadTwoRow:
|
||||
mov eax, 1
|
||||
mov [edi], eax
|
||||
GoodTwoRow:
|
||||
push esi
|
||||
call ReadInteger
|
||||
mov eax, [esi]
|
||||
cmp eax, 1
|
||||
jl BadTwoCol
|
||||
cmp eax, 10
|
||||
jl GoodTwoCol
|
||||
BadTwoCol:
|
||||
mov eax, 1
|
||||
mov [esi], eax
|
||||
GoodTwoCol:
|
||||
mov edi, [ebp + 0Ch]
|
||||
mov ebx, 0
|
||||
StartMatrixTwoElementRow:
|
||||
mov esi, edi
|
||||
mov ecx, 0
|
||||
GetMatrixTwoElement:
|
||||
push esi
|
||||
call ReadInteger
|
||||
add esi, 4
|
||||
inc ecx
|
||||
mov eax, [ebp + 1Ch]
|
||||
cmp ecx, [eax]
|
||||
jl GetMatrixTwoElement
|
||||
inc ebx
|
||||
mov eax, [ebp + 18h]
|
||||
cmp ebx, [eax]
|
||||
je FinishUpMatrixTwo
|
||||
add edi, matrix_row_length
|
||||
jmp StartMatrixTwoElementRow
|
||||
FinishUpMatrixTwo:
|
||||
popad
|
||||
pop ebp
|
||||
ret 24
|
||||
PopulateMatrixWithFileValues endp
|
||||
|
||||
; This procedure reads an integer out of the input buffer and returns
|
||||
; the parsed value into a dword. This implementation does not
|
||||
; require the file structure to be passed to this procedure
|
||||
; Arguments:
|
||||
; 1. offset of parsed value
|
||||
ReadInteger proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov ecx, bytes_remaining
|
||||
mov ebx, buffer_offset
|
||||
mov esi, offset file_buffer
|
||||
mov number_flag, 0
|
||||
mov negative_flag, 0
|
||||
mov eax, 0
|
||||
BufferEmpty:
|
||||
cmp ecx, 0
|
||||
jne ComputeIntegerFromByte
|
||||
push eax
|
||||
push 0
|
||||
push offset bytes_remaining
|
||||
push buffer_size
|
||||
push offset file_buffer
|
||||
push file_handle
|
||||
call ReadFile
|
||||
pop eax
|
||||
mov ecx, bytes_remaining
|
||||
mov ebx, 0
|
||||
cmp ecx, 0
|
||||
je SaveInteger
|
||||
ComputeIntegerFromByte:
|
||||
mov edx, 0
|
||||
mov dl, [esi+ebx]
|
||||
cmp dl, '-'
|
||||
jne PositiveInteger
|
||||
mov negative_flag, 1
|
||||
mov number_flag, 1
|
||||
jmp ContinueInteger
|
||||
PositiveInteger:
|
||||
cmp dl, '+'
|
||||
jne IsAsciiDigit
|
||||
mov number_flag, 1
|
||||
jmp ContinueInteger
|
||||
IsAsciiDigit:
|
||||
cmp dl, '9'
|
||||
jg BadDigit
|
||||
cmp dl, '0'
|
||||
jl BadDigit
|
||||
GoodDigit:
|
||||
mov number_flag, 1
|
||||
push edx
|
||||
imul eax, 10
|
||||
pop edx
|
||||
sub dl, 30h
|
||||
add eax, edx
|
||||
ContinueInteger:
|
||||
inc ebx
|
||||
dec ecx
|
||||
jmp BufferEmpty
|
||||
BadDigit:
|
||||
cmp number_flag, 0
|
||||
je ContinueInteger
|
||||
IntegerEnd:
|
||||
cmp negative_flag, 1
|
||||
jne SaveInteger
|
||||
neg eax
|
||||
SaveInteger:
|
||||
mov edi, [ebp+08h]
|
||||
mov [edi], eax
|
||||
mov bytes_remaining, ecx
|
||||
mov buffer_offset, ebx
|
||||
popad
|
||||
pop ebp
|
||||
ret 4
|
||||
ReadInteger endp
|
||||
|
||||
end
|
|
@ -0,0 +1,145 @@
|
|||
; threeio.asm
|
||||
; This file includes many different procedures for user-driven
|
||||
; matrix input and output.
|
||||
|
||||
include irvine32.inc
|
||||
|
||||
MAXIMUM_COLUMN_SIZE = 10
|
||||
|
||||
.data
|
||||
|
||||
matrix_row_length dword 4 * MAXIMUM_COLUMN_SIZE
|
||||
|
||||
left_coordinate_message byte "(",0
|
||||
middle_coordinate_message byte ",",0
|
||||
right_coordinate_message byte ")",0
|
||||
|
||||
element_input_message byte "Enter matrix element: ",0
|
||||
row_dimension_message byte "Enter number of rows: ",0
|
||||
column_dimension_message byte "Enter number of columns: ",0
|
||||
|
||||
tab_character byte 09h,0
|
||||
|
||||
.code
|
||||
|
||||
; Fills a matrix with user supplied values.
|
||||
; Arguments:
|
||||
; 1. address of array
|
||||
; 2. address of the row counting variable
|
||||
; 3. address of the column counting variable
|
||||
; 4. address of message to display
|
||||
; Caveats:
|
||||
; Forces 1 in place of numbers less than 1 and greater than 10 for dimensions
|
||||
PopulateMatrixWithUserValues proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
;here is the old GetMatrixDimesions procedure
|
||||
mov edx, [ebp + 14h]
|
||||
call writeString
|
||||
call Crlf
|
||||
mov edx, offset row_dimension_message
|
||||
call writeString
|
||||
call readInt
|
||||
cmp eax, 1
|
||||
jl BadRowDimension
|
||||
cmp eax, 10
|
||||
jg BadRowDimension
|
||||
jmp GoodRowDimensionLabel
|
||||
BadRowDimension:
|
||||
mov eax, 1
|
||||
GoodRowDimensionLabel:
|
||||
mov ebx, [ebp + 0Ch]
|
||||
mov [ebx], eax
|
||||
mov edx, offset column_dimension_message
|
||||
call writeString
|
||||
call readInt
|
||||
cmp eax, 1
|
||||
jl BadColumnDimension
|
||||
cmp eax, 10
|
||||
jg BadColumnDimension
|
||||
jmp GoodColumnDimensionLabel
|
||||
BadColumnDimension:
|
||||
mov eax, 1
|
||||
GoodColumnDimensionLabel:
|
||||
mov ebx, [ebp + 10h]
|
||||
mov [ebx], eax
|
||||
;GetMatrixDimensions ends here
|
||||
mov edi, [ebp + 08h]
|
||||
mov ebx, 0
|
||||
StartMatrixElementRow:
|
||||
mov esi, edi
|
||||
mov ecx, 0
|
||||
GetMatrixElement:
|
||||
mov edx, offset left_coordinate_message
|
||||
call writeString
|
||||
mov eax, ebx
|
||||
call writeInt
|
||||
mov edx, offset middle_coordinate_message
|
||||
call writeString
|
||||
mov eax, ecx
|
||||
call writeInt
|
||||
mov edx, offset right_coordinate_message
|
||||
call writeString
|
||||
mov edx, offset element_input_message
|
||||
call writeString
|
||||
call readInt
|
||||
mov [esi], eax
|
||||
add esi, 4
|
||||
inc ecx
|
||||
mov eax, [ebp + 10h]
|
||||
cmp ecx, [eax]
|
||||
jl GetMatrixElement
|
||||
inc ebx
|
||||
mov eax, [ebp + 0Ch]
|
||||
cmp ebx, [eax]
|
||||
je FinishUpMatrixInputAndReturn
|
||||
add edi, matrix_row_length
|
||||
jmp StartMatrixElementRow
|
||||
FinishUpMatrixInputAndReturn:
|
||||
popad
|
||||
pop ebp
|
||||
ret 16
|
||||
PopulateMatrixWithUserValues endp
|
||||
|
||||
; PrettyPrintMatrix displays a matrix in a pretty format using tabs.
|
||||
; Arguments:
|
||||
; 1. Address of array
|
||||
; 2. Address of row counter
|
||||
; 3. Address of column counter
|
||||
; 4. Address of string message to display
|
||||
PrettyPrintMatrix proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov edi, [ebp + 08h]
|
||||
mov edx, [ebp + 14h]
|
||||
call writeString
|
||||
call Crlf
|
||||
mov eax, [ebp + 0Ch]
|
||||
mov esi, [eax]
|
||||
PrettyPrintMatrixBeginRow:
|
||||
push edi
|
||||
mov eax, [ebp + 10h]
|
||||
mov ecx, [eax]
|
||||
PrettyPrintMatrixPrintRow:
|
||||
mov eax, [edi]
|
||||
call writeInt
|
||||
dec ecx
|
||||
je PrettyPrintMatrixEndOfRow
|
||||
mov edx, offset tab_character
|
||||
call writeString
|
||||
add edi, 4
|
||||
jmp PrettyPrintMatrixPrintRow
|
||||
PrettyPrintMatrixEndOfRow:
|
||||
call Crlf
|
||||
pop edi
|
||||
add edi, matrix_row_length
|
||||
dec esi
|
||||
jg PrettyPrintMatrixBeginRow
|
||||
popad
|
||||
pop ebp
|
||||
ret 16
|
||||
PrettyPrintMatrix endp
|
||||
|
||||
end
|
|
@ -0,0 +1,218 @@
|
|||
; two.asm
|
||||
; This program should demonstrate various capabilities of assembly
|
||||
; calculations of contiguous chunks of memory.
|
||||
; This program will logically assign and populate values in two arrays,
|
||||
; find the total number of positive elements in the first,
|
||||
; the sum of the squares of the diagonal if the matrix is square,
|
||||
; and then compute the sum of the two arrays if possible
|
||||
include irvine32.inc
|
||||
|
||||
MAXIMUM_COLUMN_SIZE = 10
|
||||
|
||||
.data
|
||||
|
||||
matrix_row_length dword 4 * MAXIMUM_COLUMN_SIZE
|
||||
|
||||
matrix_one dword 100 dup (?)
|
||||
matrix_two dword 100 dup (?)
|
||||
matrix_three dword 100 dup (?)
|
||||
|
||||
matrix_one_row_size dword ?
|
||||
matrix_one_column_size dword ?
|
||||
matrix_two_row_size dword ?
|
||||
matrix_two_column_size dword ?
|
||||
|
||||
random_calculation_variable dword ?
|
||||
matrix_sum_exists dword ?
|
||||
|
||||
matrix_one_initial_message byte "Initial First Matrix",0
|
||||
matrix_one_positive_count_message byte "Number of positive elements in first matrix: ",0
|
||||
matrix_one_diagonal_square_count_message byte "Sum of squares of main diagonal in first matrix: ",0
|
||||
matrix_two_initial_message byte "Initial Second Matrix",0
|
||||
matrix_three_initial_message byte "Sum Matrix = First Matrix + Second Matrix",0
|
||||
|
||||
row_dimension_message byte "Enter number of rows: ",0
|
||||
column_dimension_message byte "Enter number of columns: ",0
|
||||
|
||||
tab_character byte 09h
|
||||
|
||||
; best phone number in the world: 256 512 1024
|
||||
.code
|
||||
|
||||
; Returns the dimensions of a matrix
|
||||
; Arguments:
|
||||
; 1. address of row size variable
|
||||
; 2. address of column size variable
|
||||
; 3. address of message to display
|
||||
; Caveats:
|
||||
; Returns 1 in place of numbers less than 1 and greater than 10
|
||||
GetArrayDimensions proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
push eax
|
||||
push edx
|
||||
push ebx
|
||||
mov edx, [ebp + 10h]
|
||||
call writeString
|
||||
call Crlf
|
||||
mov edx, offset row_dimension_message
|
||||
call writeString
|
||||
call readInt
|
||||
cmp eax, 1
|
||||
jl BadRowDimension
|
||||
cmp eax, 10
|
||||
jg BadRowDimension
|
||||
jmp GoodRowDimensionLabel
|
||||
BadRowDimension:
|
||||
mov eax, 1
|
||||
GoodRowDimensionLabel:
|
||||
mov ebx, [ebp + 08h]
|
||||
mov [ebx], eax
|
||||
mov edx, offset column_dimension_message
|
||||
call writeString
|
||||
call readInt
|
||||
cmp eax, 1
|
||||
jl BadColumnDimension
|
||||
cmp eax, 10
|
||||
jg BadColumnDimension
|
||||
jmp GoodColumnDimensionLabel
|
||||
BadColumnDimension:
|
||||
mov eax, 1
|
||||
GoodColumnDimensionLabel:
|
||||
mov ebx, [ebp + 0Ch]
|
||||
mov [ebx], eax
|
||||
pop ebx
|
||||
pop edx
|
||||
pop eax
|
||||
pop ebp
|
||||
ret 12
|
||||
GetArrayDimensions endp
|
||||
|
||||
; PrettyPrintMatrix displays a matrix in a pretty format using tabs.
|
||||
; Arguments:
|
||||
; 1. Address of array
|
||||
; 2. Address of row counter
|
||||
; 3. Address of column counter
|
||||
; 4. Address of string message to display
|
||||
PrettyPrintMatrix proc
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pushad
|
||||
mov edi, [ebp + 08h]
|
||||
mov edx, [ebp + 14h]
|
||||
call writeString
|
||||
call Crlf
|
||||
mov eax, [ebp + 0Ch]
|
||||
mov esi, [eax]
|
||||
PrettyPrintMatrixBeginRow:
|
||||
push edi
|
||||
mov eax, [ebp + 10h]
|
||||
mov ecx, [eax]
|
||||
PrettyPrintMatrixPrintRow:
|
||||
mov eax, [edi]
|
||||
call writeInt
|
||||
dec ecx
|
||||
je PrettyPrintMatrixEndOfRow
|
||||
mov edx, offset tab_character
|
||||
call writeString
|
||||
add edi, 4
|
||||
jmp PrettyPrintMatrixPrintRow
|
||||
PrettyPrintMatrixEndOfRow:
|
||||
call Crlf
|
||||
pop edi
|
||||
add edi, matrix_row_length
|
||||
dec esi
|
||||
jg PrettyPrintMatrixBeginRow
|
||||
popad
|
||||
pop ebp
|
||||
ret 16
|
||||
PrettyPrintMatrix endp
|
||||
|
||||
main proc
|
||||
PopulateMatrixWithUserValues proto
|
||||
CountPositiveMatrixElements proto
|
||||
SumMatrixDiagonalSquares proto
|
||||
SumMatrices proto
|
||||
|
||||
push offset matrix_one_initial_message
|
||||
push offset matrix_one_column_size
|
||||
push offset matrix_one_row_size
|
||||
call GetArrayDimensions
|
||||
call Crlf
|
||||
push offset matrix_two_initial_message
|
||||
push offset matrix_two_column_size
|
||||
push offset matrix_two_row_size
|
||||
call GetArrayDimensions
|
||||
call Crlf
|
||||
push offset matrix_one_column_size
|
||||
push offset matrix_one_row_size
|
||||
push offset matrix_one
|
||||
call PopulateMatrixWithUserValues
|
||||
call Crlf
|
||||
push offset matrix_two_column_size
|
||||
push offset matrix_two_row_size
|
||||
push offset matrix_two
|
||||
call PopulateMatrixWithUserValues
|
||||
call Crlf
|
||||
push offset random_calculation_variable
|
||||
push offset matrix_one_column_size
|
||||
push offset matrix_one_row_size
|
||||
push offset matrix_one
|
||||
call CountPositiveMatrixElements
|
||||
mov edx, offset matrix_one_positive_count_message
|
||||
call writeString
|
||||
mov eax, random_calculation_variable
|
||||
call writeInt
|
||||
call Crlf
|
||||
BeginCalculations:
|
||||
mov eax, matrix_one_row_size
|
||||
xor eax, matrix_one_column_size
|
||||
jne CalculateSum
|
||||
push offset random_calculation_variable
|
||||
push offset matrix_one_row_size
|
||||
push offset matrix_one
|
||||
call SumMatrixDiagonalSquares
|
||||
mov edx, offset matrix_one_diagonal_square_count_message
|
||||
call writeString
|
||||
mov eax, random_calculation_variable
|
||||
call writeInt
|
||||
call Crlf
|
||||
CalculateSum:
|
||||
call Crlf
|
||||
mov matrix_sum_exists, 0
|
||||
mov eax, matrix_one_row_size
|
||||
xor eax, matrix_two_row_size
|
||||
jne DisplayMatrices
|
||||
mov eax, matrix_one_column_size
|
||||
xor eax, matrix_two_column_size
|
||||
jne DisplayMatrices
|
||||
inc matrix_sum_exists
|
||||
push offset matrix_one_column_size
|
||||
push offset matrix_one_row_size
|
||||
push offset matrix_three
|
||||
push offset matrix_two
|
||||
push offset matrix_one
|
||||
call SumMatrices
|
||||
DisplayMatrices:
|
||||
push offset matrix_one_initial_message
|
||||
push offset matrix_one_column_size
|
||||
push offset matrix_one_row_size
|
||||
push offset matrix_one
|
||||
call PrettyPrintMatrix
|
||||
push offset matrix_two_initial_message
|
||||
push offset matrix_two_column_size
|
||||
push offset matrix_two_row_size
|
||||
push offset matrix_two
|
||||
call PrettyPrintMatrix
|
||||
cmp matrix_sum_exists, 0
|
||||
je DoneWithDisplaying
|
||||
push offset matrix_three_initial_message
|
||||
push offset matrix_one_column_size
|
||||
push offset matrix_one_row_size
|
||||
push offset matrix_three
|
||||
call PrettyPrintMatrix
|
||||
DoneWithDisplaying:
|
||||
exit
|
||||
main endp
|
||||
|
||||
end main
|
Reference in New Issue