Перенос c Masm на Tasm
вот ее код
Цитата:
.386
.Model Flat,StdCall
Include ..\Include\Kernel32.inc
IncludeLib ..\Lib\Kernel32
.Code
hHeap DD 0
;dwMatrix DD 0,1,2,3, 4,5,5,7, 7,5,5,4, 3,2,1,0 ;Определитель =9
;dwMatrix DD 1,4,6,9, 5,3,3,2, -2,7,2,0, 8,14,2,4 ;=2150
dwMatrix DD 1,3,5,7,9, 0,2,4,6,8, 1,1,2,1,1, 3,2,3,2,3, 5,3,7,3,7 ;=8
;На входе–адрес массива данных(DWord) и размер матрицы
CalcDet:
Push ESI
Push EDI
Push EBX
Mov EAX,[ESP+20]
Cmp EAX,1
JL ErrSize
JNE @F
Mov EAX,[ESP+16]
Mov EAX,[EAX]
Jmp PopRegs
@@:
XOr EBX,EBX
Mov ESI,[ESP+16]
Cmp EAX,2
JNE @F
Mov EAX,[ESI+12]
IMul EAX,[ESI]
Mov EBX,[ESI+4]
IMul EBX,[ESI+8]
Sub EAX,EBX
Jmp PopRegs
@@:
Cmp EAX,3
JNE @F
Mov EAX,[ESI]
IMul EAX,[ESI+16]
IMul EAX,[ESI+32]
Mov EBX,[ESI+12]
IMul EBX,[ESI+28]
IMul EBX,[ESI+8]
Add EAX,EBX
Mov EBX,[ESI+4]
IMul EBX,[ESI+20]
IMul EBX,[ESI+24]
Add EAX,EBX
Mov EBX,[ESI+8]
IMul EBX,[ESI+16]
IMul EBX,[ESI+24]
Sub EAX,EBX
Mov EBX,[ESI+4]
IMul EBX,[ESI+12]
IMul EBX,[ESI+32]
Sub EAX,EBX
Mov EBX,[ESI+20]
IMul EBX,[ESI+28]
IMul EBX,[ESI]
Sub EAX,EBX
Jmp PopRegs
@@:
Mov EBP,EAX ;Размерность матрицы
Dec EAX
Mul EAX ;Количество элементов для минора (N-1)^2
ShL EAX,2 ;Количество байт под минор(двойные слова)
Invoke HeapAlloc,hHeap,EBX,EAX
Push EAX ;----1----
Push ESI ;----2---- Указатель в матрице,из которой будет собираться минор
Mov EDI,EAX ;Указатель в буфере,в который будут копироваться компоненты минора
Sub ESP,4 ;----3----
Mov ECX,EBP ;Размерность матрицы(1..ECX)
Mov EAX,ECX
Mul EAX
Dec EAX
Mov [ESP],EAX ;Количество элементов исходной матрицы(N^2-1)
Mov EBP,EBX ;Текущий столбец
CalcMinor: ;Отсчёт идёт с 0
Mov EAX,ECX ;Счётчик элементов в исходной матрице(N..N^2-1,пропуск элементов 0..N-1)
ShL EAX,2
Mov ESI,[ESP+4]
Add ESI,EAX ;Позиционирование на N-й элемент
ShR EAX,2
SubMinor: ;Копирование элементов в минор
XOr EDX,EDX
Push EAX
Div ECX
Cmp EDX,EBP
JE @F
MovSD
Jmp Next
@@:
Add ESI,4
Next:
Pop EAX
Inc EAX
Cmp EAX,[ESP]
JNA SubMinor
Push ECX
Push EBP
Mov EDI,[ESP+16]
Dec ECX
Push ECX
Push EDI
Call CalcDet ;Определитель минора
Pop EBP
Pop ECX
Mov ESI,[ESP+4]
ShL EBP,2
Add ESI,EBP
ShR EBP,2
Inc EBP
Mul DWord Ptr[ESI]
BT EBP,0
JC AddDet
Sub EBX,EAX
Jmp @F
AddDet:
Add EBX,EAX
@@:
Cmp EBP,ECX
JNE CalcMinor
Add ESP,4 ;----3----
Pop ESI ;----2----
Pop EAX ;----1----
Push EBX
XOr EBX,EBX
Invoke HeapFree,hHeap,EBX,EAX
Pop EAX
Jmp PopRegs
ErrSize:
XOr EAX,EAX
PopRegs:
Pop EBX
Pop EDI
Pop ESI
Ret 8
Main:
Call GetProcessHeap
Test EAX,EAX
JNZ @F
Ret
@@:
Mov hHeap,EAX
Push 5
Push Offset dwMatrix
Call CalcDet
Ret
End Main
.Model Flat,StdCall
Include ..\Include\Kernel32.inc
IncludeLib ..\Lib\Kernel32
.Code
hHeap DD 0
;dwMatrix DD 0,1,2,3, 4,5,5,7, 7,5,5,4, 3,2,1,0 ;Определитель =9
;dwMatrix DD 1,4,6,9, 5,3,3,2, -2,7,2,0, 8,14,2,4 ;=2150
dwMatrix DD 1,3,5,7,9, 0,2,4,6,8, 1,1,2,1,1, 3,2,3,2,3, 5,3,7,3,7 ;=8
;На входе–адрес массива данных(DWord) и размер матрицы
CalcDet:
Push ESI
Push EDI
Push EBX
Mov EAX,[ESP+20]
Cmp EAX,1
JL ErrSize
JNE @F
Mov EAX,[ESP+16]
Mov EAX,[EAX]
Jmp PopRegs
@@:
XOr EBX,EBX
Mov ESI,[ESP+16]
Cmp EAX,2
JNE @F
Mov EAX,[ESI+12]
IMul EAX,[ESI]
Mov EBX,[ESI+4]
IMul EBX,[ESI+8]
Sub EAX,EBX
Jmp PopRegs
@@:
Cmp EAX,3
JNE @F
Mov EAX,[ESI]
IMul EAX,[ESI+16]
IMul EAX,[ESI+32]
Mov EBX,[ESI+12]
IMul EBX,[ESI+28]
IMul EBX,[ESI+8]
Add EAX,EBX
Mov EBX,[ESI+4]
IMul EBX,[ESI+20]
IMul EBX,[ESI+24]
Add EAX,EBX
Mov EBX,[ESI+8]
IMul EBX,[ESI+16]
IMul EBX,[ESI+24]
Sub EAX,EBX
Mov EBX,[ESI+4]
IMul EBX,[ESI+12]
IMul EBX,[ESI+32]
Sub EAX,EBX
Mov EBX,[ESI+20]
IMul EBX,[ESI+28]
IMul EBX,[ESI]
Sub EAX,EBX
Jmp PopRegs
@@:
Mov EBP,EAX ;Размерность матрицы
Dec EAX
Mul EAX ;Количество элементов для минора (N-1)^2
ShL EAX,2 ;Количество байт под минор(двойные слова)
Invoke HeapAlloc,hHeap,EBX,EAX
Push EAX ;----1----
Push ESI ;----2---- Указатель в матрице,из которой будет собираться минор
Mov EDI,EAX ;Указатель в буфере,в который будут копироваться компоненты минора
Sub ESP,4 ;----3----
Mov ECX,EBP ;Размерность матрицы(1..ECX)
Mov EAX,ECX
Mul EAX
Dec EAX
Mov [ESP],EAX ;Количество элементов исходной матрицы(N^2-1)
Mov EBP,EBX ;Текущий столбец
CalcMinor: ;Отсчёт идёт с 0
Mov EAX,ECX ;Счётчик элементов в исходной матрице(N..N^2-1,пропуск элементов 0..N-1)
ShL EAX,2
Mov ESI,[ESP+4]
Add ESI,EAX ;Позиционирование на N-й элемент
ShR EAX,2
SubMinor: ;Копирование элементов в минор
XOr EDX,EDX
Push EAX
Div ECX
Cmp EDX,EBP
JE @F
MovSD
Jmp Next
@@:
Add ESI,4
Next:
Pop EAX
Inc EAX
Cmp EAX,[ESP]
JNA SubMinor
Push ECX
Push EBP
Mov EDI,[ESP+16]
Dec ECX
Push ECX
Push EDI
Call CalcDet ;Определитель минора
Pop EBP
Pop ECX
Mov ESI,[ESP+4]
ShL EBP,2
Add ESI,EBP
ShR EBP,2
Inc EBP
Mul DWord Ptr[ESI]
BT EBP,0
JC AddDet
Sub EBX,EAX
Jmp @F
AddDet:
Add EBX,EAX
@@:
Cmp EBP,ECX
JNE CalcMinor
Add ESP,4 ;----3----
Pop ESI ;----2----
Pop EAX ;----1----
Push EBX
XOr EBX,EBX
Invoke HeapFree,hHeap,EBX,EAX
Pop EAX
Jmp PopRegs
ErrSize:
XOr EAX,EAX
PopRegs:
Pop EBX
Pop EDI
Pop ESI
Ret 8
Main:
Call GetProcessHeap
Test EAX,EAX
JNZ @F
Ret
@@:
Mov hHeap,EAX
Push 5
Push Offset dwMatrix
Call CalcDet
Ret
End Main
в целом код понятен, но т.к. с masm не сталкивался, работал только с tasm есть несколько ключевых непонятных моментов, и код сам перенести не могу
Кое-что я тебе в публичку написал,а какие ещё проблемы с переносимостью?
в командах invoke и getprocessheap и все что с heap связано. вроде все. это краеугольный камень непонимания :)
Поддерживает ли TAsm Invoke,не знаю.В крайнем случае замените на цепочку Push'ей и Call функции.А heap-функции–они и в TAsm'е функции:)
да как раз в heap ф-циях проблема. В тасме при попытке подключения kernel32.inc выдает что в каждой строчке illegal instruction и все.
а вы что хотели ? используемый вами kernel32.inc из пакета масма . )