Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нахождение среднего арифметического, помогите, найти ошибки 
:(
    Опции темы
Vitek2000
Дата 8.12.2007, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2007

Репутация: нет
Всего: нет



У меня прога такая, нахождение минимального и последнего числа взятого из txt файла. написал, но вообще не работает, как я понял что-то у меня не то с открытием файла. вот код, помогите найти ошибки, пожалуйста:

Код

ideal
model small
stack 256
dataseg
    number dw (0)         ;Номер файла
    adress db 10,13,"Vedite polniy address of the file: $"
    kodirovka db 10,13,"VVedite simbol kodirovki: $"
    counter db (0)        ;счетчик, сколько символов в адресе файла
    counter2 db (0)
    path db 100 dup (0)  ;Путь к файлу
    dlina dw (0)          ;длина файла
    text db 10000 dup (0)
    chislo dw 0            ;сравниваемое число
    posl dw 0              ;последнее число
    minim dw " "           ;минимальное число
    sr_arifm dw 0          ;среднее арифметическое
    vrem dw 0              ;временная переменная
    vrem2 db 0             ;временная переменная
    desyat db 0            ;число в десятичном виде
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,[text]
    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:
    ret
endp
    



;процедура открытия файла
;входные данные: path
;выходные данные:number - номер файла   
proc open
    mov ah, 3dh
    mov al, 2
    lea dx, [path]
    int 21h
    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
inpt:
    inc bx
    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
    cmp [minim]," "
    jne dalshe
    mov [minim],di
dalshe:
    call sravnenie           ;вызов сравнения
    cmp bx,[dlina]
    je posl_chisl
    jne inpt
posl_chisl:
    mov [posl],di
ret
endp     

;процедура сравнения
;входные данные:chislo, minim
;выходные данные:то же или другое minim
proc sravnenie
    mov cx,[chislo]
    cmp [minim],cx           ;сравниваем минмальное с текущим числом
    jl mensh
    jg 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



PM MAIL   Вверх
Vitek2000
Дата 10.12.2007, 01:48 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2007

Репутация: нет
Всего: нет



и молчат....
PM MAIL   Вверх
dumb
Дата 10.12.2007, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


ничего не оптимизировал, естественно...

PM MAIL   Вверх
Vitek2000
Дата 10.12.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2007

Репутация: нет
Всего: нет



Спасибо огромное!!

Это сообщение отредактировал(а) Vitek2000 - 10.12.2007, 18:24
PM MAIL   Вверх
Vitek2000
Дата 10.12.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2007

Репутация: нет
Всего: нет



Что-то он считает, но не то....
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.1232 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.