Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model small
- .486
- .data
- buff db 20 dup(?) ;буфер для строки из файл
- buffs db 80 dup('$') ;буфер для строки в файл
- filename db "a.txt",0 ;имя файла
- handler dw ? ;описатель файла
- R dw ? ;длина строки в документе
- firnum dw ? ;первый член прогрессии
- factor dw ? ;множитель прогрессии
- len1 dw ? ;длина строки первого члена ГП
- len2 dw ? ;длина строки множителя ГП
- len3 dw ? ;длина числа множителя ГП
- lcx1 dw ? ;запоминать cx
- lcx2 dw ? ;запоминать cx
- next dw ? ;каждый следующий член ГП
- N EQU 8 ;число членов ГП записывать в файл
- first db 5 dup(?) ;первый член прогрессии в строке
- second db 5 dup(?) ;множитель прогрессии в строке
- nexts db 10 DUP(?) ;следующий член прогрессии в строке
- gap db ' ','$' ; пробел
- mes db "Первые N членов геометрической прогрессии: ", 0ah, 0dh, '$'
- OPEN macro filename, handler
- mov ah,3Dh
- mov al,2
- mov dx, offset filename
- mov cx,0
- int 21h
- mov handler,ax
- endm
- READ macro buff
- mov ah, 3fh
- mov bx, handler
- lea dx, buff
- mov cx, 10
- int 21h
- endm
- WRITE macro buff, a
- mov bx,handler
- lea dx, buff
- mov ah,40h
- mov cx,a
- int 21h
- endm
- SSTART macro
- mov ah, 42h
- mov al, 0
- mov bx, handler
- mov cx, 0
- mov dx, 0
- int 21h
- endm
- CLOSE macro
- mov ah, 3eh
- mov bx, handler
- int 21h
- endm
- .code
- assume ds: @data, es:@data
- start:
- mov ax,@data
- mov ds,ax
- mov es,ax
- OPEN filename, handler
- READ buff
- mov R, ax ;после чтоения файла в ax число прочитанных символов
- ;============================ помещаем первый член в first, множитель в second======================
- mov cx,R ;длина буфера
- mov di,offset buff
- cld
- mov al,' '
- repne scasb ;сравнивать пока не встретится пробел в буфере
- mov cx,di ;позиция буфера после пробела (начало следующего числа)
- mov bx, di
- lea dx, buff
- sub cx, dx
- dec cx ;длина первого числа
- mov len1, cx
- push di
- mov si,offset buff
- mov di,offset first
- cld
- rep movsb ;копировать из buff в second cx символов
- lea cx,R
- sub CX,BX
- pop di
- mov dx, di
- xor si,si
- cld
- mov AL,' '
- repne scasb
- mov CX,di
- sub CX,BX
- dec CX
- mov len2, cx
- mov si,dx
- mov di,offset second
- cld
- rep movsb
- ;======================= преобразование first и second из строк в числа=====================
- mov cx, len1
- lea di, first
- xor ax,ax ;обнуляется регистр
- xor ch,ch ;обнуляется регистр
- mov si,10 ;si содержит множитель 10
- xor bh,bh ;обнуляется регистр
- m1:
- mul si ;умножить ax на si(10)
- mov bl,[di] ;к произведению добавить число
- sub bl,30h ;отнять 30h
- add ax,bx ;добавить число к сумме ax
- inc di ;инкремент di
- loop m1 ;повтор цикла
- mov firnum, ax
- mov cx, len2
- lea di, second
- xor ax,ax ;обнуляется регистр
- xor ch,ch ;обнуляется регистр
- mov si,10 ;si содержит множитель 10
- xor bh,bh ;обнуляется регистр
- m2:
- mul si ;умножить ax на si(10)
- mov bl,[di] ;к произведению добавить число
- sub bl,30h ;отнять 30h
- add ax,bx ;добавить число к сумме ax
- inc di ;инкремент di
- loop m2 ;повтор цикла
- mov factor, ax
- ; ===================== запись в файл первого числа===========================================
- SSTART
- WRITE mes, 43
- WRITE first, len1
- WRITE gap, 1
- ; ===================== запись в файл N-1 оставшихся членов ==================================
- mov cx, N
- dec cx ;первый член записан, осталось записать N-1
- mov dx, firnum ;первый член ГП
- mov next, dx
- cyc:
- mov ax,next ;предыдущий член ГП
- mov lcx1,cx ;в сх количество циклов записи членов ГП
- imul factor ;умножили первый член ГП на множитель
- mov next, ax ; новый член ГП
- ;=============================посимвольный вывод===========================================
- mov cx, 10 ; cx - основание системы счисления
- xor di, di ; di - кол. цифр в числе
- m3:
- xor dx, dx
- div cx ; dx = next mod 10
- add dx, 30h ; перевод в символьный формат (в dx остаток от деления )
- push dx ; складываем в стэк
- inc di
- xor dx, dx
- cmp ax, 0
- jne m3
- ;================ выводим из стэка в файл через пробел==================================
- mov len3, di
- lea bx, buffs
- m4:
- pop dx ; dx = очередной символ
- mov [bx], dx
- inc bx
- dec di ; повторяем пока di<>0
- jnz m4
- WRITE buffs, len3
- WRITE gap, 1
- mov cx, lcx1 ;в сх количество циклов записи членов ГП
- loop cyc
- CLOSE
- mov ax,4c00h
- int 21h
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement