ряд вопросов по FASM

Assembler programming questions
  • Вот на SSE:
    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:
    На выходе будет 5 4 3 2.
  • Да матрицы всегда будут 4х4, потому что они планируются для 3d графики. Тут пока что с FPU разобраться не могу, хотя некоторые программы с ним писал. А вот про SSE я только некоторые статьи давно читал, но пока что не работал. Пока что стоит задача что-бы оно хоть как-то заработало, а далее думаю можно будет и на SSE переходить если до него дойдет дело.
  • Коректен ли код:

    Code: Select all

    mcall 68, 12, 32
    mov [devbuf], eax
    В конечном итоге в devbuf должен хранится указатель на выделенную ф68.12 память
    to infinity and beyond
  • Смотря где и что располагается по метке devbuf.
    А вообще если такой маленький буфер будет выделяться, то есть смысл его статически выделить и не дергать лишний раз ф.68.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Mario_r4 wrote:Смотря где и что располагается по метке devbuf.
    В теория переменная пустая, объявлялась так : devbuf dd ?
    Mario_r4 wrote:А вообще если такой маленький буфер будет выделяться, то есть смысл его статически выделить и не дергать лишний раз ф.68.
    Пожадуй так и сделаю.
    to infinity and beyond
  • punk_joker wrote:
    Mario_r4 wrote:Смотря где и что располагается по метке devbuf.
    В теория переменная пустая, объявлялась так : devbuf dd ?
    Тогда нормально.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • И снова прошу помочь разобраться

    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:
    В path параметры командой строки передаваемые приложению. Начиная с 4го символа идет нужное число, это код в теории преобразует его из стоки в численное представление. Но на практике код не работает должным образом.
    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
  • dunkaist 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
    Thanks
    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
    В eax как и положено 0, тоесть функция успешно выполняется. А вот в ebx не то что хотелось бы видеть, там тоже ноль. Пытался переписать на асм код C-- из tmpdisk который в свою очередь работает

    Code: Select all

    devbuf= mem_Alloc(32);
    ReadDir(0, devbuf, "/");
    fcount=ESDWORD[devbuf+8];
    to infinity and beyond
  • А что не так? Ты попросил 0 элементов, функция прочитала 0 элементов.

    param1 и param2 ты не инициализировал.
  • Нда, мой промах. Слегка не так понял все. Тогда такой вопрос.

    Code: Select all

    mcall 68, 12, 32
    mov [devbuf], eax
    тут я выделяю память, и в devbuf сохраняю адрес выделенной памяти

    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
    тут вызываю ф70.1, и она записывает в памяти по адресу из devbuf выходные данные

    Code: Select all

    mov edx, dword[devbuf+8]
    а тут теоретически я помещаю в edx двойное слово из данных, еоторые мне вернула ф70.1, размещенное со смещением +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:мде... это как надо программиста-ассемблерщика удивить, чтобы он забыв про то что ему удобней отвечать на английском начал писать на русском... :)
    З.Ы. punk_joker - имхается мне нужно тебе сесть и разобраться с методами адресации, чую Юрова ты либо не читал, либо просматривал по диагонали.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Who is online

    Users browsing this forum: No registered users and 2 guests