Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2008, 20:01   #1
kommunist
C# developer
Форумчанин
 
Аватар для kommunist
 
Регистрация: 03.10.2007
Сообщений: 393
Вопрос Pascal + assembler

Здраствуйте. Нужна помощ по ассемблеру. Задача следующая. Написать процедуру выисления выражения (2*с - d/4)/(a*a + 1) на ассемблере. Данные ввести с паскаля и вывести результат тоже. Компилятор tasm.

Я сделал так:
Код:
program lab2;
uses crt;
{L$ lab.obj}
var a,d,c:integer;
     ax,dx,de:integer;
 procedure Raschet(x,y,z; var ch1,ch,del:integer);external;
begin
   clrscr;
   write('Vvedite a,d,c');
   readln(a,d,c);
   Raschet(c,d,a,ax,dx,de)
   write('(2*c - d/4)/(a*a +1)=',ax + Frac(dx/de));
readln;
end;
assembler
Код:
code segment byte public 
assume cs:code

   public Raschet
Raschet proc near
            push bp
            mov  bp,sp
            
            mov ax,word ptr[bp+16]
            mov bx,4
            idiv bx
                  ;;;;;;;;;;;;;;;;;;;;;;;;; d/4
            mov cx,dx
            mov bx,ax
    
             mov ax,word ptr[bp+18]
             muv si,2
             imul si
                   ;;;;;;;;;;;;;;;;;;;;;;;;  c*2
             sub ax,bx
             sbb dx,cx
                     ;;;;;;;;;;;;;;;;;;;; c*2 - d/4
             mov ax,word ptr[bp+20]
             imul bx
             add bx,1
             idiv bx
                   ;;;;;;;;;;;;;;;;;;;;;;;;;; (2*с - d/4)/(a*a + 1)
Передача данных в паскаль
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
             les di,dword ptr[bp+12]
             mov ES:[DI],AX

             les di,dword ptr[bp+8]
             mov ES:[DI],dx

             les di,dword ptr[bp+4]
             mov ES:[DI],bx
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
             mov sp,bp
             pop bp
             ret 18
Raschet endp
code ends
end
Программа работает, но считает не правильно, где я допустил ошибку?
Зараннее всем спасибо.
I like WPF
kommunist вне форума Ответить с цитированием
Старый 19.10.2008, 20:11   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

ошибка наверно с моделью вызова процедур. в Pascal по умолчанию используется модель вызова register, т.е. параметры передаются через регистры. В ассемблерной процедуре модель вызова похожа на stdcall.
rpy3uH вне форума Ответить с цитированием
Старый 19.10.2008, 20:13   #3
kommunist
C# developer
Форумчанин
 
Аватар для kommunist
 
Регистрация: 03.10.2007
Сообщений: 393
По умолчанию

Да вроде нет, я снаала пробывал считать только левую ччастьвсе работает нормально а вот целое выражение нет.
I like WPF

Последний раз редактировалось kommunist; 19.10.2008 в 20:38.
kommunist вне форума Ответить с цитированием
Старый 19.10.2008, 21:35   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

У Вас смещения параметров для модели near, как и указано в коде на asm, а вызов в pascal делается как far (если, конечно, в настройках не указано $F-}.

procedure Raschet(x,y,z; var ch1,ch,del:integer); near; external;

И еще по-моему с порядком параметров напутано. В asm'e 16, 18, 20 - (d, c, a), а в pascal передается c, d, a.

Это легко проверить. Напишите:
Код:
Raschet proc near
            push bp
            mov  bp,sp
            
            mov ax,word ptr[bp+24]   ; с запасом
            mov ax,word ptr[bp+22]
            mov ax,word ptr[bp+20]
            mov ax,word ptr[bp+18]
            mov ax,word ptr[bp+16]
Вызов: Raschet(1,2,3,ax,dx,de);

и в Turbo Debug посмотрите какие смещения получатся - в ax увидите переданные значения.
-------
Да, еще:
умножение a*a - проверьте что на что Вы умножаете
и перед делением на слово я бы очистил регистр dx, а при умножении на слово dx задействован - в нем нельзя сохранять промежуточные результаты.

Последний раз редактировалось alexBlack; 19.10.2008 в 21:54.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задачи на С++,assembler,Pascal Mitron Фриланс 1 06.01.2008 14:55