Как получить остаток от деленя

Тема в разделе "WASM.BEGINNERS", создана пользователем Quard, 7 сен 2005.

  1. Quard

    Quard New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2005
    Сообщения:
    6
    Адрес:
    Ukraine
    У меня проблема с получением остатка от деления в программе(задали напиать в универе не читая ниодной лекции).



    Задание: написать на Borland C 3.0 (мат часть на асме) программу которая запрафывает числа a,b,c а потом по формуле a+( (b+c)/2 )



    Листинг:

    #include <stdio.h>



    void main() {

    int a,b,c;

    scanf("%d %d %d", &a, &b, &c);

    asm {

    mov ax, b //ax=2

    add ax, c //ax=5

    mov bx, 0x2

    div bx //ax=2 dx=1

    add ax, a //ax=3

    }

    }



    Подскажыте пожалуйста как мне получить остаток от деления, зарание благодарем



    PS: google и поиск на форуме неособо помог
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    dx=1 // вот ведь у тебя остаток в dx
     
  3. Quard

    Quard New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2005
    Сообщения:
    6
    Адрес:
    Ukraine
    5/2=2.5
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Quard



    Ну и где тут остаток, а?





    Скажите спасибо, что хоть листинг дали :) Хотя, что это за задание такое, к которому прилагается решение...





    5/2 = 2 в целочисленном делении.
     
  5. Quard

    Quard New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2005
    Сообщения:
    6
    Адрес:
    Ukraine
    Тоесть остаток не получить?

    PS: Нам листинг не давали это я сам написал.
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Почему не получить? Он у тебя есть, лежит в dx.

    5/2 получается результат: частное=2 и остаток=1


    Код (Text):
    1. __asm {
    2.     mov    ax,b
    3.     add    ax,c
    4.     xor    dx,dx         // перед делением dx надо обнулять
    5.     mov    bx,0x2
    6.     div    bx            // ax-частное, dx-остаток
    7.     ....                 // делай со своим остатком что хочешь
    8.     ....
    9.     }




    А вообще, ты бы спокойно подумал бы и сформулировал бы, что тебе надо: рассчитать по формуле или получить остаток от деления.
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine


    bogrus уже показал где хранится остаток от деления. Документацию по опкодам иногда желательно смотреть.



    Чтобы получить вещественное число (2.5, например) нужно использовать FPU.
     
  8. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Тут можно чуть проще
    Код (Text):
    1.            ; a+((b+c)/2)
    2.  
    3. mov  ax,b  ; ax=2
    4. add  ax,c  ; ax=5
    5. shr  ax,1  ; ax=2 CF=остаток (0 или 1)
    6.  
    7. ; if CF=1 then остаток = 0.5 else остаток = 0
    8. ; сохранить остаток для вывода
    9.  
    10. add  ax,a  ; ax=2+a
    11.  
    12. ; преобразовать ax в необходимую систему счисления и вывести с остатком
     
  9. Quard

    Quard New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2005
    Сообщения:
    6
    Адрес:
    Ukraine
    FPU использовать нельзя так как мы до этого не "доросли" :)

    Вообще нужно расчитать по формуле(но проблема только в получании остатка), может я делаю что-то не так?
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    bogrus

    Остаток разве может быть дробным числом? На то он и остаток, чтобы быть целым.
     
  11. Quard

    Quard New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2005
    Сообщения:
    6
    Адрес:
    Ukraine
    Большое спасибо за помощь
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Quard



    Если нужно получить результат в виде XX,YYYY, то либо fpu, либо вручную разгребать вещественное число в соответствии со стандартом IEEE (Institute of Electrical and Electronics Engineers). Но думаю, что это ещё менее вероятно, что вы проходили.

    Или ограничиться традиционной целочисленной арифметикой, плюнув на дробную часть.
     
  13. Quard

    Quard New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2005
    Сообщения:
    6
    Адрес:
    Ukraine
    Уже плюнул на дробную часть :)
     
  14. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    У него ведь конкретная формула, в которой остаток может принимать два значения, либо есть\либо нету, я так понял надо просто вывести "2.5", под винду можно было бы сделать так
    Код (Text):
    1. ;=====================================================================
    2. a           =      0x1111
    3. b           =      0x2222
    4. c           =      0x3333
    5. ;=====================================================================
    6. result      db     '00000.0',0
    7. ;=====================================================================
    8.             mov     edi,result+4
    9.             mov     eax,b
    10.             add     eax,c
    11.             shr     eax,1
    12.             jnc     @f
    13.             mov     byte[result+6],'5'
    14. @@:         add     eax,a
    15. @@:         mov     edx,eax
    16.             lea     ebx,[eax*2+eax+3]
    17.             lea     ecx,[eax*2+eax+3]
    18.             shl     ebx,4
    19.             mov     eax,ecx
    20.             shl     ecx,8
    21.             add     eax,ebx
    22.             shl     ebx,8
    23.             add     eax,ecx
    24.             add     eax,ebx
    25.             shr     eax,17
    26.             lea     ecx,[eax*8+eax]
    27.             add     ecx,eax
    28.             sub     edx,ecx
    29.             add     edx,'0'
    30.             mov     byte[edi],dl
    31.             dec     edi
    32.             cmp     edi,result
    33.             jnc     @b
    34. ;=====================================================================
    35.             invoke  MessageBox,0,result,result,0
    36. ;=====================================================================
     
  15. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    Quard

    Или я чего-то не понял (тогда извини), но в общем случае остаток от деления легко находится с использованием целочисленного(!) деления и умножения по формуле:

    a mod b = a - (a/b)*b
     
  16. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    div r8/m8: исх: ax, ост: ah, рез: al

    div r16/m16: исх: dx.ax, ост: dx, рез: ax



    помоему так ((с)Винни-Пух)
     
  17. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Надеюсь, числа положительные и задачка не из теории чисел, а из школьной алгебры ;)

    Иначе проблемы со знаком. Помнится мы с volodya на эту тему копья ломали, т.к. в теории чисел остаток всегда положителен и (-5)/3 = -2 частное и +1 в остатке, а не -1 и -2 в остатке ;))
     
  18. wan1788

    wan1788 New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    36
    народ вы че? как такое может быть ("a mod b = a - (a/b)*b")? (a/b)*b = a по моему.остаток считается по формуле - a - (a/b). помоему.
     
  19. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    wan1788 23 это остаток от 25/10? :)
    Код (Text):
    1. 25 - (25/10) = 23    ; a - (a/b)
    2. 25 - (25/10)*10 = 5  ; a - (a/b)*b
    Тот код без div\mul как раз по формуле a - (a/b)*b переводит из hex --> dec
     
  20. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    wan1788



    Специально подчеркивал, что используется _целочисленное_ деление, т.е. дробная часть отбрасывается. Поэтому, int(a/b)*b в общем случае не равно 'a'. Разве что формулу нужно было написать более аккуратно:

    a mod b = a - int(a/b)*b