Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

can you rewrite this code so that the teacher won't guess it is a copy ? .MODEL SMALL .STACK 100h .DATA N DW 0 ;

can you rewrite this code so that the teacher won't guess it is a copy ?

.MODEL SMALL

.STACK 100h

.DATA

N DW 0 ; number of integers to read

SIZE DB 0 ; size of each integer in bytes

SUM DD 0 ; sum of integers

AVG DD 0 ; average of integers

INPUT DB 20 ; input buffer for reading numbers as strings

.CODE

MAIN PROC

; Prompt the user to input N and the size of the integers

MOV AH, 9

LEA DX, PROMPT_N

INT 21h

CALL READ_DEC

MOV N, AX

MOV AH, 9

LEA DX, PROMPT_SIZE

INT 21h

CALL READ_DEC

MOV SIZE, AL

; Allocate memory for the integer array

MOV AH, 48h

MOV BX, N

MUL SIZE

MOV AH, 48h

INT 21h

MOV DI, AX

MOV BX, DI

; Loop to read N integers

MOV CX, N

MOV SI, 0

READ_LOOP:

; Prompt the user to input the next integer

MOV AH, 9

LEA DX, PROMPT_INT

INT 21h

; Read the input as a string

MOV AH, 0Ah

LEA DX, INPUT

INT 21h

; Convert the string to an integer in BCD format with SIZE bytes

CALL STR_TO_INT

MOV WORD PTR [DI], AX

ADD DI, SIZE

LOOP READ_LOOP

; Calculate the sum and average of the integers

MOV AX, 0

MOV DX, 0

MOV CX, N

MOV SI, BX

ADD_LOOP:

ADD SI, SIZE

MOV BX, WORD PTR [SI]

ADD AX, BX

ADC DX, 0

LOOP ADD_LOOP

MOV SUM, DX

MOV AVG, DX

SHR DX, 1

DIV CX

; Print the sum and average of the integers

MOV AH, 9

LEA DX, RESULT_SUM

INT 21h

CALL WRITE_DEC

MOV AH, 9

LEA DX, RESULT_AVG

INT 21h

CALL WRITE_DEC

; Exit the program

MOV AH, 4Ch

INT 21h

MAIN ENDP

; Read a decimal number from the keyboard and return it in AX

READ_DEC PROC

XOR AX, AX

MOV CX, 10

READ_DEC_LOOP:

; Read a character from the keyboard

MOV AH, 1

INT 21h

; Check if it's a decimal digit

CMP AL, '0'

JB READ_DEC_DONE

CMP AL, '9'

JA READ_DEC_DONE

; Multiply AX by 10 and add the new digit

SUB AL, '0'

MUL CX

ADD AX, AX

ADD AX, AX

ADD AX, AL

JMP READ_DEC_LOOP

READ_DEC_DONE:

RET

READ_DEC ENDP

; Convert the string in INPUT to an integer in BCD format with SIZE bytes and return it in AX

STR_TO_INT PROC

XOR AX, AX

XOR CX, CX

MOV SI, OFFSET INPUT+2

MOV DI, SI

ADD SI, SIZE-1

STR

; Check if the string is a decimal number

MOV CL, SIZE

DEC CL

CMP BYTE PTR [DI], '-'

JNE STR_SKIP_SIGN

NEG CL

DEC SI

STR_SKIP_SIGN:

MOV CH, 10

STR_CHECK_DIGIT_LOOP:

MOV AL, BYTE PTR [SI]

CMP AL, '0'

JB STR_NOT_DECIMAL

CMP AL, '9'

JA STR_NOT_DECIMAL

DEC SI

LOOP STR_CHECK_DIGIT_LOOP

; Convert the string to an integer in BCD format with SIZE bytes

MOV SI, OFFSET INPUT+2

MOV DI, AX

ADD DI, SIZE-1

STR_CONVERT_LOOP:

MOV AL, BYTE PTR [SI]

SUB AL, '0'

MOV BL, AL

MOV AL, CH

MUL BL

ADD AX, CX

MOV BL, AH

MOV AH, 0

MOV CL, 4

SHR BL, CL

ADD DI, 1

MOV BYTE PTR [DI], BL

MOV AL, AH

MOV BL, CH

MUL BL

ADD AX, CX

MOV BL, AL

MOV AH, 0

MOV CL, 4

SHR BL, CL

ADD DI, 1

MOV BYTE PTR [DI], BL

ADD SI, 1

CMP SI, OFFSET INPUT+2+20

JBE STR_CONVERT_LOOP

RET

STR_TO_INT ENDP

; Write a decimal number in AX to the console

WRITE_DEC PROC

; Convert the number to a string

XOR CX, CX

MOV BX, 10

WRITE_DEC_LOOP:

XOR DX, DX

DIV BX

PUSH DX

INC CX

OR AX, AX

JNZ WRITE_DEC_LOOP

; Write the string to the console

WRITE_DEC_LOOP2:

POP DX

ADD DL, '0'

MOV AH, 2

INT 21h

LOOP WRITE_DEC_LOOP2

RET

WRITE_DEC ENDP

; Data and messages

PROMPT_N DB 'Enter the number of integers to read: $'

PROMPT_SIZE DB 'Enter the size of each integer in bytes: $'

PROMPT_INT DB 'Enter the next integer: $'

RESULT_SUM DB 0Dh, 0Ah, 'The sum is: $'

RESULT_AVG DB 0Dh, 0Ah, 'The average is: $'

END MAIN

this is what the code should do

Write an Intel 8086 Assembly program that reads N numbers as Strings, convert them into variable sized Integer numbers, and then print the summation and average of the numbers. The program should allow the user to decide the size of the input number itself (assume integers in format but with variable size). Detailed Description: - Have the program prompt the user to input N and the size of the number then request inputting the first number, then the second and so on until N numbers are input. - Your code should allow users to select the size of the numbers, for example you can have integers with size of 1 Byte each, or you can make them 10 Bytes large. - Validation: Your code should make sure user inputs Decimal numbers only, and with predetermined size only. When a user inputs a wrong value, your code should print an error message that explains it, and then gives the user another chance to input it correctly. - When the user presses Enter, your code should read the input values as if they are Strings, then convert them into numbers in BCD format with predefined size, each two digits can be stored in one Byte. - After reading all the numbers, calculate their summation and average then print the Sum and Avg

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Transact SQL Cookbook Help For Database Programmers

Authors: Ales Spetic, Jonathan Gennick

1st Edition

1565927567, 978-1565927568

More Books

Students also viewed these Databases questions

Question

How do creativity and innovation differ? Give an example of each.

Answered: 1 week ago

Question

5. Benchmark current training practices.

Answered: 1 week ago