C++ Builder 6 и процедура на asm'e
Я написал процедуру на ассемблере и добавил её в проект на BCB6. При компиляции я получаю ошибку [Tasm Error] calc.asm(2): Invalid model type
Вот отрывок из кода процедуры
Код:
.386
.model small, C, use32
.stack 256
public _calc_func
.code
main:
_calc_func proc C near u:dword, i:word, v:dword, j:word, w:dword
local k:byte
push si
cld
push ds
pop es
xor al, al
.model small, C, use32
.stack 256
public _calc_func
.code
main:
_calc_func proc C near u:dword, i:word, v:dword, j:word, w:dword
local k:byte
push si
cld
push ds
pop es
xor al, al
Вот так я подключаю её к С++
extern "C" void calc_proc(BYTE* u, WORD i, BYTE* v, WORD j, BYTE w);
Помогите решить проблему!
Разве эта модель адресации может быть использована под Windows?
Вроде как model flat нужно использовать. И вызов stdcall.
Ну так про то и речь. Об этом собственно и кагбы намекает компилятор - но афтор намеки игнорирует и тему на форуме создает.
Модель flat так же выдаёт ошибку
Ещё можно Юрова почитать,у него есть про это
При использовании модели flat та же ошибка?
P.S.Не помню,чтоб была модель "C".Также можно попробовать исключить "use32" и посмотреть,что из этого получится
Код:
.386
.model flat, C, use32
.stack 256
public _calc_func
.code
main:
_calc_func proc C near u:dword, i:word, v:dword, j:word, w:dword
local k:byte
push si
cld
push ds
pop es
xor al, al
lea di, w
mov cx, i
add cx, j
rep stosb
xor di, di
mov cx, j
loop1:
push cx
cmp byte ptr v[di], 0
je end_loop1
xor si,si
mov cx, i
mov k, 0
multiplication:
mov al, byte ptr u[si]
mul byte ptr v[di]
xor dx, dx
add di, si
mov dl, byte ptr w[di]
sub di, si
add ax, dx
xor dx, dx
mov dl, k
add ax, dx
aam
mov k, ah
add di, si
mov byte ptr w[di], al
sub di, si
inc si
loop multiplication
mov al, k
add di, si
mov byte ptr w[di], al
sub di, si
end_loop1:
inc di
pop cx
loop loop1
pop si
_calc_func endp
end main
.model flat, C, use32
.stack 256
public _calc_func
.code
main:
_calc_func proc C near u:dword, i:word, v:dword, j:word, w:dword
local k:byte
push si
cld
push ds
pop es
xor al, al
lea di, w
mov cx, i
add cx, j
rep stosb
xor di, di
mov cx, j
loop1:
push cx
cmp byte ptr v[di], 0
je end_loop1
xor si,si
mov cx, i
mov k, 0
multiplication:
mov al, byte ptr u[si]
mul byte ptr v[di]
xor dx, dx
add di, si
mov dl, byte ptr w[di]
sub di, si
add ax, dx
xor dx, dx
mov dl, k
add ax, dx
aam
mov k, ah
add di, si
mov byte ptr w[di], al
sub di, si
inc si
loop multiplication
mov al, k
add di, si
mov byte ptr w[di], al
sub di, si
end_loop1:
inc di
pop cx
loop loop1
pop si
_calc_func endp
end main
У Юрова описывается как скомпилить консольную версию через компилятор командной строки для С++, мне нужно использовать мою процедуру на ассемблере в WinForms приложении.
Иди учить матчасть с самого начала!