Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > вычислить (2*c - d/3)/(b - a/4);


Автор: b44 23.12.2006, 20:10
пожалуйста напишите прогу вычисляющая значение выражения (2*c - d/3)/(b - a/4) и сравнить результат с вычислением в паскале!
задачу надо сделать с помощью асемблеровской вставки в ТР! пожалуйста помогите!

Автор: MAKCim 24.12.2006, 10:45
Код

fld    c
fld    __2
fmulp
fld    d
fld    __3
fdivp
fsubp
fld    b
fld    a
fld    __4
fdivp
fsubp
fdivp
fstp   result

вместо __2, __3, __4 подставь загрузку констант из памяти

Автор: b44 24.12.2006, 11:58
пожалуйста исправте ошибки
Код

Uses crt;
var otv, a, b, c, d : word;
    two, fore , three: byte;
    z:real;
begin
 fore := 4;
 two := 2;
 three := 3;
 readln(a,b,c,d);
 z:=(2*c-d/3)/(b-a/4);
asm
mov ax, a
mov bx, b
mov cx, c
mov dx, d

div fore
sub bx, ax
mov ax , d
div three
neg ax
add ax, cx
div bx
mov otv, ax
end;
writeln(z:3:3);
writeln(otv);
readln;
end.

Автор: MAKCim 24.12.2006, 12:12
Код

Uses crt;
var otv, a, b, c, d : word;
    two, fore , three: byte;
    z:real;
begin
 fore := 4;
 two := 2;
 three := 3;
 readln(a,b,c,d);
 z:=(2*c-d/3)/(b-a/4);
asm
mov ax, a
mov bx, b
mov cx, c
mov dx, d
div fore               ; тут в итоге в AL - частное, в AH - остаток
xor ah, ah      ; надо бы ah обнулить
sub bx, ax
mov ax , d
div three
xor ah, ah  ; опять обнуление
neg ax
shl cx, 1 ; умножение c на 2
add ax, cx
div bx
mov otv, ax
end;
writeln(z:3:3);
writeln(otv);
readln;
end.

Автор: b44 24.12.2006, 18:16
кто нить может обьяснить почему ответы расходятся???
и как сделать чтобы ответы сходились?

Автор: anwe 24.12.2006, 21:12
Надо применять команду idiv - деление со знаком. Тогда знак определяется по остатку. Частное - положительное.

Автор: Sartorius 24.12.2006, 21:19
b44, что бы ответы у тебя сошлись, нада писать не z:=(2*c-d/3)/(b-a/4); а z:=(2*c-d div 3) div (b-a div 4); или работай в асме с FPU

Автор: 1BJ 24.12.2006, 23:18
ИЗВИНИТЕ,ЧТО Я ВАС ОТВЛЕКАЮ,НО У МЕНЯ СЕРЬЁЗНАЯ ПРОБЛЕМА С АССЕМОМ!
НАУЧИТЕ КОДИТЬ НА АССЕМЕ! smile 

Автор: Sartorius 24.12.2006, 23:29
1BJ, зачем пишешь в готовый топик?  Кодить научить нельзя, можно научиться.
 Для начала Абель(Assembler для IBM PC) потом Юров (Assembler учебник и справочник). Побольше практики  smile 

Автор: b44 24.12.2006, 23:44
Sartorius,  в паскале все правильно выщитывается!!
в асемблеровской вставке вроде стото не так, ответ большой получается!
если взять числа 9 6 3 1 в паскале около 1.5 получается - правильно,
а в асемблере около 16000 вроде!

Автор: 1BJ 24.12.2006, 23:49
Я СКАЧАЛ КАЛАШНИКОВА, ВВЕЛ ТЕКСТ, А ДАЛЬШЕ, ДАЛЬШЕ КАК?

Автор: anwe 25.12.2006, 00:31
1BJ, тебе же сказали создай новую тему, не засоряй эфир smile 

Автор: b44 25.12.2006, 14:31
Sartorius,  в паскале все правильно выщитывается!!
в асемблеровской вставке вроде стото не так, ответ большой получается!
если взять числа 9 6 3 1 в паскале около 1.5 получается - правильно,
а в асемблере около 16000 вроде! 
кто знает в чем ошибка пожалуйста исправте!

Автор: Akina 25.12.2006, 15:34
Код

mov ax, a
mov bx, b
mov cx, c
mov dx, d

shr ax,2 ; ax = a\4
sub bx,ax ; bx = b-a\4
shl cx,1 ; cx = 2c
mov ax, dx ; ax=d
mov dl, 3
div dl ; al = dx\3
cbw ; ax=dx\3
sub cx, ax ; cx=2c-d\3
mov ax, cx ; ax=2c-d\3
xor dx,dx
div bx ; ax=(2c-d\3)\(b-a\4)

В целых вроде так... писано на коленке, проверяй.

Автор: anwe 25.12.2006, 21:36
ТОолько в Паскале кажется не воспримет
Код

shr ax,2
Надо дважды писать
Код

shr ax,1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)