Advertisement
rnort

Untitled

Mar 6th, 2012
394
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; multi-segment executable file template.
  2.  
  3. data segment
  4.     prompt db "enter string (max 200 characters) :$"
  5.     pkey db "press any key...$"  
  6.     buffer db 200  dup('$')
  7.     minlen dw 0C8h
  8.     sh dw 0
  9. ends
  10.  
  11. stack segment
  12.     db   128  dup(0)
  13. ends
  14.  
  15. code segment
  16.    
  17.  
  18. swap proc near
  19.  
  20.   push ax
  21.   xor ax, ax    
  22.        
  23.   loop_swap_1:
  24.  
  25.   xchg al, [bx+si]
  26.   xchg al, [bx+di]
  27.   mov [bx+si], al
  28.  
  29.   inc si
  30.   inc di
  31.   cmp [bx+di],' '
  32.   je loop_swap_1_end
  33.  
  34.   mov al, [bx+di]
  35.   cmp al, 024h
  36.   jne loop_swap_1
  37.   loop_swap_1_end:
  38.  
  39.   dec di
  40.  
  41.   loop_swap_2:
  42.   mov ah, [bx+si]
  43.   push si    
  44.  
  45.   loop_swap_3:
  46.   mov al, [bx+si+1]
  47.   mov [bx+si], al
  48.  
  49.   inc si
  50.   cmp si, di
  51.   jne loop_swap_3
  52.  
  53.   pop si
  54.   mov [bx+di], ah
  55.  
  56.   cmp [bx+si],' '
  57.   je loop_swap_2_end
  58.   cmp [bx+si],'$'
  59.   jne loop_swap_2
  60.  
  61. loop_swap_2_end:
  62.     pop ax  
  63.   ret      
  64. swap endp    
  65. ;-----------------------
  66. find_sh proc near
  67.    
  68.     ; di - loop counter here :)
  69.     mov minlen, 0C8h
  70.     dec di
  71.     loop_sh:
  72.     inc di          ;
  73.                
  74.     xor cx, cx
  75.     mov cx, di
  76.     mov bx, si
  77.     add bx, cx  
  78.    
  79.     call find_beg   ; after it in cx - index of beg , bx - point to biginning
  80.     cmp cx, 0ffffh
  81.     je loop_sh_end
  82.      
  83.     mov bx, si
  84.     mov di, cx
  85.     call find_end   ; after in di - index of end,  bx - point to 0 element
  86.     cmp di, 0ffffh
  87.     je loop_sh_end
  88.     push di
  89.     sub di, cx      ; in di - tmplen
  90.     cmp di, minlen
  91.     jae below_e
  92.     mov minlen, di  ; min len - drom di to minlen variable
  93.     mov sh, cx      ; index of min len ( shortest ) - to sh
  94.     below_e:        ; below equal - nothing to do
  95.     pop di          ; restore di as counter for loop_sh    
  96.     cmp [bx+di], '$'
  97.     jne loop_sh
  98.     loop_sh_end:
  99.    
  100.     ret    
  101. find_sh endp    
  102. ;----------------------
  103. find_beg proc near
  104.          
  105.     dec bx
  106.     dec cx      
  107. loop_beg:            
  108.     inc bx
  109.     inc cx    
  110.     cmp [bx], ' '   ; if (buf[i]!= ' ')  
  111.     je sp_equal
  112.     cmp cx, 0       ; &&  a == 0
  113.     je  loop_beg_end         ; return 0
  114.     dec cx          ;
  115.     cmp [bx-1],' '    ; && (buf[i-1]== ' ']
  116.     je  loop_beg_end        ; return i
  117.     inc cx          ; buf[i]
  118.     jmp lbl1
  119. sp_equal:
  120.     inc cx          ; i+1
  121.     cmp [bx+1], '$'
  122.     je loop_beg
  123.     cmp [bx+1], ' '   ; if (buf[i+1] != ' ')
  124.     jne loop_beg_end    ; return i+1
  125.     dec cx          ; i
  126. lbl1:    
  127.     cmp [bx], '$'   ; if (buf[i] == 0)
  128.     jne loop_beg    
  129.     mov cx, 0ffffh
  130. loop_beg_end:
  131.     ret    
  132. find_beg endp      
  133.    
  134. ;===============================
  135. ; working ^)
  136. find_end proc near
  137.    
  138.    loop_end:
  139.    cmp [bx+di], ' '
  140.    je lbl2
  141.    cmp [bx+di+1], ' '
  142.    je loop_end_end
  143.    cmp [bx+di+1], '$'
  144.    je loop_end_end
  145.    cmp [bx+di], '$'
  146.    lbl2:
  147.    inc di
  148.    jne loop_end
  149.    mov di, 0ffffh
  150.    loop_end_end:
  151.    
  152.     ret    
  153. find_end endp    
  154.  
  155.    
  156. start:
  157. ; set segment registers:  
  158.     mov ax, data
  159.     mov ds, ax
  160.     mov es, ax
  161. ;==============================
  162. ; add your code here
  163. ; ----------------------------------------------------------              
  164.     mov dx, offset buffer   ; read string
  165.     mov ah, 0ah
  166.     int 21h                  
  167. ; check length    
  168.     cmp buffer[1], 1        ; if 1 symbol - skip sorting
  169.     jbe press_akey    
  170. ;===============================
  171. ; remove $ signs inside inputted str buffer
  172. ;===============================
  173.     mov bx,offset  buffer+2
  174.     xor cx, cx
  175.     mov cl, buffer[1]
  176. loop_$:                
  177.     xor ax, ax
  178.     mov al, [bx]    
  179.     cmp al, 24h  
  180.     jne not_$
  181.     mov al, ' '      
  182.     mov [bx], al    
  183. not_$:          
  184.     inc bx
  185.     loop loop_$
  186. ;===============
  187.  
  188.  
  189. ;===============================    
  190.     xor bx, bx             ; clear bx register
  191.     mov bl, buffer[1]      ; mov length of buffer to bl register
  192.     mov buffer[bx+2], '$'  ; add $ sign to the end of buffer string
  193.  ;==============================  
  194.    
  195.     mov si, offset buffer + 2   ;
  196.    
  197.     xor cx,cx
  198.     xor ax,ax   ; counter for loop1
  199.                              
  200. loop1:
  201.  
  202.        
  203. ; find beginning of next word                  
  204.     mov cx, ax ; cx -  counter for loop_beg
  205.     mov bx, si
  206.     add bx, cx   ; set bx pointer to start point before searching beginning of word
  207. ; find beginning of word here ( working ) bug: single symbol without space after it on the end of str ^(
  208.     call find_beg      
  209. ; -----------
  210. ; find end      
  211.     mov di, cx ; start searching end from the beginning of preivios found word
  212.     call find_sh  ; find shortest, in sh variable - index of shortest
  213. ; --------
  214. ; debug output
  215.     ;push ax    ; save ax
  216.     ;mov di, sh
  217.     ;mov ah, 2
  218.     ;mov dl, [bx+di]
  219.     ;int 21h
  220.     ;pop ax
  221.    
  222.     ;cmp cx, ax
  223.     ;jbe bel_eq
  224.     ;mov ax, cx
  225.    
  226.    
  227.     cmp ax, sh
  228.     je eq_
  229.     cmp ax, 0ffffh
  230.     je eq_
  231.     push si
  232.     mov bx, si
  233.     mov si, ax
  234.     mov di, sh
  235.     call swap ; swap si and di
  236.     mov ax, si
  237.     pop si
  238. eq_:
  239.     inc ax                    
  240.     add bx, ax    
  241.     cmp [bx], '$'            
  242.     jne loop1                              
  243.  
  244. ;=============================
  245.     mov dx, si
  246.     mov ah, 9                   ; show our string
  247.     int 21h                     ;
  248. ;==============================                      
  249. ; show Press any key... message
  250. press_akey:          
  251.     lea dx, pkey
  252.     mov ah, 9
  253.     int 21h        ; output string at ds:dx
  254.    
  255. ;wait for any key....    
  256.     mov ah, 1
  257.     int 21h
  258.    
  259.     mov ax, 4c00h ; exit to operating system.
  260.     int 21h    
  261. ends
  262.  
  263. end start       ; set entry point and stop the assembler.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement