From fc192e5a57511fa50bce1f1df9ad4bce44938479 Mon Sep 17 00:00:00 2001
From: Hayden Chow <kin3.chow@live.uwe.ac.uk>
Date: Thu, 5 Dec 2024 00:53:47 +0000
Subject: [PATCH] edited

---
 src/task2.2.asm | 150 +++++++++++++++++++++++++-----------------------
 1 file changed, 77 insertions(+), 73 deletions(-)

diff --git a/src/task2.2.asm b/src/task2.2.asm
index adbba83..909f38c 100644
--- a/src/task2.2.asm
+++ b/src/task2.2.asm
@@ -1,93 +1,97 @@
+%include "asm_io.inc"
 
-%include "asm_io.inc"  
 segment .data
-    prompt_start db "Enter the start of the range: ", 0  ; 
-    prompt_end db "Enter the end of the range: ", 0  ; 
-    msg_result db "The sum of the array is: ", 0  ; 
-    newline db 10, 0  ; Newline character
+    prompt_start db "Enter the start index (1-100): ", 0   ; Prompt for start index
+    prompt_end db "Enter the end index (1-100): ", 0         ; Prompt for end index
+    error_msg db "Error: Invalid range. Please enter values between 1 and 100.", 0 ; Error message
+    newline db 10, 0                                        ; Newline character
+    sum_msg db "The sum of the selected range is: ", 0        ; Sum message
 
 segment .bss
-    array resd 100     ; 
-    sum resd 1         ; 
-    start resd 1       ; 
-    end resd 1         ; 
+    array resd 100                                           ; Array to hold 100 integers
+    start_index resd 1                                        ; Variable to store start index
+    end_index resd 1                                          ; Variable to store end index
+    sum_result resd 1                                         ; Variable to store the sum result
 
 segment .text
 global asm_main
 
 asm_main:
-    pusha  ; 
-    mov ebx, array            ; 
-init_array:
-    mov [ebx], ecx            ; 
-    add ebx, 4                ; 
-    inc ecx                   ; 
-    cmp ecx, 101              ; 
-    jl init_array             ; 
+    pusha                                                     ; Save all registers
 
-    ; Sum the entire array
-    mov ecx, 100              ; 
-    mov ebx, array            ; 
-    xor edx, edx              ;
-sum_array:
-    add edx, [ebx]            ; 
-    add ebx, 4                ; 
-    loop sum_array            ; 
+    ; Initialize the array with values 1 to 100
+    mov ecx, 1                                                ; Start from 1
+    mov edi, array                                            ; Point to the start of the array
+initialize_array:
+    mov [edi], ecx                                            ; Store current value into array
+    add edi, 4                                                ; Move to the next element (each element is 4 bytes)
+    inc ecx                                                   ; Increment the value
+    cmp ecx, 101                                              ; Stop when value reaches 101
+    jl initialize_array                                       ; Repeat for values 1 to 100
 
-    ; Store the sum in the 'sum' variable
-    mov [sum], edx            ; 
+    ; Ask the user for the start index
+    mov eax, prompt_start                                     ; Load "Enter the start index:" message
+    call print_string                                         ; Print the prompt
+    call read_int                                             ; Read the integer input (start index)
+    mov [start_index], eax                                    ; Store start index
 
-    ; Print the result message
-    mov eax, msg_result       ; 
-    call print_string         ; 
-    mov eax, [sum]            ; 
-    call print_int            ; 
-    call print_nl             ; 
+    ; Ask the user for the end index
+    mov eax, prompt_end                                       ; Load "Enter the end index:" message
+    call print_string                                         ; Print the prompt
+    call read_int                                             ; Read the integer input (end index)
+    mov [end_index], eax                                      ; Store end index
 
-    ; Ask the user for the start of the range
-    mov eax, prompt_start     ; 
-    call print_string         ; 
-    call read_int             ; 
-    mov [start], eax          ; 
+    ; Validate the range (check if start_index is less than or equal to end_index, and within bounds)
+    mov eax, [start_index]                                    ; Load start index
+    cmp eax, 1                                                ; Check if start index >= 1
+    jl invalid_range                                          ; Jump to error if less than 1
+    cmp eax, 100                                              ; Check if start index <= 100
+    jg invalid_range                                          ; Jump to error if greater than 100
 
-    ; Ask the user for the end of the range
-    mov eax, prompt_end       ; 
-    call print_string         ; 
-    call read_int             ; 
-    mov [end], eax            ; 
+    mov eax, [end_index]                                      ; Load end index
+    cmp eax, 1                                                ; Check if end index >= 1
+    jl invalid_range                                          ; Jump to error if less than 1
+    cmp eax, 100                                              ; Check if end index <= 100
+    jg invalid_range                                          ; Jump to error if greater than 100
 
-    ; Check if the range is valid
-    mov eax, [start]          ; 
-    mov ebx, [end]            ; 
-    cmp eax, ebx              ; 
-    jge invalid_range         ; 
+    mov eax, [start_index]                                    ; Load start index into eax
+    mov ebx, [end_index]                                      ; Load end index into ebx
+    cmp eax, ebx                                              ; Compare start index with end index
+    jg invalid_range                                          ; If start > end, jump to invalid_range
 
-    ; Sum the range between start and end
-    xor edx, edx              ; 
-    mov ecx, [start]          ; 
-    mov ebx, [end]            ; 
-sum_range:
-    add edx, ecx              ; 
-    inc ecx                   ; 
-    cmp ecx, ebx              ;
-    jle sum_range             ; 
-
-    ; Print the sum of the range
-    mov eax, "The sum of the range is: "  ; Print result message
-    call print_string         ;
-    mov eax, edx              ; 
-    call print_int            ; 
-    call print_nl             ; 
+    ; Sum the elements from start_index to end_index - 1
+    xor ecx, ecx                                              ; Clear ECX (counter)
+    xor edx, edx                                              ; Clear EDX (sum accumulator)
+    mov edi, array                                            ; Point to the start of the array
+    mov esi, [start_index]                                    ; Load start index (1-based)
+    sub esi, 1                                                ; Convert start index to 0-based (1 -> 0)
+    mov ecx, esi                                              ; Set ECX to start index (0-based)
 
-    jmp end_program           ; 
+sum_range:
+    ; Add current element to the sum
+    mov eax, [array + ecx*4]                                  ; Load the value from the array at index ECX
+    add edx, eax                                              ; Add the value to the sum
+    inc ecx                                                   ; Move to the next index
+    cmp ecx, [end_index]                                      ; Check if we reached the end index (ignoring the last element)
+    jge display_sum                                            ; If ECX >= end_index, jump to display the sum
+    jmp sum_range                                              ; Repeat summing
 
 invalid_range:
-    ; Print an error message if the range is invalid
-    mov eax, "Error: Invalid range. The start must be less than the end."  ; 
-    call print_string         ;
-    call print_nl             ; 
+    ; Print the error message
+    mov eax, error_msg                                        ; Load error message
+    call print_string                                         ; Print the error message
+    call print_nl                                             ; Print a newline
+    jmp asm_main                                              ; Restart the program
+
+display_sum:
+    ; Display the sum result
+    mov eax, sum_msg                                          ; Load the sum message
+    call print_string                                         ; Print the sum message
+    mov eax, edx                                              ; Move the sum into EAX
+    call print_int                                            ; Print the sum
+    call print_nl                                             ; Print a newline
 
-end_program:
-    popa                      ; 
-    mov eax, 0                ; 
-    ret
+    ; End the program
+    popa                                                      ; Restore all registers
+    mov eax, 0                                                ; Set return value to 0
+    ret                                                       ; Return from the program
-- 
GitLab