ряд вопросов по FASM
-
Если у тебя всегда 4х4 матрицы будут, перепиши на SSE, в разы выигрыш будет, если не на порядок.
Вот на SSE:
На выходе будет 5 4 3 2.
Spoiler:
Code: Select all
use32
org 0x0
db 'MENUET01'
dd 0x01,start,i_end,e_end,e_end,0,0
include '../../../macros.inc'
include '../../../debug.inc'
start:
movaps xmm0, xword[vector]
movaps xmm1, xmm0
movaps xmm2, xmm0
movaps xmm3, xmm0
movaps xmm4, xword[matrix + 0]
movaps xmm5, xword[matrix + 16]
movaps xmm6, xword[matrix + 32]
movaps xmm7, xword[matrix + 48]
dpps xmm0, xmm4, 0xf1
dpps xmm1, xmm5, 0xf1
dpps xmm2, xmm6, 0xf1
dpps xmm3, xmm7, 0xf1
cvtss2si eax, xmm0
cvtss2si ebx, xmm1
cvtss2si ecx, xmm2
cvtss2si edx, xmm3
dpd eax
dpd ebx
dpd ecx
dpd edx
quit:
mcall -1
align 16
matrix dd 0.0, 0.0, 0.0, 1.0,\
0.0, 0.0, 1.0, 0.0,\
0.0, 1.0, 0.0, 0.0,\
1.0, 0.0, 0.0, 0.0
vector dd 2.0, 3.0, 4.0, 5.0
i_end:
rb 0x100 ;stack
e_end:
Да матрицы всегда будут 4х4, потому что они планируются для 3d графики. Тут пока что с FPU разобраться не могу, хотя некоторые программы с ним писал. А вот про SSE я только некоторые статьи давно читал, но пока что не работал. Пока что стоит задача что-бы оно хоть как-то заработало, а далее думаю можно будет и на SSE переходить если до него дойдет дело.
Коректен ли код:
В конечном итоге в devbuf должен хранится указатель на выделенную ф68.12 память
Code: Select all
mcall 68, 12, 32
mov [devbuf], eax
to infinity and beyond
Смотря где и что располагается по метке devbuf.
А вообще если такой маленький буфер будет выделяться, то есть смысл его статически выделить и не дергать лишний раз ф.68.
А вообще если такой маленький буфер будет выделяться, то есть смысл его статически выделить и не дергать лишний раз ф.68.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
В теория переменная пустая, объявлялась так : devbuf dd ?Mario_r4 wrote:Смотря где и что располагается по метке devbuf.
Пожадуй так и сделаю.Mario_r4 wrote:А вообще если такой маленький буфер будет выделяться, то есть смысл его статически выделить и не дергать лишний раз ф.68.
to infinity and beyond
Тогда нормально.punk_joker wrote:В теория переменная пустая, объявлялась так : devbuf dd ?Mario_r4 wrote:Смотря где и что располагается по метке devbuf.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
И снова прошу помочь разобраться
В path параметры командой строки передаваемые приложению. Начиная с 4го символа идет нужное число, это код в теории преобразует его из стоки в численное представление. Но на практике код не работает должным образом.
Code: Select all
mov ecx, 4
xor edi, edi
.lp:
cmp byte[path+ecx], 0
jz .end_lp
movzx eax, byte[path+ecx]
sub eax, 30h
mov ebx, 10
mul ebx
add edi, eax
inc ecx
jmp .lp
.end_lp:
to infinity and beyond
1. 456 = (4*10 + 5)*10 + 6, not 4*10 + 5*10 + 6*10
2. fourth symbol is [path + 3], not [path + 4]
3. you can use 'imul edi, 10' to save extra register
4. it doesn't matter here, but may be useful to know that 'add eax, eax\ lea eax, [eax*5]' is faster than (i)mul
2. fourth symbol is [path + 3], not [path + 4]
3. you can use 'imul edi, 10' to save extra register
4. it doesn't matter here, but may be useful to know that 'add eax, eax\ lea eax, [eax*5]' is faster than (i)mul
Thanksdunkaist wrote:1. 456 = (4*10 + 5)*10 + 6, not 4*10 + 5*10 + 6*10
2. fourth symbol is [path + 3], not [path + 4]
3. you can use 'imul edi, 10' to save extra register
4. it doesn't matter here, but may be useful to know that 'add eax, eax\ lea eax, [eax*5]' is faster than (i)mul
to infinity and beyond
Code: Select all
mcall 68, 12, 32
mov [devbuf], eax
mov dword[f70rd+f70.funct], 1
mov byte[f70rd+f70.rezerv], 0
mov dword[f70rd+f70.param3], 0
mov dword[f70rd+f70.param4], edx
mov dword[f70rd+f70.name], dir
mcall 70, f70rd
Code: Select all
struct f70
funct dd ?
param1 dd ?
param2 dd ?
param3 dd ?
param4 dd ?
rezerv db ?
name dd ?
ends
f70rd rb 25
devbuf dd ?
dir db '/', 0
Code: Select all
devbuf= mem_Alloc(32);
ReadDir(0, devbuf, "/");
fcount=ESDWORD[devbuf+8];
to infinity and beyond
А что не так? Ты попросил 0 элементов, функция прочитала 0 элементов.
param1 и param2 ты не инициализировал.
param1 и param2 ты не инициализировал.
Нда, мой промах. Слегка не так понял все. Тогда такой вопрос.
тут я выделяю память, и в devbuf сохраняю адрес выделенной памяти
тут вызываю ф70.1, и она записывает в памяти по адресу из devbuf выходные данные
а тут теоретически я помещаю в edx двойное слово из данных, еоторые мне вернула ф70.1, размещенное со смещением +8 байт от начала
Все верно? Просто я неуверен в правильности выделения памяти и дальнейшей работой с ней.
Code: Select all
mcall 68, 12, 32
mov [devbuf], eax
Code: Select all
mov dword[f70rd+f70.funct], 1
mov byte[f70rd+f70.rezerv], 0
mov dword[f70rd+f70.param1], 0
mov dword[f70rd+f70.param2], 0
mov dword[f70rd+f70.param3], 0
mov dword[f70rd+f70.param4], devbuf
mov dword[f70rd+f70.name], dir
mcall 70, f70rd
Code: Select all
mov edx, dword[devbuf+8]
Все верно? Просто я неуверен в правильности выделения памяти и дальнейшей работой с ней.
to infinity and beyond
Нет, не всё.punk_joker wrote:Все верно?
1. Когда ты пишешь devbuf dd ?, то ты резервируешь двойное слово, а само devbuf будет равно смещению этого слова от начала бинарника. Соответственно, devbuf -- указатель на двойное слово.
2. Когда ты сохраняешь указатель на выделенный буфер, ты записываешь этот указатель в двойное слово, лежащее по адресу devbuf. То есть devbuf -- указатель на двойное слово, [devbuf] -- само это слово, которое есть указатель на буфер. Devbuf -- указатель на указатель на буфер.
3. Запись mov dword[f70rd+f70.param4], devbuf помещает в поле структуры не адрес буфера, а адрес, по которому лежит адрес буфера. По смыслу стоит писать mov dword[f70rd+f70.param4], [devbuf], но mov не умеет писать из памяти в память, поэтому приходится использовать промежуточный регистр или стек. Например, mov eax, [devbuf]\ mov dword[], eax. Или push [devbuf]\ pop [].
4. Аналогично в записи dword[devbuf+8] восьмёрка прибавляется не к адресу буфера (это было бы [devbuf]+8, но такой инструкции тоже нет), а к адресу адреса. Если devbuf указывает на зарезервированное двойное слово, то devbuf+8 будет указывать на 8 байт после него, т.е. куда-то за переменную dir. Что лежит по этому адресу неясно. Тут тоже нужно использовать промежуточный регистр.
Можешь написать мне завтра в джаббер; выходной, время есть.
Spoiler:
мде... это как надо программиста-ассемблерщика удивить, чтобы он забыв про то что ему удобней отвечать на английском начал писать на русском...Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Who is online
Users browsing this forum: No registered users and 16 guests