Rutina en ensamblador para obtener el máximo número

Rutina que calcula el máximo de los enteros que están almacenados en una tabla.

Los enteros son de 16 bits. El resultado se devolverá en el registro AX.

Versión sin función:

datos segment
   tabla dw 2,4,8,1,3
   tam dw 10
datos ends

pila segment stack ‘stack’
   db 128 dup(?)
pila ends

codigo segment
   assume cs:codigo,ds:datos,ss:pila
   ppal proc far
      push ds
      xor ax,ax
      push ax
      mov ax,datos
      mov ds,ax ;5 instrucciones
      mov bx, tam
      sub bx,2 ;como estoy en la posicion 10 decremento 2 para poder sacar el ultimo
      mov ax,tabla[bx] ;meto en ax el numero q hay en la tabla
      bucle:mov cx,tabla[bx] ;meto en cx el numero q hay en la tabla
       cmp ax,cx ;comparo ax con cx y se activa el flag de signo si cx>ax
      jns sigue
      mov ax,cx
      sigue:sub bx,2
      jns bucle
      retf
   ppal endp
codigo ends
end ppal

Versión con función:

datos segment
tabla dw 2,255,9,1,3
   tam dw 10
datos ends

pila segment stack ‘stack’
   db 128 dup(?)
pila ends

codigo segment
   assume cs:codigo,ds:datos,ss:pila
   ppal proc far
push ds
      xor ax,ax
      push ax
      mov ax,datos
      mov ds,ax ;5 instrucciones

      mov ax,offset tabla
      push ax
      mov ax, tam
      push ax

      call mayor ;llamo a la funcion
      retf
   ppal endp

   mayor proc
      push bp
      push si
      push bx
      push cx

      mov bp,sp ;hago copia del puntero sp
      mov si, 12 [bp] ;recupero la tabla
      mov bx, 10 [bp] ;recupero tam
      sub bx,2 ;como estoy en la posicion 10 decremento 2 para poder “sacar el
ultimo
      mov ax,[si][bx] ;inicializo ax al ultimo numero d la tabla
bucle: mov cx, [si][bx] ;meto en cx el numero q hay en la tabla
para luego compararlo con ax
      cmp ax, cx ;comparo ax con cx
      jns sigue
      mov ax, cx
   sigue:   sub bx, 2
      jns bucle

      pop cx
      pop bx
      pop si
      pop bp

      ret 4
   mayor endp
codigo ends
end ppal

Quizá te interese...