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

Please use the basic Assembly language, and also do the extra credit. Really app

ID: 3673863 • Letter: P

Question

Please use the basic Assembly language, and also do the extra credit. Really appreciate.

Filename: RandomString.asm


Create a procedure (UserInt) that asks for an unsigned integer input (N) from a user. The procedure must pass this integer back to the calling program as an argument (this means in a register).


Create a procedure (RandStr) that generates a string of length (L = 25), containing random capital letters. When calling the procedure, pass the value of L in EBX, and pass the offset of an array of bytes which will hold the string.


Write a program that uses both procedures, so that the input from the user determines how many times to generate a random string (not the same one over and over).


1. The output will be shown in the console window one string per line.

2. You may use any command Chapter 5 and below. Chapter 5 is about Procedures AKA subroutines or functions.

3. Your procedure must be called from the main procedure.

ExtraCredit: Print each string in a random color. This means that each individual string will be of the same random color.

Explanation / Answer


INCLUDE Irvine32.inc


.data
user_prompt BYTE "Enter an integer (from 1 to 20): ", 0    ; Display message asking for an Integer
arrayString byte 30 DUP(0),0               ; array for random strings

userinput DWORD ? ; for the user input interger so we can "pass back as an argument"

.code

main proc

call UserInt               ; User input proc
call RandStr               ; Random string proc

main endp
exit

UserInt proc
FAIL:                   ; jumps to here if they enter a number >21
mov edx, OFFSET user_prompt ; user prompt message
call WriteString           ; writes the prompt to screen
call Crlf                   ; new line
call ReadInt               ; reads the user input
cmp eax, 21               ; checks for valid input
ja FAIL                   ; Jumps to Fail for failing to enter the correct input ( Int from 1 to 20)

mov userinput, eax
;mov ecx, eax               ; this is easier but i feel like i'll get points taken off for some reason...

                       ; So the homework says "the proc must pass this int back to the calling program as an argument." Im not sure
                       ; if you're wanting us to push this value to the stack or something fancy like that, for this program
ret                       ; I found it easier to just move it to ecx since its the counter for my loop anyways.. and I read that
UserInt ENDP               ; arguments returned from procedures are stored in registers mainly. So I hope its ok! I could have pushed into a stack
                       ; or made it a variable too if I wanted...
                     
                       ; ok reading it again i think i'll make it a variable but you could just mov ecx, eax

RandStr PROC Uses ESI ECX EAX
                       ;-------------------------------------------------------------------------------------------
                       ; Takes the user input from UserInt that was put into ECX
                       ; and runs a loop that prints out random strings with
                       ; capitol letters and random colors for the amount of the user input
                       ;Receives: ESI = the array
                       ;          ECX = User input from UserInt proc
                       ;          EAX = random characters
                       ;Returns: userinput number of random capitol letter strings in random colors
                       ;--------------------------------------------------------------------------------------------

   mov ecx, userinput       ; the argument that we got passed
  
   L1:                   ; generates the string
   push ecx               ; save our counter for userinput # of strings
   mov ecx, 30           ; number of letters in each string
   mov esi,OFFSET arrayString       ;string index


   L2:                   ; loop for our random ints
   mov eax,26               ; random int from 0 - 25
   call RandomRange           ; Library function random number from previous values stores to EAX
   add eax,'A'           ; - totally suprised this worked...but i'll take it!
   mov [esi],al           ; insert random char into array
   inc esi               ; incrament the pointer
   loop L2

   mov edx,OFFSET arrayString      ; puts it in EDX for output to screen
   call settextc           ; sets random color
   call WriteString           ;   writes to screen
   call Crlf             
   pop ecx               ; gets back our loop counter from userinput
   loop L1             
   ret                  

RandStr ENDP

settextc proc               ; Shameless stole this proc from group 4! but honestly it's not that hard to figure out
   push eax;               ; actually they made 1 mistake
   mov eax, 15;           ; since settextcolor is 0 to n-1 and the colors go from 0 to 15 they had 14 which means you would never get white
   call RandomRange;
   add eax, 1;           ; so we dont get black
   call SetTextColor;
   pop eax;
   ret;
   settextc endp

END main