
sceloglauxalbifacies
   
Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006
Репутация: 7 Всего: 158
|
с файлом все в порядке. а ошибок - куча: буфер парсим почему-то с 1-го символа, а не с 0-го di не сбрасывается по окончании преобразования числа ну и т.д. - лень все перечислять... проще исправить(места исправлений помечены *): Код | ideal model small stack 256 dataseg number dw (0) ;Номер файла adress db 10,13,"Vedite polnoe address of the file: $" kodirovka db 10,13,"VVedite simbol kodirovki: $" counter db (0) ;счетчик, сколько символов в адресе файла counter2 db (0) pathmaxlen db 100 ;* pathlen db 0 ;* path db 100 dup (0) ;Путь к файлу dlina dw (0) ;длина файла text db 10000 dup (0) chislo dw 0 ;сравниваемое число posl dw 0 ;последнее число minim dw -1 ;*минимальное число sr_arifm dw 0 ;среднее арифметическое vrem dw 0 ;временная переменная vrem2 db 0 ;временная переменная
result db 0dh, 0ah ;* desyat db 4 dup (0) ;*число в десятичном виде db '$' ;* codeseg start: mov ax, @data mov ds, ax call vivod ;вызов приглашения call enter_adress ;ввод адреса файла с клавиатуры call open ;открытие файла call count ;проверка размера файла call podnyatie ;поднятие курсора наверх call read ;чтение файла call berem_chislo ;берём чило для сравнения с минимальным call sred_ar ;нохождение среднего арифметического lea dx,[result] ;* mov ah,9 int 21h exit: mov ah, 4ch int 21h ;процедура выводит на экран строку приглашения ввода адреса ;входные данные:[adress] ;выходные данные:строка пирглашения на экране proc vivod lea dx, [adress] mov ah, 9 ;функция вывода на экран int 21h ret endp ;процедура ввода адреса с клавиатуры ;входные данные:адресс с клавиатуры ;выходные данные: path - в ней лежит адрес файла proc enter_adress ;jump2: ; mov ah, 1 ; int 21h ; cmp al, 13 ; je jump ; mov [path + bx], al ; cmp al, 13h ; jne jump2 ;jump: mov ah,0ah ;* lea dx,[pathmaxlen] ;* int 21h ;* xor bx, bx ;* mov bl,[pathlen] ;* or bl,bl ;* je exit ;* mov [path+bx],bh ;* ret endp ;процедура открытия файла ;входные данные: path ;выходные данные:number - номер файла proc open mov ah, 3dh mov al, 2 lea dx, [path] int 21h jc exit ;* mov [number], ax ret endp ;Процедура нахождения длины ;входные данные:number ;выходные данные:dlina - длина файла proc count mov ah, 42h mov al, 2 mov bx, [number] mov cx, 0 mov dx, 0 int 21h mov [dlina],ax ret endp ;---процедура поднимает курсор вверх страници ;процедура позиционирует файловый указатель в начало файла! ;* ;входные данные:number proc podnyatie mov ah, 42h mov al, 0 mov bx, [number] mov cx, 0 mov dx, 0 int 21h ret endp ;процедура чтения файла ;входные данные:number,dlina ;выходные данные:text - весь файл в этой переменной proc read mov ah, 3Fh mov bx, [number] mov cx, [dlina] lea dx, [text] int 21h ret endp ;процедура взятия чисел для сравнивания с минимальным ;входные данные:text ;выходные данные:chislo - сравниваемое число proc berem_chislo xor bx,bx dec bx ;* inpt: inc bx cmp bx,[dlina] ;* jae done ;* mov al,[text+bx] cmp al," " ;проверка ввода пробела je done cmp al,"9" ;проверка на цифровой символ ja inpt ;нет, следующий символ cmp al,"0" ;проверка на цифровой символ jb inpt ;нет, следующий символ ;выбран цифровой символ sub al,30h ;преобразование символа в двоичный вид xor ah,ah mov cx,ax ;сохранение полученной цифры в CX mov ax,di ;результат преобразования прошлых цифр mov [vrem],bx mov bx,10 mul bx ;в AX предыдущий результат умноженные на 10 mov bx,[vrem] add ax,cx ;добавляем к старому числу новую цифру mov DI,ax ;сохраняет число в DI jmp inpt done: mov [chislo],di ;сохранение числа в переменной chislo xor di,di ;* ;* cmp [minim]," " ;* jne dalshe ;* mov [minim],di ;*dalshe: call sravnenie ;вызов сравнения cmp bx,[dlina] ;* je posl_chisl ;* jne inpt ;*posl_chisl: jb inpt ;* mov ax, [chislo] ;* mov [posl], ax ;* ret endp ;процедура сравнения ;входные данные:chislo, minim ;выходные данные:то же или другое minim proc sravnenie mov cx,[chislo] cmp cx,[minim] ;*сравниваем минмальное с текущим числом ;* jl mensh ;* jg bolshe ja bolshe ;* ;*mensh: mov [minim],cx ;заменяем minim на меньшее число из CX bolshe: ret endp ;процедура нахождения среднего арифметического ;входные данные:minim,posl ;выходные данные:sr_arifm - среднее арифметическое proc sred_ar xor ax,ax ;обнуляем ax xor bx,bx ;обнуляем bx mov ax,[minim] add ax,[posl] mov bx,2 div bx ;делим на 2 сумму чисел из AX mov [sr_arifm],ax ;в переменную среднее арифметической call wrd_asc ;вызов перевода в символьный вид ret endp ;процедура преобразования двоичного числа в символьный вид ;входные данные:AX - среднее арифметическое в двоичном виде ;выходные данные:sr_arifm - среднее арифметическое в символьном виде proc wrd_asc mov ax,[chislo] mov ax,[sr_arifm] mov bx,0F000h ;маска битов mov dl,12 ;число сдвигов AX mov cx,4 cccc: push cx ;сохранение счётчика push ax ;сохранение исходного числа в стеке and ax,bx ;выделение чевёрки битов mov cl,dl ;число сдвигов в CL shr ax,cl ;сдвигает на CL вправо add al,30h ;преобразуем в символ цифру mov [desyat+si],al ;отпрвим в строку результата inc si ;сдвигаемся по строке вправо pop ax mov [vrem2],cl mov cl,4 shr bx,cl ;модифицируем маску битов mov cl,[vrem2] sub dl,4 ;модифицируем число сдвигов pop cx ;восстановили счётчик loop cccc mov [sr_arifm],ax ;помещаем в переменную символьное среднее арифметическое ret endp end start
|
ничего не оптимизировал, естественно...
|