Advertisement
yosikadoshi

Hw3Small

May 30th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Hw3Small.asm
  2.  
  3.     .MODEL SMALL
  4.    .STACK 100h
  5.    .DATA
  6. ;_find_closest_pair variables
  7.      ArrSize        DW ?
  8.      i              DW ?
  9.      j              DW ?
  10.      tmpSub         DD ?
  11.      minSub         DD ?
  12.      tmpDI          DW ?
  13.      
  14. ;_find_closest_matrix_pair variables
  15.      MatrixSize     DW ?
  16.      i1             DW ?
  17.      i2             DW ?         
  18.      j1             DW ?
  19.      j2             DW ?     
  20.     .CODE
  21.      .386
  22. PUBLIC _find_closest_pair
  23. ;extern long int find_closest_pair(long int arr1[], long int arr2[], int n, int *i_index, int *j_index);
  24. ;                                       [BP+4]         [BP+6]      [BP+8]     [BP+10]      [BP+12]
  25. _find_closest_pair  PROC NEAR
  26.      PUSH BP
  27.      MOV BP, SP
  28.      PUSH DI
  29.      PUSH SI
  30.  
  31.      ;put the arrays size in a variable
  32.      MOV AX,[BP+8]
  33.      MOV ArrSize,AX  
  34.      
  35.      ;[DI] --> Arr1[0]
  36.      MOV DI,[BP+4]
  37.  
  38.      ;[SI] --> Arr2[0]
  39.      MOV SI,[BP+6]
  40.  
  41. ; intialize minSub to |(arr1[0]-arr2[0])|
  42.      MOV EAX, [DI]
  43.      SUB EAX, [SI]
  44.      JNS positive
  45. negative:
  46.      NEG EAX
  47. positive:
  48.      MOV minSub, EAX
  49.      
  50. ;==============CODE IN C:==============
  51. ;   for(i=0;;i<ArrSize;i++)
  52. ;       for(j=0;j<ArrSize;j++)
  53. ;       {
  54. ;           tmpSub=(arr1[i]-arr2[j])
  55. ;           if(tmpSub<0)
  56. ;               tmpSub*=-1;
  57. ;           if (tmpSub<minSub){
  58. ;               minSub=tmpSub
  59. ;               i_index=i;
  60. ;               j_index=j;
  61. ;               }
  62. ;       }
  63. ;=====================================
  64.  
  65. ;initialize i=0 for first loop  :
  66.      XOR AX, AX
  67.      MOV i, AX
  68. subLoopOut:
  69.  
  70.      MOV BX, i
  71.      SHL BX, 2 ;i*4
  72.      MOV ECX, [DI+BX] ;ECX= arr1[i]
  73.      
  74. ;initialize j=0 for second loop:
  75.      XOR AX, AX
  76.      MOV j, AX
  77. subLoopin:
  78.      MOV BX, j
  79.      SHL BX, 2 ;j*4
  80.      MOV EAX, [SI+BX] ;EAX= arr2[j]
  81.      SUB EAX, ECX       ;tmpsuB= arr2[J] - srr2[I]
  82.      JNS not_neg
  83.      NEG EAX
  84. not_neg:     
  85.      MOV tmpSub, EAX
  86.      CMP EAX, minSub
  87.      JG doNotUpdateMin
  88.      
  89.      MOV tmpDI, DI ;save DI value
  90.  
  91.      ;update minSub
  92.      MOV minSub, EAX
  93.      
  94.      ;update i_index
  95.      MOV DI, [BP+10]
  96.      MOV AX, i
  97.      MOV [DI], AX
  98.      
  99.      ;update j_index
  100.      MOV DI, [BP+12]
  101.      MOV AX, j
  102.      MOV [DI], AX
  103.      
  104.      MOV DI, tmpDI ;return DI his original value
  105.      
  106. doNotUpdateMin:  
  107.      ;subLoopin iteration check  
  108.      INC j
  109.      MOV AX, ArrSize
  110.      CMP j, AX
  111.      JB subLoopin
  112.      
  113.      ;subLoopOut iteration check
  114.      INC i
  115.      MOV AX, ArrSize
  116.      DEC AX
  117.      CMP i, AX
  118.      JB subLoopOut
  119.      
  120.      ;return DX:AX
  121.      PUSH minSub
  122.      POP AX
  123.      POP DX
  124.      
  125.      POP SI
  126.      POP DI
  127.      POP BP
  128. ;Ending procedure find_closest_pair
  129.      RET
  130.      _find_closest_pair  ENDP
  131.  
  132.  
  133. PUBLIC _find_closest_matrix_pair
  134. ;extern long int find_closest_matrix_pair(long int *arr_ptr[], int n, int m, int *i1_index, int *j1_index,  int *i2_index, int *j2_index);
  135. ;                                                   [BP+4]     [BP+6] [BP+8]      [BP+10]        [BP+12]        [BP+14]         [BP+16]
  136. _find_closest_matrix_pair  PROC NEAR
  137.      PUSH BP
  138.      MOV BP, SP
  139.      PUSH DI
  140.      PUSH SI
  141.      
  142.      ;insert n to MatrixSize
  143.      MOV AX,[BP+6]
  144.      MOV MatrixSize,AX
  145.     ;insert m to ArrSize
  146.      MOV AX,[BP+8]
  147.      MOV ArrSize,AX
  148.      
  149.      ;[DI] --> arr_ptr[0]
  150.      MOV DI,[BP+4]
  151.      ;[SI] --> arr_ptr[0]
  152.      MOV SI,[BP+4]
  153.      
  154.      ;initiate minSub to the maximum value possible
  155.      MOV minSub,0
  156.      NOT minSub
  157.      
  158. ;initialize i1=0 for first loop :
  159.      XOR AX, AX
  160.      MOV i1, AX
  161. matLoopOut:  
  162.  
  163. ;initialize i2=i1+1 for second loop:
  164.      MOV AX, i1
  165.      INC AX
  166.      MOV i2, AX
  167. matLoopin:   
  168.  
  169.         ;push values to stack, before calling func find_closest_pair
  170.         PUSH OFFSET j1
  171.         PUSH OFFSET j2
  172.         PUSH ArrSize
  173.         MOV BX,i2
  174.         SHL BX,1 ;i2*2     
  175.         PUSH WORD PTR [DI+BX]
  176.         MOV BX,i1
  177.         SHL BX,1 ;i1*2     
  178.         PUSH WORD PTR [SI+BX]
  179.        
  180.         CALL _find_closest_pair
  181.        
  182.         ;ignore junk and clear stack
  183.         ADD SP, 4
  184.         POP ArrSize
  185.         ADD SP, 4
  186.  
  187.         ;mov result saved in DX:AX to tmpSub
  188.         PUSH DX
  189.         PUSH AX
  190.         POP tmpSub
  191.  
  192.         ;check if (tmpSub < minSub)
  193.         MOV EAX,tmpSub
  194.         CMP EAX,minSub
  195.         JG dontUpdateMin
  196.        
  197.         MOV tmpDI, DI ;save DI value
  198.  
  199.         ;Update minSub = tmpSub
  200.         MOV minSub,EAX
  201.        
  202.         ;Update indexes
  203.         MOV DI,[BP+10]
  204.         MOV BX,i1
  205.         MOV [DI],BX ;*i1_index=i1
  206.  
  207.         MOV DI,[BP+12]
  208.         MOV BX,j1
  209.         MOV [DI],BX ;*j1_index=l1
  210.  
  211.         MOV DI,[BP+14]
  212.         MOV BX,i2
  213.         MOV [DI],BX ;*i2_index=i2
  214.  
  215.         MOV DI,[BP+16]
  216.         MOV BX,j2
  217.         MOV [DI],BX ;*j2_index=j2
  218.        
  219.         MOV DI, tmpDI ;return DI his original value
  220.        
  221.  dontUpdateMin:
  222.      ;sumLoopin iteration check  (i2<MatrixSize)
  223.      INC i2
  224.      MOV AX, MatrixSize
  225.      CMP i2, AX
  226.      JB matLoopin
  227.      
  228.      ;sumLoopOut iteration check (i1<MatrixSize-1)
  229.      INC i1
  230.      MOV AX, MatrixSize
  231.      DEC AX
  232.      CMP i1, AX
  233.      JB matLoopOut
  234.      
  235.      ;return DX:AX
  236.      PUSH minSub
  237.      POP AX
  238.      POP DX
  239.  
  240.      POP SI
  241.      POP DI
  242.      POP BP
  243. ;Ending procedure find_closest_matrix_pair
  244.      RET
  245.      _find_closest_matrix_pair  ENDP
  246. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement