Динамический массив

Тема в разделе "WASM.ASSEMBLER", создана пользователем murtix, 21 янв 2005.

  1. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    Объявил массив :

    .data?

    X dq 5000 dup (?)

    Y dq 5000 dup (?)

    Далее в процедуре которая вызывается нажатием кнопки из отдельного диалога заполняю эти массивы

    (процедура вычисления и процедура диалога находятся в отдельном ML.inc файле

    .code

    include ML.inc

    start:

    .............)

    Затем в обработчике WM_PAINT рисую кривую по данным точкам точнее пытаюсь :
    Код (Text):
    1.  
    2. ML_Func proc
    3.     mov   ecx, Count
    4.     fld   b
    5.     fld   a
    6.     fsub
    7.     fild  Count
    8.     fdiv
    9.     fst   h
    10.     fldz
    11.     fst   X[0]
    12.     fld   st
    13.     fsin
    14.     fstp  Y[0]
    15.     push  edi
    16.     xor   edi, edi
    17.     inc   edi
    18.  @loop:
    19.     fadd  st, st(1)
    20.     fst   X[edi]      
    21.     fld   st
    22.     fsin           ; пока здесь просто синус
    23.     fstp  Y[edi]   
    24.     inc   edi
    25.     loop  @loop
    26.     inc   Calc
    27.     pop   edi
    28.     ret
    29. ML_Func endp
    30.  


    здесь все в порядке под дебуггером смотрел Count=0 пока
    Код (Text):
    1.  
    2. Paint_Canvas proc
    3.     LOCAL hGraphics:DWORD
    4.     LOCAL hBrush:DWORD
    5.     LOCAL hPen:DWORD
    6.     LOCAL x1 : DWORD
    7.     LOCAL y1 : DWORD
    8.     LOCAL x2 : DWORD
    9.     LOCAL y2 : DWORD
    10.     jmp   @a
    11.     SX dd 200
    12.     SY dd 200
    13. @a:
    14.     invoke GdipCreateFromHDC,hDc,ADDR hGraphics
    15.     invoke GdipCreateSolidFill, ColorsNavy, addr hBrush
    16.     invoke GdipFillRectangleI, hGraphics, hBrush, r.left, r.top, r.right, r.bottom
    17.     invoke GdipCreatePen1, ColorsYellow, wi1,UnitWorld,ADDR hPen
    18.     invoke MessageBox,hWnd,addr AboutMsg,addr AppName,MB_OK
    19.     .if  Calc != 0
    20.         xor    eax, eax
    21.         mov    x1,  eax
    22.         mov    y1,  eax
    23.         mov    ecx, 100
    24.         dec    ecx
    25.         push   edi
    26.         xor    edi, edi
    27.         finit
    28.     @loop:
    29.         fld    X[edi]
    30.         fmul   SX
    31.         frndint
    32.         fstp   x2
    33.         fld    Y[edi]
    34.         fmul   SY
    35.         frndint
    36.         fstp   y2
    37.         inc    edi
    38.         push   ecx
    39.         invoke GdipDrawLineI,hGraphics,hPen,x1,y1,x2, y2
    40.         pop    ecx
    41.         push   x2
    42.         pop    x1
    43.         push   y2
    44.         pop    y1
    45.         loop   @loop
    46.         pop    edi
    47.     .endif
    48.     ;invoke MessageBox,hWnd,addr AboutMsg,addr AppName,MB_OK
    49.     invoke GdipDeleteBrush,hBrush  
    50.     invoke GdipDeletePen,hPen
    51.     invoke GdipDeleteGraphics,hGraphics
    52.     ret
    53. Paint_Canvas endp
    54.  


    А здесь в .if ... .endif не работает т.е. из x,y какая-то хрень вылезает совсем не график функции синус

    что не так?
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    не понятно, в каком месте вызывается ML_func, которая делает inc Calc, которую использует .if ... .endif
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    murtix >




    IMHO не всё:







    Размер элемента qword, так что нужно или так:



    fst X[edi*8]



    или



    add edi, 8



    вместо



    inc edi
     
  4. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    Спасибо S_T_A_S_ типичная ошибка новичка.

    Вообще я думал, что если я объвил как dq, то компилятор все сам сделает (привык понимаешь-ли в дельфях :).

    >shoo

    Понимаешь ML_func вызывается из другого диалога и делает

    inc Calc

    ...

    .data

    Calc dd 0

    ...

    мол значения вычислены, а Paint_Canvas проверяет вычислено или нет
     
  5. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    я потом уже сам догадался ;)