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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2007, 20:49   #1
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию Ассемблер в Делфях

Нужен код на ассемблере - сложение двух чисел. Хочу реализовать на Delphi в консоле.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 21.07.2007, 22:27   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Код:
var a,b,sum;
begin
a:=1;
b:=2;
asm
mov eax,a
mov ebx,b
add eax,ebx
mov sum,eax
end;
end;
Carbon вне форума Ответить с цитированием
Старый 22.07.2007, 10:56   #3
Net
;-)
Пользователь
 
Регистрация: 18.07.2007
Сообщений: 69
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
Код:
var a,b,sum;
begin
a:=1;
b:=2;
asm
mov eax,a
mov ebx,b
add eax,ebx
mov sum,eax
end;
end;
Чуть проще вот так:

Код:
    a:=1;
    b:=2;
    asm
        mov eax, a
        add eax, b
        mov sum, eax
    end;
Да, не только проще, но и без вылета Access Violation. Во всех asm-вставках нужно соблюдать соглашения о вызовах и сохранении регистров (что в нашем случае). Регистры ebx, esi, edi подпрограмма или вставка должна сохранять, а после своей работы восстанавливать.
Конечно, раз на раз не приходится, регистр ebx может после кода не использоваться, но мало ли куда этот код будет скопипастен.
Так что либо мой вариант, либо push ebx ..... pop ebx, либо другой регистр (ecx, edx).

Вот более универсальный вариант как функция:
Код:
function Sum(const a, b:Integer):Integer; register;  // register на всякий случай
asm
    add eax, edx   // и все
end;
Такие вот пироги..
Net вне форума Ответить с цитированием
Старый 22.07.2007, 11:12   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Регистры ebx, esi, edi подпрограмма или вставка должна сохранять, а после своей работы восстанавливать.
Неужели! Но почему-то вылетает после использования ecx, edx, да и иногда и eax.
Carbon вне форума Ответить с цитированием
Старый 22.07.2007, 11:30   #5
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

Спасибо народ! буду разбираться
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 22.07.2007, 11:41   #6
Net
;-)
Пользователь
 
Регистрация: 18.07.2007
Сообщений: 69
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
Неужели! Но почему-то вылетает после использования ecx, edx, да и иногда и eax.
Ну, такое может быть из-за неаккуратности либо по незнанию, либо по еще какой причине.
Регистры eax, ecx, edx компилер при встрече вставок распоряжает таким способом, чтобы они стали полностью доступны - переносит содержащиеся там указатели в стек (либо еще куда).
Но если во вставке будет неаккуратная запись навроде
Код:
xor eax, eax
mov [eax], data  // запись в 0-й адрес
то естественно вылет будет из-за умышленной или неумышленной ошибки кодера.
Или например:
Код:
var bmp:tbitmap;
....
....
asm
    mov eax, bmp
    ..... хитрые манипуляции по чтению
    mov [eax], [что-нибудь]  // из-за невнимательности или еще чего
end;
а потом где то за вставкой будет bmp.Free, то результат будет тот же. Access Violation.
Net вне форума Ответить с цитированием
Старый 22.07.2007, 11:44   #7
Net
;-)
Пользователь
 
Регистрация: 18.07.2007
Сообщений: 69
По умолчанию

В регистровом соглашении о вызове как раз эти три регистра и являются способом передачи параметров.
function (const a, b, c:Integer):Integer; register; // по умолчанию в дельфе и так соглашение register
asm
в начале кода у нас в eax 1-й параметр, в edx - 2-й, в ecx - 3-й.
и никаких стеков..
end;
но если параметров больше 3-х, или параметры - числа с плавающей запятой, тут уже стек подключается.
хотя числа с плавающей запятой лучше передавались бы через FPU-стек, несомненно это было бы куда эффективнее.
Net вне форума Ответить с цитированием
Старый 22.07.2007, 11:46   #8
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Код:
xor eax, eax
mov [eax], data  // запись в 0-й адрес
Ага, прям так всегда и делаю.

У меня был вылет:

Код:
asm
mov edx, variable //Инициализирована!!!
end;
Carbon вне форума Ответить с цитированием
Старый 22.07.2007, 11:58   #9
Net
;-)
Пользователь
 
Регистрация: 18.07.2007
Сообщений: 69
По умолчанию

Посмотреть бы асм-кодик после этого фрагмента, или после вставки, чего там компилер нагенерил
Net вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ассемблер farxad Помощь студентам 6 11.09.2016 14:19
Тест на делфях kidman Фриланс 8 27.05.2009 08:13
Ассемблер InTest Фриланс 1 12.12.2007 02:05
USB 2.0. ассемблер wiskas Помощь студентам 1 22.02.2007 01:30