У меня проблема с получением остатка от деления в программе(задали напиать в универе не читая ниодной лекции). Задание: написать на 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 и поиск на форуме неособо помог
Quard Ну и где тут остаток, а? Скажите спасибо, что хоть листинг дали Хотя, что это за задание такое, к которому прилагается решение... 5/2 = 2 в целочисленном делении.
Почему не получить? Он у тебя есть, лежит в dx. 5/2 получается результат: частное=2 и остаток=1 Код (Text): __asm { mov ax,b add ax,c xor dx,dx // перед делением dx надо обнулять mov bx,0x2 div bx // ax-частное, dx-остаток .... // делай со своим остатком что хочешь .... } А вообще, ты бы спокойно подумал бы и сформулировал бы, что тебе надо: рассчитать по формуле или получить остаток от деления.
bogrus уже показал где хранится остаток от деления. Документацию по опкодам иногда желательно смотреть. Чтобы получить вещественное число (2.5, например) нужно использовать FPU.
Тут можно чуть проще Код (Text): ; a+((b+c)/2) mov ax,b ; ax=2 add ax,c ; ax=5 shr ax,1 ; ax=2 CF=остаток (0 или 1) ; if CF=1 then остаток = 0.5 else остаток = 0 ; сохранить остаток для вывода add ax,a ; ax=2+a ; преобразовать ax в необходимую систему счисления и вывести с остатком
FPU использовать нельзя так как мы до этого не "доросли" Вообще нужно расчитать по формуле(но проблема только в получании остатка), может я делаю что-то не так?
Quard Если нужно получить результат в виде XX,YYYY, то либо fpu, либо вручную разгребать вещественное число в соответствии со стандартом IEEE (Institute of Electrical and Electronics Engineers). Но думаю, что это ещё менее вероятно, что вы проходили. Или ограничиться традиционной целочисленной арифметикой, плюнув на дробную часть.
У него ведь конкретная формула, в которой остаток может принимать два значения, либо есть\либо нету, я так понял надо просто вывести "2.5", под винду можно было бы сделать так Код (Text): ;===================================================================== a = 0x1111 b = 0x2222 c = 0x3333 ;===================================================================== result db '00000.0',0 ;===================================================================== mov edi,result+4 mov eax,b add eax,c shr eax,1 jnc @f mov byte[result+6],'5' @@: add eax,a @@: mov edx,eax lea ebx,[eax*2+eax+3] lea ecx,[eax*2+eax+3] shl ebx,4 mov eax,ecx shl ecx,8 add eax,ebx shl ebx,8 add eax,ecx add eax,ebx shr eax,17 lea ecx,[eax*8+eax] add ecx,eax sub edx,ecx add edx,'0' mov byte[edi],dl dec edi cmp edi,result jnc @b ;===================================================================== invoke MessageBox,0,result,result,0 ;=====================================================================
Quard Или я чего-то не понял (тогда извини), но в общем случае остаток от деления легко находится с использованием целочисленного(!) деления и умножения по формуле: a mod b = a - (a/b)*b
div r8/m8: исх: ax, ост: ah, рез: al div r16/m16: исх: dx.ax, ост: dx, рез: ax помоему так ((с)Винни-Пух)
Надеюсь, числа положительные и задачка не из теории чисел, а из школьной алгебры Иначе проблемы со знаком. Помнится мы с volodya на эту тему копья ломали, т.к. в теории чисел остаток всегда положителен и (-5)/3 = -2 частное и +1 в остатке, а не -1 и -2 в остатке )
народ вы че? как такое может быть ("a mod b = a - (a/b)*b")? (a/b)*b = a по моему.остаток считается по формуле - a - (a/b). помоему.
wan1788 23 это остаток от 25/10? Код (Text): 25 - (25/10) = 23 ; a - (a/b) 25 - (25/10)*10 = 5 ; a - (a/b)*b Тот код без div\mul как раз по формуле a - (a/b)*b переводит из hex --> dec
wan1788 Специально подчеркивал, что используется _целочисленное_ деление, т.е. дробная часть отбрасывается. Поэтому, int(a/b)*b в общем случае не равно 'a'. Разве что формулу нужно было написать более аккуратно: a mod b = a - int(a/b)*b