Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model small
- .486
- .data
- buff db 20 dup(?) ;буфер для строки из файл
- filename db "a.txt",0 ;имя файла
- handler dw ? ;описатель файла
- R dw ? ;длина строки в документе
- firnum dw ? ;первый член прогрессии
- factor dw ? ;множитель прогрессии
- len1 dw ? ;длина строки первого члена ГП
- len2 dw ? ;длина строки множителя ГП
- lcx1 dw ? ;запоминать cx
- lcx2 dw ? ;запоминать cx
- next dw ? ;каждый следующий член ГП
- N EQU 4 ;число членов ГП записывать в файл
- first db 5 dup(?) ;первый член прогрессии в строке
- second db 5 dup(?) ;множитель прогрессии в строке
- nexts db 10 DUP(?) ;следующий член прогрессии в строке
- gap db ' ','$' ; прибел
- OPEN macro
- mov ah, 3dh
- mov al, 2
- mov dx, offset filename
- int 21h
- mov handler, ax
- endm
- READ macro
- mov ah, 3fh
- mov bx, handler
- lea dx, buff
- mov cx, 10
- int 21h
- endm
- WRITE macro ;в cx число символов, в dx адрес буфер
- mov ah, 40h
- mov bx, handler
- 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
- READ
- mov R, ax ;после чтоения файла в ax число прочитанных символов
- ;============================ помещаем первый член в first, множитель в second======================
- mov cx,R ;длина буфера
- mov di,offset buff
- cld
- mov al,' '
- repne scasb ;сравнивать пока не встретится пробел в буфере
- mov cx,di ;позиция буфера после пробела (начало следующего числа)
- lea dx, buff
- sub cx, dx
- dec cx ;длина первого числа
- mov len1, cx
- mov si,offset buff
- mov di,offset first
- cld
- rep movsb ;копировать из buff в first cx символов
- mov cx,R
- sub cx,len1 ;длина второго числа
- mov len2, cx
- xor si,si
- mov bx,len1
- inc bx
- lea si,[buff+bx]
- mov di,offset second
- cld
- rep movsb ;копировать из buff в second cx символов
- ;======================= преобразование 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
- ; ===================== запись в файл первого числа===========================================
- lea dx,gap ;вывести пробел
- mov cx, 1
- WRITE
- mov cx, len1
- lea dx, first
- WRITE
- lea dx,gap ;вывести пробел
- mov cx, 1
- WRITE
- ; ===================== запись в файл 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 cx, di ;количество символов в числе
- m4:
- pop dx ; dx = очередной символ
- mov lcx2,cx ; в сх количество символов числа
- mov cx, 1 ; вывести один символ
- WRITE
- dec di ; повторяем пока di<>0
- mov
- cx,lcx2 ; в сх количество символов числа
- loop m4
- lea dx,gap ;вывести пробел
- mov cx, 1
- WRITE
- mov cx, lcx1 ;в сх количество циклов записи членов ГП
- loop cyc
- CLOSE
- mov ax,4c00h
- int 21h
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement