Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
.model    small
.stack    100h
DIGITS_AFTER_POINT = 5
.data
    buf    db    5 dup (0)
    result    db    20 dup (0)
    digits    db    '.',DIGITS_AFTER_POINT dup (0)
.code
Decimals    proc    near
;перевод остатка от деления в дробную часть
;на входе:
;    ax - остаток
;    bx - делитель
;
    push    di
    push    si
;обнуление выходного массива символов
    lea    di,digits
    inc    di
    push    ax
    mov    al,'0'
    mov    cx,DIGITS_AFTER_POINT
    rep    stosb
    pop    ax
;вычисление дробной части
    lea    di,digits
    inc    di
    mov    si,10
    mov    cx,DIGITS_AFTER_POINT
@@1_1:
    mul    si
    div    bx
    add    al,'0'
    stosb
    mov    ax,dx
    or    ax,ax
    loopnz    @@1_1
    pop    si
    pop    di
    ret    
Decimals    endp
;
Divide    proc    near
;знаковое деление с занесением результата в строку
;на входе:
;    ax - делимое
;    bx - делитель
;
    push    di
    push    si
    lea    di,result
    cld
    cwd
    idiv    bx
    test    ax,8000h
    jz    @@2_1
;Результат отрицательный - записываем '-' в строку и переводим его в положительный
    push    ax
    mov    al,'-'
    stosb
    pop    ax
    neg    ax
    neg    dx
@@2_1:
    push    dx
    push    bx
;
    push    di
;Перевод целой части результата в строку
    lea    di,buf
    xor    cx,cx
    mov    bx,10
@@2_2:
    xor    dx,dx
    div    bx
    push    ax
    mov    ax,dx
    add    al,'0'
    stosb
    inc    cx
    pop    ax
    or    ax,ax
    jnz    @@2_2
    mov    si,di
    dec    si
    pop    di
@@2_3:
    mov    al,[si]
    dec    si
    stosb
    loop    @@2_3
;
    pop    bx
    pop    ax
;получение дробной части результата
    call    Decimals
;дописывание дробной части в результирующую строку
    lea    si,digits
    mov    cx,DIGITS_AFTER_POINT+1
    rep    movsb
    mov    al,0Dh
    stosb
    mov    al,0Ah
    stosb
    mov    al,'$'
    stosb
;
    pop    si
    pop    di
    retn
Divide    endp
START:
    mov    ax,@data
    mov    ds,ax
    mov    es,ax
    mov    ax,-12345    ;делимое
    mov    bx,33    ;делитель
    call    Divide
    lea    dx,result
    mov    ah,9
    int    21h
    mov    ax,4C00h
    int    21h
end    START


Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 17:56 03-06-2007
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru