Mój program (tylko taki testowy, nic konkretnego nie robi) korzysta z funkcji asemblerowej. Wygląda to w ten sposób:
main.h:
#pragma once
#include <Windows.h>
extern "C" int Dodaj( int* tab, int a1, int a2);
main.cpp:
#include <iostream>
#include "naglowek.h"
using namespace std;
int main()
{
int result = 0;
int tab[2] = {2,3};
result = Dodaj(tab, 2, 2);
std::cout << result;
getchar();
return 0;
}
Natomiast procedure.asm:
.386
.MODEL FLAT, C
.DATA
a1 dd 0
a2 dd 0
.CODE
Dodaj proc
push ebp
mov ebp, esp
xor eax, eax
mov ebx, [ebp+8]
mov edx, [ebp+12]
mov ecx, [ebp+16]
mov [a1], edx
mov [a2], ecx
xor ecx, ecx
petla:
cmp ecx, a2
jae koniec_petli
add eax, [ebx+4*ecx]
inc ecx
jmp petla
koniec_petli:
pop ebp
ret
Dodaj endp
END Dodaj
Jeszcze jest plik .def ale nie wrzucam. Funkcja ma dodawać elementy tablicy. Testuje to tylko po to, żeby potem w przypadku trudniejszej procedury nie wyłożyć się na podstawach. Tak jak tutaj właśnie się wyłożyłem.
No i problem jest taki:
- Jeśli w pętli porównuje cmp ecx, a1 to niby dobrze.
EDIT: W registers sprawdziłem to w EDX jest 00000001 niezależnie czy wprowadzę jako parametr 1 ,2 czy 10. Przez debugger sprawdzam i pętla zawsze wykonuje się tylko raz. A wynik jest taki jakby wykonała się tą zadaną ilość razy o.0 nie rozumiem. - Jeśli w pętli porównuje cmp ecx, a2 to wywala access violation przy dodawaniu do EAX.
Nie umiem stwierdzić, czy błąd jest w kwestii przekazania argumentów do procedury czy dopiero potem w kodzie.