Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Asm для Linux/Unix > некторые вопросы по gas |
Автор: gumbert 17.12.2007, 14:45 | ||||||||
Значится так, возникла необходимость мне сделать несколько лабораторных по ассемблеру. 1. Решить простой примерчик (c+4*d-123)/(1-a/2), но сделать ввод переменных в си, а реализацию решения самого примера на ассемблере. Как это увидел я. Основной файлик lab1.c на си, вызываем в нём функцию res.s на ассемблере. Компилирую командой
Компиляция проходит успешно, но при попытке ввести какие-либо данные, которые удовлетворяют ОДЗ (нпаример a=1 c=1 d=1) вылазит ошибка Floating point exception. В чем именно дело, понять не могу. На что стоит обратить внимание? Еще вопрос, если объявлять переменные a,c, и d не глобально, а в теле main, выдаются вот такие сообщения
так вот, как от этого избавиться? Т.е. как я понял, не передаются аргументы моей функции. Спасибо заранее. Ещё мог напутать с синтаксисом в ассемблере, т.к. лекции у нас по intel ассемблеру. lab1.c
res.s
|
Автор: JackYF 17.12.2007, 15:29 |
У меня такое выдавалось недавно при делении на 0. Целых чисел ![]() |
Автор: MAKCim 17.12.2007, 17:19 | ||||||
gumbert, нда...
a, c, d в данном случае передаются через стек код же функции res() его не использует для получения значений переданных переменных
Добавлено через 3 минуты и 23 секунды
IDIV делит EDX:EAX на значение заданное регистровым (или адресным) операндом при этом если EAX & 0x80000000 == true, то EDX должен быть равным 0xFFFFFFFF (-1) иначе - нулю |
Автор: gumbert 17.12.2007, 21:45 |
ну дык ![]() MAKCim, так тоже не работает, таже самая ошибка... |
Автор: MAKCim 17.12.2007, 22:08 | ||||
все прекрасно работает показывай полный код |
Автор: gumbert 17.12.2007, 23:33 | ||||
MAKCim, вот теперь работает, спасибо! У меня это выглядит теперь вот так.
Теперь осталось понять что к чему. Кстати, обязательно прототип функции объявлять? И без него работает вроде. |
Автор: MAKCim 17.12.2007, 23:39 | ||
желательно |
Автор: gumbert 25.12.2007, 13:14 | ||||
Ещё одна задачка. Вычислить выражение (c+4*d-sqr(123*c))/(1-a/2) используя арифметические операции сопроцессора. Причём a и b должны быть int, а c и d float (или double). У меня все переменные double. Как всё таки сделать те что надо int, а те что надо double? Как в данном случае работать со стеком? А то я опять через глобальное объявление переменных пошел... Ещё и в добавок считает неправильно. При a=1, c=1 и d=1 результат должен быть -12,1810730128, а у меня получается -0,200000. Ещё вопрос: в случае арифметического сопроцессора синтаксис тоже наоборот относительно интеловского? Заранее спасибо.
|
Автор: MAKCim 25.12.2007, 14:12 | ||
нет результат ~ -6.09 т. к (c + 4 * d - sqrt(123 * c)) / (1 - a / 2) = (1 + 4 - sqrt(123)) / (1 - 0) т. к a - это int, то a / 2 = 0, если a = 1 |
Автор: gumbert 25.12.2007, 14:29 | ||
а, ну да. |
Автор: gumbert 25.12.2007, 16:47 | ||
делаю a int вообще nan получается... попытаюсь воспроизвести ход моих рассуждений:
подскажите, пожалуйста, где я не прав? |