01Assignment Assembly Programming
Write an X86/64 ALP to accept five 64 bit Hexadecimal numbers from the user and store them in an array and display the accepted numbers.
section .data
msg1 db "Program to accept 5 numbers and print them!",0xA ; message to be printed at the beginning of the program
len1 equ $-msg1 ; length of msg1
msg2 db "Enter 5 numbers:" ,0xA ; message to prompt the user to enter the numbers
len2 equ $-msg2 ; length of msg2
msg3 db "Displaying 5 numbers:" ,0xA ; message to indicate that the numbers are being displayed
len3 equ $-msg3 ; length of msg3
cnt db 05h ; counter to track the number of times the loop needs to be executed
mov r8,00h ; initializing r8 to 0
section .bss
num resb 16 ; array to store the user input
section .text
global _start
_start :
Msg1:
mov rax,01 ; write instruction
mov rdi,01 ; stdout file descriptor
mov rsi,msg1 ; message to print
mov rdx,len1 ; length of message
syscall ; system call to print the message
InputMsg:
mov rax,01
mov rdi,01
mov rsi,msg2
mov rdx,len2
syscall
mov r8,num ; r8 pointing to num array
InputNum:
mov rax,00 ; read instruction
mov rdi,00 ; stdin file descriptor
mov rsi,r8 ; memory location where the input is to be stored
mov rdx,17 ; number of bytes to be read (16 bytes for 64 bit hexadecimal number and 1 byte for newline character)
syscall ; system call to read the input
add r8,17 ; incrementing the pointer by 17 bytes to point to the next memory location to store the next input
dec byte[cnt] ; decrementing the counter by 1
jnz InputNum ; if counter is not zero, repeat the loop
OutputMsg:
mov rax,01
mov rdi,01
mov rsi,msg3
mov rdx,len3
syscall
mov byte[cnt],05h ; reinitialize cnt to 05
mov r8,num ; point r8 to start of num array
OutputNum:
mov rax,01
mov rdi,01
mov rsi,r8
mov rdx,17
syscall
add r8,17 ; incrementing the pointer by 17 bytes to point to the next memory
dec byte[cnt] ; decrementing the counter by 1
jnz OutputNum ; if counter is not zero, repeat the loop
Exit:
mov rax,60 ; exit system call
mov rdi,0 ; exit status
syscall ; system call to exit the program
Output:
You can understand the code above from the code and comments. Below is full detailed explaination.
section .data
msg1 db "Program to accept 5 numbers and print them!",0xA
len1 equ $-msg1
msg2 db "Enter 5 numbers:" ,0xA
len2 equ $-msg2
msg3 db "Displaying 5 numbers:" ,0xA
len3 equ $-msg3
cnt db 05h
mov r8,00h
Here we have the .data
section where we define our messages and constants. msg1
, msg2
, and msg3
are our messages and len1
, len2
, and len3
are the length of each message respectively. cnt
is a counter to keep track of the number of times the user inputs a value. r8
is used to store the address of the num
array.
section .bss
num resb 16 ;array
Here we have the .bss
section where we define the num
array which will hold the 5 hexadecimal numbers input by the user. It is defined as a 16-byte array since each hexadecimal number is 64-bit, and we have to store 5 of them.
section .text
global _start
_start :
Here we have the .text
section where we define our program's code. _start
is the entry point of our program.
Msg1:
mov rax,01
mov rdi,01
mov rsi,msg1
mov rdx,len1
syscall
This section is responsible for printing the first message that explains the program's purpose. We use the syscall
instruction with rax
equal to 1 to write to the standard output (screen).
InputMsg:
mov rax,01
mov rdi,01
mov rsi,msg2
mov rdx,len2
syscall
Here we print the second message which prompts the user to input 5 numbers.
mov r8,num
InputNum:
mov rax,00
mov rdi,00
mov rsi,r8
mov rdx,17
syscall
add r8,17
dec byte[cnt]
jnz InputNum
This is the loop that inputs the 5 numbers into the num
array. We use the syscall
instruction with rax
equal to 0 to read from the standard input (keyboard).
In each iteration, rsi
is set to the current position of the num
array pointed by r8
. The length of the input string is 17 bytes since it can read one 64-bit hexadecimal number (16 bytes) plus a new line character (1 byte).
After each input, we increment the r8
register by 17 bytes to point to the next position in the num
array. We decrement the cnt
variable by one to keep track of the number of remaining inputs. The loop runs 5 times to input all the 5 numbers.
OutputMsg:
mov rax,01
mov rdi,01
mov rsi,msg3
mov rdx,len3
syscall
This section prints the message indicating that the program is going to display the 5 numbers.
Please Like the blog if you like it or find helpfull !!