Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
Turbo Pascal

Передача параметров во внешнюю функцию на ассемблере

06.11.2010, 23:15. Показов 5307. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем времени суток. Помогите разобраться, никак не могу подружить ассемблерную функцию с паскалем.
По заданию, нужно написать на ассемблере прогу, которая считает определенную формулу, проблемы в этом нет.
Проблема в том, что когда программа на паскале выполняется, ощущение, что асм-функция абсолютно не обращает внимания, на параметры вошедшие в нее или неправильно в стек их отправляет. В общем, делал все возможное и не возможное, программа не меняет переменные. Кстати, мне известно, что результат действия для передачи данных из асм в паскаль, должен находиться в аккумуляторе (плюс, последняя команда, которая работает с ах в асм - деление), но там совсем другой результат.
Буду благодарен за помощь, если объясните\покажете ошибку.
Прилагаю код паскаля:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
program lab8b;
uses crt;
var a,c,res:integer;
{$L L8B_ASM.OBJ}
{$F+}
procedure F(var a,c,res:integer); external;
{$F-}
begin
clrscr;
a:=4;
c:=5;
res:=1;
F(a,c,res);
writeln('res=',res);
end.
И асм-процедуру:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
.386
_text segment word public 'text' use16
    assume cs:_text
F   proc    far  
    public F
 
@a1 equ word ptr [bp+10]
@c1  equ word ptr [bp+8]
@res1 equ word ptr [bp+6]
    push bp
    mov bp,sp
        
    ;(a^2+c^2)/(a+c+1)
    mov ax,@a1
    add ax,@c1
    add ax,1
    mov cx,ax
    
    mov ax,@a1
    mul @a1
    mov bx,ax
    ;
    mov ax,@c1
    mul @c1
    add ax,bx
    
    div cx  
 
    mov @res1,ax
    pop bp
    ret 6
F     endp
_text ends
      end
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.11.2010, 23:15
Ответы с готовыми решениями:

Передача параметров из Си в процедуру в Ассемблере
Здравствуйте, пожалуйста подскажите... никак не могу разобраться с передачей параметров из Си в Ассемблер ; Функция находит числа в...

Передача параметров в программу на ассемблере
Всем привет!:) У меня проблема следующая: допустим есть некая программа program1.exe, я вызываю ее через cmd.exe (из .bat-файла) и...

Передача параметров в функцию
Доброго времени суток. В ф-и есть несколько параметров-констант(const char*). Как передать в нее параметры, введенные с...

9
22 / 22 / 0
Регистрация: 12.07.2010
Сообщений: 42
07.11.2010, 03:56
Во-первых.Передача параметров происходит через ссылку (т.е. адресс переменной т.к. при объявлении процедуры было указано ключевое слово var), поэтому после выполнения кода
Assembler
1
mov ax,@a1
в регистре "ах" появится адресс переменной "а", но не её значение. Для вычислений необходимо значение, которое можно получить из адреса следующим образом
Assembler
1
2
mov bx,@a1
mov ax, [bx]
Во-вторых. Предача адресов получилась через дальние указатели, т.е. каждое значение в стеке задается последовательностью из четырех байт (два байта - сегмент, два - смещение). Следовательно код (на ASM строки 8-10) надо переписать так:
Assembler
1
2
3
@a1 equ word ptr [bp+14]
@c1  equ word ptr [bp+10]
@res1 equ word ptr [bp+6]
а обращаться логичнее так:
Assembler
1
2
lds si,@a1
mov ax, ds:[si]
1
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
07.11.2010, 09:09
Пиши на встроенном асме.

Если обязательно нужен obj, то посмотри "Рудольф Марек Ассемблер на примерах (Базовый курс)". Там подробно описано для NASM+Pascal.
1
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
07.11.2010, 22:25  [ТС]
Да, надо обязательно с obj-файлом сделать. На встроенном асме уже написал, там на много проще.)
kidiam, большое спасибо за советы и поправки.
murderer, спасибо за литературу.
Сегодня все попробую.
И на засыпку, еще такой вопрос: В конце асм-программы, надо писать "ret число", что бы вернуть sp в изначальное положение. Число ровняется количеству байт переданных параметрами в стек, на сколько я понял.
Значит, в моем случае, учитывая, что передачи идут дальние, я передаю @a1(4b)+@c1(4b)+@res1(4b)=12 байт, правильно? Т.е. писать надо будет "ret 12".

Добавлено через 8 часов 22 минуты
В общем сделал задачу, упростил себе задание немного конечно. Но все же.
Спасибо большое за разъяснения, во всяком случае, я теперь более ясно понимаю, что происходит в программе.
Правда еще предстоит задачка по сложнее, но думаю, особых сложностей возникнуть не должно.)
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
08.11.2010, 10:34
Цитата Сообщение от blinds Посмотреть сообщение
Проблема в том, что когда программа на паскале выполняется, ощущение, что асм-функция абсолютно не обращает внимания, на параметры вошедшие в нее или неправильно в стек их отправляет.
Учи соглашение о вызовах, описанная тобой проблема может происходить только от его недопонимания.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
08.11.2010, 10:53
Цитата Сообщение от taras atavin Посмотреть сообщение
Учи соглашение о вызовах, описанная тобой проблема может происходить только от его недопонимания.
не думаю что проблема была из-за недопонимания соглашения о вызовах, ведь в паскале(также как в c и в fortran) параметры помещаются в стек в естественном порядке, так же как вызывается функция. Обычно это непонимание проявляется в вызове подпрограмм из си - там порядок обратный. Скорее проблему вызвали far адреса

Добавлено через 40 секунд
Цитата Сообщение от vital792 Посмотреть сообщение
также как в c и в fortran
в бейсике и в фортран - ошибся)
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
08.11.2010, 11:04
Цитата Сообщение от vital792 Посмотреть сообщение
Скорее проблему вызвали far адреса
Ну и ну, формат и разрядность адреса оказывается не часть соглашения. В одной программе могут одновременно использоваться и ближние и дальние адреса, но нет принципиальных препятствий для передачи адресов как в дальнем, так и в ближнем формате. Даже если сегментов много, можно собрать все данные в один сегмент и подразумевать его номер во всех функциях. А если самих данных для этого слишком много, то сгруппировать их и размещать в сегментах в зависимости от функций, куда передаются, или при вызове функции копирожать в нужный сегмент все дальние данные. А можно ближние передавать в дальнем формате. И передача изменяемых данных по указателю, а неизменяемых по значению - тоже часть соглашения. Можно и неизменяемые передавать по указателю. В части передачи по указателю изменяемых параметров совпадают все соглашения, кроме языков, предусматривающих явную декларацию способа передачи параметра, но и в этом случае нет иного пути, кроме как передавать по указателю (на плюсовых сях можно ешё по ссылке, но
ссылкой называется указатель специального вида, синтаксис обращения к которому идентичен синтаксису обращения к переменной, на которую он указывает
, то есть в принципе это та же передача по указателю, только для доступа к значению не нужен оператор разыменования, а если это объект или структура, то для доступа к полю используется точка, а не ->, но ассемблер таких тонкостей высокого уровня в упор не видит), так как иначе не получится менять значения этих параметров в вызывающей программе кодом подпрограммы, то есть они не будут изменяемыми.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
08.11.2010, 11:45
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну и ну, формат и разрядность адреса оказывается не часть соглашения
ну это спор о терминологии мало поможет ТС. Вообще соглашение вызова зависит от архитектуры целевой машины и компилятора, и можно сказать, что в него входит расположение входных параметров, порядок передачи параметров, кто возвращает указатель стека, модификатор дальности вызова и соответственно возврата, содержимое каких регистров подпрограмма должна восстановить перед возвратом - а сбор и проецирование сегментов это тонкости реализации
0
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
08.11.2010, 19:16  [ТС]
Хе-хе, это, наверное, мой одногрупник. Вроде никнейм похожий, да и варианты у нас одинаковые.)
А вообще, я с самого начала, не правильно определял местонахождение в стеке переменных. В нашей теории всех тонкостей не описано, а я сам не догадался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.11.2010, 19:16
Помогаю со студенческими работами здесь

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

Передача параметров в функцию
Можно ли сделать так, чтобы при совпадении переменных в функцие и основной программе, значения изменялись и в основной программе? И еще,...

Передача параметров в функцию
Здравствуйте. Пишу аналог функции strtok. Начал на с++ и написал код: char *mstrtok(char * &str1, const char *str2) { char...

Передача параметров в функцию
function any_op(a,b:byte; ch:char):byte; begin a:=a ord(ch) b; //из символа получить операцию, нужна универсальная функция, как? ...

Передача параметров в функцию
Люди помогите, пожалуйста. Есть такая простая задачка: В одномерном массиве, состоящем из n элементов вычислить произведение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru