Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

некорректное деление

8.0K
22 июня 2007 года
dox
28 / / 07.06.2006
Приветствую. Возникла проблема в следующем. Ниже приведен листинг, в нем если разбить код на блоки, то в 1 блоке выводится массив чисел, 2 блок сортировка массива и далее снова на 1 блок, и вот в нем некорректное деление(причем чисел больших девяти)...... Проверял в отладчике раз 5. Не знаю что делать. Попробуйте у себя кто нибудь этот код. И посоветуйте что делать.
Спасибо.
Код:
; output message
message macro mes
    mov ah,9
    lea dx,mes
    int 21h
endm

;output numbers
output macro num
        mov ah,2
        mov dl,num
    add dl,'0'
    int 21h
endm

dseg segment

    table db 9,-22,-5,48,8,12,3,23,7,1
   
    ten db 00001010b
    count db 0

    msg db 'Isxodnii massiv',10,13,'$'

    msg2 db 10,13,'Massiv - resultat',10,13,'$'
   
dseg ends

;---------------------

cseg segment
assume cs:cseg, ds:dseg
start: mov ax,dseg
    mov ds,ax            ; init segment data

    message msg

double:
    inc count
    mov cx,10
    mov bx,0
    mov si,0
;-----------------------
;-----------------------
m:
        mov al,table[si]
    cmp al,0
    je nol
    jl mensch

    mov dl,'0'
    mov ah,0
    push dx
;---------------   
c1: div ten           ;pri vtorom proxode delit nekorrektno
;--------------
    mov dl,ah
    mov dh,0
    push dx
    cmp al,0
    je vix
    mov ah,0
    jmp c1
   
vix:

m1:     pop dx
    cmp dl,'0'
    je vix1
    mov dh,0
    add dl,'0'
    mov ah,2
    int 21h
    jmp m1
vix1:
   
    jmp z

mensch:
    mov bl,al
    mov ah,2
    mov dl,'-'
    int 21h
    neg bl   ;modul' chisla
   
    mov dl,'0'
    mov dh,0
    push dx
   
    mov al,bl
    mov ah,0
m3: div ten
    mov dl,ah
    mov dh,0
    push dx

    cmp al,0
    je vix3
    mov ah,0   
    jmp m3

vix3:

m4: pop dx
    cmp dl,'0'
    je vix4
    add dl,'0'
    mov ah,2
    int 21h
    jmp m4

vix4:
    jmp z

nol:    mov ah,2
    mov dl,'0'
    int 21h

z:  mov ah,2       ;probel
    mov dl,' '
    int 21h
;-------------------
;------------------
    inc si
    loop m

    cmp count,2
    je exi

;----------------------
    mov si,0
    mov di,1
    jmp input
now:
        inc si
        mov di,si
    inc di
now1:  
input:  mov ah,table[si]
    cmp ah,table[di]
    jl next
   
    mov al,table[si]
    mov ah,table[di]      ;zamena
    xchg al,ah
    mov table[si],al
    mov table[di],ah
next:  
        inc di
    cmp di,10
    jb now1


    cmp si,9
    jae exit
    jmp now
exit:
;------------------
    message msg2

jmp double
   

exi:
    mov ah,1
    int 21h

    mov ah,4ch
    int 21h

cseg ends
    end start
1.6K
22 июня 2007 года
Vov4ick
476 / / 01.02.2007
Советую использовать тег CODE при вакладывании сырцов на форум.
Напрашивается предположение о выходе за край массива, поскольку переменная, на которую делим, находися в памяти сразу за ним.
Автору совет - получше оформлять исходники, структурировать программу - поди на следующий день не разберёшься, что написал. Смысловых меток надо побольше и комментариев, хотя бы к кускам кода.
Хранить строчку в стеке и выводить посимвольно - не лучший вариант, лучше обрабатывать всё сразу и выводить 9-й функцией. Если надо, запощу готовую стандартную процедуру int2str
Одинаковые куски кода хорошо бы вынести в процедуры, вообще поработать над структурой программы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог