Вопрос № 30422: Уважаемые експерты! Помогите,пожалуйста, связать Ассемблер и Дельфи! Я написал простейшую функцию, получил объектный файл, прилинковал его к консольной дельфийной программе {$L HELL.OBJ}, Но она возвращает то значение, которое я заслал, а не удвоенно...Вопрос № 30426: Здраствуйте дорогие эксперты.
Помогите пожалуйста решить задачу, а то что то немогу понять как ее сделать (пробовал при помощи массива но почему то ответ получается неправильный). А задача такая:
Допустим у нас есть 65 каких то емкостей, в...Вопрос № 30435: Здравствуйте, великие эксперты!
Я написал эмулляционную программу по Универсальному микроконтроллеру, своего рода эмулятор ассемблера и дизассемблера, но есть одна проблема: У старых УМК нет команд деления и умножения. Алгоритм умножения есть, а ...Вопрос № 30472: Здравствуйте уважаемые эксперты.
Такой вопрос. Раньше писал только ассемблерные вставки в С++. Сейчас перешел на чистый асм. Подскажите, какие шаги нужно пройти дабы простой файл типа excemple.asm конвертировать в файл с расширением .obj, а затем...
Вопрос № 30.422
Уважаемые експерты! Помогите,пожалуйста, связать Ассемблер и Дельфи! Я написал простейшую функцию, получил объектный файл, прилинковал его к консольной дельфийной программе {$L HELL.OBJ}, Но она возвращает то значение, которое я заслал, а не удвоенное. С Турбо Паскалем нет проблем, но мне нужно в режиме 32бит, заранее благодарен
Анатолий.
p.s.
END
Отвечает: Евгений Иванов
Здравствуйте, Кривенцов Олег Олегович!
убери Pushad и popad
вот так делай:
sub eax, eax
mov ax, N
shl eax, 1
удачи!
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 29.11.2005, 09:40 Оценка за ответ: 5
Вопрос № 30.426
Здраствуйте дорогие эксперты.
Помогите пожалуйста решить задачу, а то что то немогу понять как ее сделать (пробовал при помощи массива но почему то ответ получается неправильный). А задача такая:
Допустим у нас есть 65 каких то емкостей, в первой находится 1 чего то, во второй и последующих в 2 раза больше чем в предыдущей (выходит что в первой емкости 1, во второй 2, в третьей 4, в четвертой 8 и т.д.), так вот нужно посчитать общее кол-во этого чего то во всех емкостях.
P.S. На С задача работает, а вот на Assembler'e как я только непробовал ее делать, помоги те пожалуйста, буду примного благодарен, ну а если не сможете помочь с написанием, то хотя бы намекните как это сделать!
Отправлен: 29.11.2005, 09:06
Вопрос задал: Grubby (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Ayl
Здравствуйте, Grubby!
Общее кол-во этого чего-то будет 2^65-1. Это число не поместиться в стандартные целые типы. Тебе нужно для счетчика использовать несколько байт (на самом деле, 9-ти байт хватит, т.к. 9 байт - это 72 разряда, т.е. максимальное число в них - 2^72 > 2^65).
Тебе нужно реализовать с этими 9-тибайтными числами две операции: умножение на 2 и сложение 2-х таких чисел. Первая реализуется с помощью сдвига влева на 1 бит через флаг переноса, вторая - побайтовым сложением, начиная с младших байтов, с учетом переноса. Т.е., последовательность команд add-adc-adc-adc-...
Ну и еще требуется процедура вывода данного числа на экран.
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Академик)
Отправлен: 29.11.2005, 14:37 Оценка за ответ: 4 Комментарий оценки: Спасибо большое, пол дела сделано. Теперь осталось все это только на Assembler'e реализовать
Вопрос № 30.435
Здравствуйте, великие эксперты!
Я написал эмулляционную программу по Универсальному микроконтроллеру, своего рода эмулятор ассемблера и дизассемблера, но есть одна проблема: У старых УМК нет команд деления и умножения. Алгоритм умножения есть, а вто деления не подходит, так как он делает вот такую штуку (команды старого ассемблера) и в нём нет команды деления, поэтому приходиться обходиться алгеброй логики.
Суть программы, например:
6/4=1,2; но не 1,5, так как эта программа отнимает от шести четыре и остаток 6-4=2 кладёт в ячейку памяти.
Если у кого-нибудь остался алгоритм деления однобайтных чисел, с нормальными остатками, при помощь команд сравнения, суммирования, вычитания, команд сдвига и т.д., не используя команды деления и умножения. Пожалуйста, бросте мне примерчик на ассемблере (можно на новом, лишь бы алгоритм был).
Отвечает: Ayl
Здравствуйте, Подболотов Иван Алексеевич!
Погоди. При целочисленном делении 6 на 4 ты никогда не получишь 1,5. А получишь 1 в частном и 2 в остатке.
Насколько я понимаю, твой алгоритм ровно это и делает.
Самый простой алгоритм - вычитать из делимого делитель, увеличивая каждый раз счетчик на 1, до тех пор, пока на очередном шаге значение делимого не станет меньше делителя. Это и будет остатком, а значение счетчика - частным.
Вот алгоритм в формальном описании.
ИД: Делитель - ячейка A, делимое - ячека B
Рез-т: Частное - ячейка A, остаток - ячейка B
1. Обнулим ячейку C - здесь будем накапливать частное
2. Если A < B - перейти на п.6
3. Вычесть из A значение B и записать результат в A (A=A-B)
4. Увеличить C на 1 (С=С+1)
5. Перейти на п.2
6. Записать значение из ячейки A в ячейку B (B=A)
7. Записать значение из ячейки C в ячейку A (A=C)
Все.
Также есть алгоритмы быстрого деления, с использованием сдвигов и т.п. Но, к сожалению, я их плохо помню, надо искать конспекты... Попробуй в сети поискать.
Суть, насколько я помню, там в том, что деление производится столбиком. То есть делитель вычитается из делимого, начиная со старших разрядов, а частное каждый раз сдвигается влево на 1 разряд и в конец добавляется 0 или 1. Все числа при этом, естесственно, записываются в 2-й системе счисления (в ней не нужно производить деления для нахождения очередного разряда частного).
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Академик)
Отправлен: 29.11.2005, 14:29 Оценка за ответ: 5 Комментарий оценки: Понятно! Я как раз по сдвигам и сделал, только бы узнать алгоритм не целочисленное деление. Чтобы разделил он например: 7/4=1.75! Я раньше с этим работал ещё на Spectrum'е, но так и не вспомнил, где я видел алгоритм!
Вопрос № 30.472
Здравствуйте уважаемые эксперты.
Такой вопрос. Раньше писал только ассемблерные вставки в С++. Сейчас перешел на чистый асм. Подскажите, какие шаги нужно пройти дабы простой файл типа excemple.asm конвертировать в файл с расширением .obj, а затем и .exe?
Заранее всем благодарен.
Отправлен: 29.11.2005, 19:44
Вопрос задал: Юра (статус: 2-ой класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Sager
Здравствуйте, Юра!
Для дос или для вин? И не конвертировать,а скомпилировать.
Дос:
ml.exe /c excemple.asm
link excemple.obj
Для win:
ml /c /coff excemple.asm
link excemple.obj /subsystem:windows(либо вместо windows console, если консольное приложение)
Ответ отправил: Sager (статус: Студент)
Отправлен: 29.11.2005, 20:47