title: Assembly program that finds second largest value in array
body: <p>I wrote a assembly program that finds the max value in an array, but now I would like it to find the second largest number in the array. How would I modify my program to do this? </p>
  
  <p>This is the program I wrote and it does work. The program prints all the values in the array and then finds the max value of the array. Now I want it to find the second largest value.</p>
  
  <pre><code> %include "io.mac"
  .STACK 100H 
  
  .DATA
     Numbers DW 3,4,5,2,6,0
     msg0  db "Printing values in array",0
     msg1  db "Max",0
     msg2  db "Min",0
  
     .CODE
          .STARTUP
      PutStr msg0
      mov dx, Numbers 
      mov si, dx ;point to array
      printValues:
      cmp word [si], 0
      je procedure
      nwln
      PutInt [si]
      add si, 2
      jmp printValues
  
      procedure:
      push Numbers ;push Number to stack to pass parameter by stack
      call maxMeth
      nwln
      PutStr msg1
      nwln
  
      PutInt ax
      nwln
  
  
  
  
      complete:
  .EXIT
  
  
  
  
  
  maxMeth:
      enter 0,0 ;save old bp and set bp to sp
      mov si, [bp+4] ;point to array 
      mov ax, [si]   ; ax holds max
      add si,2 ; Increment si to next number
  
  ;Now entering loop
  max:   
      cmp word [si],0   ; checks to see if the number is 0 and if it is, then we are done.
      je finish
      cmp ax, [si]        ; ax holds the max . So if ax is greater than si, then dont assign si to ax. 
      jge increment
      jmp newMax
  newMax: 
      mov ax, [si] ; Otherwise we have a new a max
  
  increment:   
      add si, 2   ;now increment si to check the next value and jump back to the main loop.
      jmp max
  
  finish: ;clean up.
      leave ;pop bp
      ret   ;return
  </code></pre>
  
  <p>I edited my program to keep track of the second max and the result I receive for the second max value is 3. I was expecting the program to output 5. Im not sure why I am getting the wrong output. Here are my edits to the program.</p>
  
  <pre><code>%include "io.mac"
  .STACK 100H 
  
  .DATA
     Numbers DW 3,4,5,2,6,0
     msg0  db "Printing values in array",0
     msg1  db "Max",0
  
  
     .CODE
          .STARTUP
      PutStr msg0
      mov dx, Numbers 
      mov si, dx ;point to array
      printValues:
      cmp word [si], 0
      je procedure
      nwln
      PutInt [si]
      add si, 2
      jmp printValues
  
      procedure:
      push Numbers ;push Number to stack to pass parameter by stack
      call maxMeth
      nwln
      PutStr msg1
      nwln
  
      PutInt ax
      nwln
  
     PutInt bx
      nwln
  
  
      complete:
  .EXIT
  
  
  
  
  
  maxMeth:
      enter 0,0 ;save old bp and set bp to sp
      mov si, [bp+4] ;point to array 
      mov ax, [si]   ; ax holds max
      mov bx, [si]   ; ax holds max
      add si,2 ; Increment si to next number
  
  ;Now entering loop
  max:   
      cmp word [si],0   ; checks to see if the number is 0 and if it is, then we are done.
      je finish          ;equals 0, then finished
      cmp ax, [si]         
      jg testSecondMax   ;So if ax is greater than si, then dont assign si to ax and check second max
      jmp newMax         ;otherwise go to new max
  
  
  newMax: 
      mov ax, [si] ; save new max
      jmp increment ; and increment
  
  testSecondMax:
      cmp bx, [si]
      jl secondMax
      jg increment
  
  secondMax:
      mov bx, [si]
      jmp increment
  
  increment:  
      add si, 2   ;now increment si to check the next value and jump back to the main loop.
      jmp max 
  
  
  
  finish: ;clean up.
      leave ;pop bp
      ret   ;return
  </code></pre>