1

Тема: VC++ inline assembler, як передати масив в функцію?

Хай. От є масив, створенний за допомогою с++

int main()
{
    int arr[] = { 5, 4, 7, 8, 9, 5, 1, 2, 3 };

    unsigned int length = sizeof(arr) / sizeof(arr[0]);
    int j;
    j = secondTask(arr, length);
    printf("%d\n", j); 
    _getch();
}

Він має передаватись в метод, в котрому є ассемблерна вставка, і от тре в тому методі прийняти масив та обробити його якось.

int secondTask(int *arr, int length)
{
    __asm {
        mov eax, arr[TYPE arr * 0]
    }
}

Мені виводить якесь ліве число, що свідчить про те, що я звертаюсь до невірної ділянки пам'яті.
Я вже  і так пробував, і так. Але все одно не хоче воно працювати. Хоча якщо вставити код ассемблеру в методі main, і звертатись до масиву, то все окідокі.

Говоріть українською! Живіть українською! Відчувайте українською!

2

Re: VC++ inline assembler, як передати масив в функцію?

Після стількох років щось згадувати болісно, але має бути щось типу
mov ebp, arr ; адреса початку масиву
mov ebi, i ; i-й елемент
mov eax, [ebp+sizeof(int)*ebi]

3

Re: VC++ inline assembler, як передати масив в функцію?

koala написав:

Після стількох років щось згадувати болісно, але має бути щось типу
mov ebp, arr ; адреса початку масиву
mov ebi, i ; i-й елемент
mov eax, [ebp+sizeof(int)*ebi]

Чому ви обрали саме такі назви регістрів?

Говоріть українською! Живіть українською! Відчувайте українською!

4

Re: VC++ inline assembler, як передати масив в функцію?

Прихований текст
http://puu.sh/byG7J/670b9fc040.png

я туди 4 підставляв - теж не робе

Говоріть українською! Живіть українською! Відчувайте українською!

5 Востаннє редагувалося FakiNyan (14.09.2014 17:47:18)

Re: VC++ inline assembler, як передати масив в функцію?

я так зрозумів, що головною задачею в асс коді для мене є - записати якісь дані в адресу, або взяти з адреси. Тому що от така штука працює норм, тобто в асс коді я приймаю та повертаю покажчик, і далі можу отримати значення, на котре він вказує, але це значення дістати можу тільки в с++ коді

int secondTask(int *arr, int length)
{
    __asm {

         mov eax,arr
         add eax,4
    }
}
int *j;
    j = (int*)secondTask(arr, length);
    printf("%d\n", *j); 
Говоріть українською! Живіть українською! Відчувайте українською!

6

Re: VC++ inline assembler, як передати масив в функцію?

FakiNyan написав:

Чому ви обрали саме такі назви регістрів?

За старою пам'яттю. В 8086 РЗП були спеціалізовані: A(ccumulator)X, B(ase)X, C(ycle)X, D(ata)X. Відповідно, адресуватися до пам'яті за базою можна було тільки через BX.
А ви думали, там літери просто за абеткою взяли?

FakiNyan написав:

я туди 4 підставляв - теж не робе

А текст другої помилки телепатично треба побачити?

7 Востаннє редагувалося 0xDADA11C7 (14.09.2014 23:10:36)

Re: VC++ inline assembler, як передати масив в функцію?

mov eax,arr

краще так(для запобігання двозначності)

mov eax,[arr]

тепер в регістрі eax знаходиться адреса масива
а щоб одержати значення першої комірки масива потрібно

mov eax, DWord Ptr [eax]
Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»
Подякували: FakiNyan1

8

Re: VC++ inline assembler, як передати масив в функцію?

koala написав:
FakiNyan написав:

Чому ви обрали саме такі назви регістрів?

За старою пам'яттю. В 8086 РЗП були спеціалізовані: A(ccumulator)X, B(ase)X, C(ycle)X, D(ata)X. Відповідно, адресуватися до пам'яті за базою можна було тільки через BX.
А ви думали, там літери просто за абеткою взяли?

FakiNyan написав:

я туди 4 підставляв - теж не робе

А текст другої помилки телепатично треба побачити?

то я мав на увазі

ebi

, ггг, круто я пожартував?)))))

Прихований текст
http://puu.sh/bzEfK/b8f129403d.png
Говоріть українською! Живіть українською! Відчувайте українською!

9

Re: VC++ inline assembler, як передати масив в функцію?

0xDADA11C7 написав:

mov eax,arr

краще так(для запобігання двозначності)

mov eax,[arr]

тепер в регістрі eax знаходиться адреса масива
а щоб одержати значення першої комірки масива потрібно

mov eax, DWord Ptr [eax]

лайк

Говоріть українською! Живіть українською! Відчувайте українською!