Guest User

Untitled

a guest
Aug 13th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Задание 3, вариант 2-4-4.
  2. ; Матвей Андриенко, 112
  3.  
  4. include io.asm
  5.  
  6. stack segment stack
  7.     dw 128 dup (?)
  8. stack ends
  9.  
  10. data segment
  11.     max_len equ 101
  12.     orig_str db max_len dup(?)
  13.     new_str db max_len dup(?)
  14.     len dw 0
  15. data ends
  16.  
  17. code segment 'code'
  18.     assume ss:stack, ds:data, cs:code
  19.    
  20.     ; чтение строки
  21.     read_str proc ; offset str, offset length
  22.         push bp
  23.         mov bp, sp
  24.         push si
  25.         push ax
  26.         push bx
  27.        
  28.         mov si, [bp + 6] ; si := offset str
  29.         xor bx, bx ; bx - длина строки
  30.    
  31.     rs_loop:
  32.         inch al
  33.         cmp al, '.'
  34.         je rs_eos
  35.         mov [si], al
  36.         inc si
  37.         inc bx
  38.         jmp rs_loop
  39.        
  40.     rs_eos:
  41.         mov [si], '$'
  42.         mov si, [bp + 4]
  43.         mov [si], bx
  44.        
  45.         flush
  46.        
  47.         pop bx
  48.         pop ax
  49.         pop si
  50.         pop bp
  51.        
  52.         ret 4
  53.     read_str endp
  54.    
  55.     ; проверяет, является ли символ в al цифрой.
  56.     ; если да, то bl := true, иначе bl := false
  57.     is_digit proc
  58.         cmp al, '0'
  59.         jb id_false
  60.         cmp al, '9'
  61.         ja id_false
  62.         mov bl, 0FFh
  63.         jmp id_return
  64.     id_false:
  65.         xor bl, bl
  66.    
  67.     id_return:
  68.         ret
  69.     is_digit endp
  70.    
  71.     ; проверяет, является ли символ в al строчной латинской буквой.
  72.     ; если да, то bl := true, иначе bl := false
  73.     is_small_lat proc
  74.         cmp al, 'a'
  75.         jb isl_false
  76.         cmp al, 'z'
  77.         ja isl_false
  78.         mov bl, 0FFh
  79.         jmp isl_return
  80.     isl_false:
  81.         xor bl, bl
  82.    
  83.     isl_return:
  84.         ret
  85.     is_small_lat endp
  86.    
  87.     ; первое правило
  88.     rule1 proc ; offset orig_str, offset new_str
  89.         push bp
  90.         mov bp, sp
  91.         push es
  92.         push si
  93.         push di
  94.         push ax
  95.         push bx
  96.        
  97.         push ds
  98.         pop es
  99.        
  100.         mov si, [bp + 6]
  101.         mov di, [bp + 4]
  102.        
  103.     r1_loop:
  104.         lodsb
  105.         cmp al, '$'
  106.         je r1_return
  107.        
  108.         call is_small_lat
  109.         test bl, 0FFh
  110.         jz r1_next
  111.         add al, 'A' - 'a'
  112.     r1_next:
  113.         stosb
  114.         jmp r1_loop
  115.        
  116.     r1_return:
  117.         mov [di], '$'
  118.    
  119.         pop bx
  120.         pop ax
  121.         pop di
  122.         pop si
  123.         pop es
  124.         pop bp
  125.        
  126.         ret 4
  127.     rule1 endp
  128.    
  129.     ; второе правило
  130.     rule2 proc ; offset orig_str, offset new_str
  131.         push bp
  132.         mov bp, sp
  133.         push es
  134.         push si
  135.         push di
  136.         push ax
  137.        
  138.         push ds
  139.         pop es
  140.        
  141.         mov si, [bp + 6]
  142.         mov di, [bp + 4]
  143.        
  144.         ; сохранение первого символа в ah
  145.         lodsb
  146.         stosb
  147.         mov ah, al
  148.        
  149.     r2_loop:
  150.         lodsb
  151.         cmp al, '$'
  152.         je r2_return
  153.        
  154.         cmp al, ah
  155.         je r2_next
  156.         stosb
  157.     r2_next:
  158.         jmp r2_loop
  159.        
  160.     r2_return:
  161.         mov [di], '$'
  162.    
  163.         pop ax
  164.         pop di
  165.         pop si
  166.         pop es
  167.         pop bp
  168.        
  169.         ret 4
  170.        
  171.     rule2 endp
  172.  
  173. start:
  174.     mov ax, data
  175.     mov ds, ax
  176.  
  177.     ; чтение строки в orig_str, запись длины строки в len
  178.     lea dx, orig_str
  179.     push dx
  180.     lea ax, len
  181.     push ax
  182.     call read_str
  183.    
  184.     ; вывод исходной строки
  185.     outstr
  186.     newline
  187.    
  188.     ; подготовка к вызову rule1 или rule2
  189.     push dx
  190.     lea dx, new_str
  191.     push dx
  192.    
  193.     irpc sym, <Used rule >
  194.         outch '&sym'
  195.     endm
  196.    
  197.     ; сравнение первого и последнего символов
  198.     mov al, orig_str
  199.     mov si, len
  200.     mov ah, orig_str[si - 1]
  201.     cmp al, ah
  202.     je use_rule2
  203.    
  204.     ; проверка, являются ли первый и последний символы цифрами
  205.     first_check = 1
  206.     rept 2
  207.         call is_digit
  208.         test bl, 0FFh
  209.         jz use_rule2
  210.        
  211.         if first_check eq 1
  212.             mov ah, al
  213.             first_check = 0
  214.         endif
  215.     endm
  216.    
  217.     outch '1'
  218.     call rule1
  219.     jmp output
  220. use_rule2:
  221.     outch '2'
  222.     call rule2
  223.    
  224. output:
  225.     ; вывод преобразованной строки
  226.     newline
  227.     outstr
  228.     newline
  229.    
  230.     finish
  231. code ends
  232.  
  233.     end start
Add Comment
Please, Sign In to add comment