Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Задание 3, вариант 2-4-4.
- ; Матвей Андриенко, 112
- include io.asm
- stack segment stack
- dw 128 dup (?)
- stack ends
- data segment
- max_len equ 101
- orig_str db max_len dup(?)
- new_str db max_len dup(?)
- len dw 0
- data ends
- code segment 'code'
- assume ss:stack, ds:data, cs:code
- ; чтение строки
- read_str proc ; offset str, offset length
- push bp
- mov bp, sp
- push si
- push ax
- push bx
- mov si, [bp + 6] ; si := offset str
- xor bx, bx ; bx - длина строки
- rs_loop:
- inch al
- cmp al, '.'
- je rs_eos
- mov [si], al
- inc si
- inc bx
- jmp rs_loop
- rs_eos:
- mov [si], '$'
- mov si, [bp + 4]
- mov [si], bx
- flush
- pop bx
- pop ax
- pop si
- pop bp
- ret 4
- read_str endp
- ; проверяет, является ли символ в al цифрой.
- ; если да, то bl := true, иначе bl := false
- is_digit proc
- cmp al, '0'
- jb id_false
- cmp al, '9'
- ja id_false
- mov bl, 0FFh
- jmp id_return
- id_false:
- xor bl, bl
- id_return:
- ret
- is_digit endp
- ; проверяет, является ли символ в al строчной латинской буквой.
- ; если да, то bl := true, иначе bl := false
- is_small_lat proc
- cmp al, 'a'
- jb isl_false
- cmp al, 'z'
- ja isl_false
- mov bl, 0FFh
- jmp isl_return
- isl_false:
- xor bl, bl
- isl_return:
- ret
- is_small_lat endp
- ; первое правило
- rule1 proc ; offset orig_str, offset new_str
- push bp
- mov bp, sp
- push es
- push si
- push di
- push ax
- push bx
- push ds
- pop es
- mov si, [bp + 6]
- mov di, [bp + 4]
- r1_loop:
- lodsb
- cmp al, '$'
- je r1_return
- call is_small_lat
- test bl, 0FFh
- jz r1_next
- add al, 'A' - 'a'
- r1_next:
- stosb
- jmp r1_loop
- r1_return:
- mov [di], '$'
- pop bx
- pop ax
- pop di
- pop si
- pop es
- pop bp
- ret 4
- rule1 endp
- ; второе правило
- rule2 proc ; offset orig_str, offset new_str
- push bp
- mov bp, sp
- push es
- push si
- push di
- push ax
- push ds
- pop es
- mov si, [bp + 6]
- mov di, [bp + 4]
- ; сохранение первого символа в ah
- lodsb
- stosb
- mov ah, al
- r2_loop:
- lodsb
- cmp al, '$'
- je r2_return
- cmp al, ah
- je r2_next
- stosb
- r2_next:
- jmp r2_loop
- r2_return:
- mov [di], '$'
- pop ax
- pop di
- pop si
- pop es
- pop bp
- ret 4
- rule2 endp
- start:
- mov ax, data
- mov ds, ax
- ; чтение строки в orig_str, запись длины строки в len
- lea dx, orig_str
- push dx
- lea ax, len
- push ax
- call read_str
- ; вывод исходной строки
- outstr
- newline
- ; подготовка к вызову rule1 или rule2
- push dx
- lea dx, new_str
- push dx
- irpc sym, <Used rule >
- outch '&sym'
- endm
- ; сравнение первого и последнего символов
- mov al, orig_str
- mov si, len
- mov ah, orig_str[si - 1]
- cmp al, ah
- je use_rule2
- ; проверка, являются ли первый и последний символы цифрами
- first_check = 1
- rept 2
- call is_digit
- test bl, 0FFh
- jz use_rule2
- if first_check eq 1
- mov ah, al
- first_check = 0
- endif
- endm
- outch '1'
- call rule1
- jmp output
- use_rule2:
- outch '2'
- call rule2
- output:
- ; вывод преобразованной строки
- newline
- outstr
- newline
- finish
- code ends
- end start
Add Comment
Please, Sign In to add comment