Advertisement
rnort

asm_1 (sort words by len)

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