Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

.cseg .org 0; Initialization code; Do not move or change these instructions or t

ID: 3844585 • Letter: #

Question

.cseg .org 0; Initialization code; Do not move or change these instructions or the registers they refer to.; You may change the data values being loaded.; The default values set A = 0x3412 and B = 0x2010 ldi r16, 0x12 Low byte of operand A ldi r17, 0x34; High byte of operand A ldi r18, 0x10; Low byte of operand B ldi r19, 0x20; High byte of operand B; Your task compute the 32-bit product A *B (using the bytes from registers r16 - r19 above as the values of;A and B) and store the result in the locations OUT3: OUT0 in data memory (see below).; You are encouraged to use a simple loop with repeated addition, not the MUL instructions, although you are; welcome to use MUL instructions if you want a challenge.; Your code here; End of program (do not change the next two lines) stop: rjmp stop; Do not move or modify any code below this line. You may add extra variables if needed.; The .dseg directive indicates that the following directives should apply to data memory .dseg .org 0x200; Star assembling at address 0x200 of data memory (addresses less than 0x200 refer to registers and ports) OUT0: .byte 1; Bits 7...0 of the output value OUT1: .byte 1 Bits 15... 8 of the output value OUT2: byte 1; Bits 23...16 of the output value OUT3: .byte 1; Bits 31...24 of the output value

Explanation / Answer

I have created and developed the Assembly program which calculates the 32 bit product A* B. I have added the comments for each part of code and attached the final output of it.

Let me explain you in brief and in step-by-step manner:-

Step-1:

The initial part is to initialize the code by using the include classes which helps to keep and store the data in the structure way.

Example:-

.cseg
.org 0

HighByte struc
LowByte dd ?
WordLow dd ?
HighByte ends

Step-2:

The next step is to set the data attribute into the values of A and B with their desired input values like,

Example:-

.data
A db "0x3412
B db "0x2010

Step-3:

The final step is to start the code with the moving of an variables for assigning the registers to their respective attributes and their specific location.

Example:-

.code
start:

mov eax, 0x3412
mov ecx, 0x3412
mul ecx

Assembly Program:-


; Declared the data segment at the starting point

.cseg
.org 0

HighByte struc
LowByte dd ?
WordLow dd ?
HighByte ends

; Uses two variables with A and B

.data
A db "0x3412 = %llu",11, 8, 0
B db "0x2010 * 27020 = %llu",11, 8, 0

.data?
Bytes dq ?
HighByteNumberVal HighByte <>

; The code starts over here with mul operation

.code
start:

mov eax, 0x3412
mov ecx, 0x3412
mul ecx
mov dword ptr[Bytes], eax
mov dword ptr[Bytes + 4], edx
invoke crt_printf, offset A, Bytes

mov eax, 0x2010
mov ecx, 520070
mul ecx
mov HighByteNumberVal.LowByte, eax
mov HighByteNumberVal.WordLow, edx
invoke crt_printf, offset B, HighByteNumberVal

inkey
invoke ExitProcess, 0
end start