0

So I have the following code that worked for finding the LARGEST number in any given n by m matrix.

segment .bss
  num: resw 1 ;For storing a number, to be read of printed....
  nod: resb 1 ;For storing the number of digits....
  temp: resb 2
  matrix1: resw 200
  m: resw 1
  n: resw 1
  i: resw 1
  j: resw 1
buff resb 4

segment .data
  msg1: db "Enter the number of rows in the matrix : "
  msg_size1: equ $-msg1
  msg2:  db "Enter the elements one by one(row by row) : "
  msg_size2: equ $-msg2
  msg3: db "Enter the number of columns in the matrix : "
  msg_size3: equ $-msg3
 msg4: db "The smallest Number is... : "
  msg_size4: equ $-msg4

  tab: db  9 ;ASCII for vertical tab
  new_line: db 10 ;ASCII for new line

segment .text

global _start

_start:
  mov eax, 4
  mov ebx, 1
  mov ecx, msg1
  mov edx, msg_size1
  int 80h

  mov ecx, 0
  call read_num  
  mov cx, word[num]
  mov word[m], cx

  mov eax, 4
  mov ebx, 1
  mov ecx, msg3
  mov edx, msg_size3
  int 80h

  mov ecx, 0
  call read_num  
  mov cx, word[num]
  mov word[n], cx

  mov eax, 4
  mov ebx, 1
  mov ecx, msg2
  mov edx, msg_size2
  int 80h

  ;Reading each element of the matrix........
  mov eax, 0
  mov ebx, matrix1  

  mov word[i], 0
  mov word[j], 0


  i_loop:
    mov word[j], 0
    j_loop:

 call read_num
mov dx , word[num]
 ;eax will contain the array index and each element is 2 bytes(1 word) long
 mov  word[ebx + 2 * eax], dx

 inc eax    ;Incrementing array index by one....

 inc word[j]
 mov cx, word[j]
 cmp cx, word[n]
 jb j_loop

    inc word[i]
    mov cx, word[i]
    cmp cx, word[m]
    jb i_loop
; read out matrix code 
    xor     esp, [matrix1]         
    ; esp initialized to first element in array, & is first smallest value


  ;Loop through the matrix, check each number if its 
  ;larger than the first number in the array. AT the end print said number.

    ;Reading each element of the matrix.(Storing the elements in row major order).......
  mov ebp, 0
  mov edi, matrix1  
  mov esp, 0

  mov word[i], 0
  mov word[j], 0


  i_loop2:
    mov word[j], 0
    j_loop2:

    ;eax will contain the array index and each element is 2 bytes(1 word) long
    mov  dx, word[edi+2*ebp]   ;
    mov word[num] , dx

    cmp esp, [num] ; compares current smallest number with current element iterated.
    jle   skip
    mov esp, [num] ; stores new smallest number
    mov esi, ebp   ; Stores pointer to the smallest element (never used..?)

    skip:
inc ebp
 inc word[j]
 mov cx, word[j]
 cmp cx, word[n]
 jb j_loop2

    inc word[i]
    mov cx, word[i]
    cmp cx, word[m]
    jb i_loop2

    ;outut
  mov eax, 4
  mov ebx, 1
  mov ecx, msg4
  mov edx, msg_size4
  int 80h
mov ecx, 0

    mov eax, 4  ; system_write
    mov ebx, 1  ; stdout
    mov ecx, esp    ; move smallest element to accumulator
    add ecx, 48         ; convert to ascii representation
    mov [buff], ecx     ; move to memory
    mov ecx, buff
    mov edx, 4          ; size, 4 bytes
    int 80h

exit:
  mov eax, 1
  mov ebx, 0
  int 80h

;Function to read a number from console and to store that in num 
read_num:

  pusha
  mov word[num], 0

  loop_read:
    mov eax, 3
    mov ebx, 0
    mov ecx, temp
    mov edx, 1
    int 80h

    cmp byte[temp], 10
      je end_read

    mov ax, word[num]
    mov bx, 10
    mul bx
    mov bl, byte[temp]
    sub bl, 30h
    mov bh, 0
    add ax, bx
    mov word[num], ax   

    jmp loop_read 
  end_read:
  popa

ret

I've identified the problem is likely mov esp, 0 but without that line the results are even worse, with it the answer is always '0'. Without it it result in either nothing or gibberish.

Again, it original works for finding the LARGEST number but now I want to find the smallest, logically this should've meant just changing jge to jle but either it keeps zero (likely because of mov esp, 0 ) or gibberish if I try to make it something else?

How can I fix this so I do find the smallest number with the least amount of changes? The code did originally work albeit only after significant trial and error almost at random with my fiddling.

Additionally the gibberish outputted is this: â½µÿ

If I remove mov esp, 0 but keep it as jge, it still works for the LARGEST number, but if I switch it to jle, it outputs â½µÿ. This makes zero sense.

4

0 回答 0