FASM - совмещение консоли и окна.

Тема в разделе "WASM.BEGINNERS", создана пользователем Rommel, 23 май 2009.

  1. Rommel

    Rommel New Member

    Публикаций:
    0
    Регистрация:
    23 май 2009
    Сообщения:
    6
    Задача стоит такая:
    При запуске появляется консоль, куда вводятся параметры. После этого консоль закрывается и появляется винапишное окно. Возможно ли это? Желательно с примером. Просто преподавателю необходимо продемонстрировать умение работы с прерываниями (т.е. консоль), а окошко нужно чтобы рисовать туда очень сложные художества. Собственно окно только для рисования нужно.
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    в винде не используются прерывания для вывода в консоль
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Консоль всеголишь текстовое окно которое csrss принадлежит и к ядру, темболее к прерываниям никакого отношения не имеет. Консольное - это обычное приложение.
     
  4. Rommel

    Rommel New Member

    Публикаций:
    0
    Регистрация:
    23 май 2009
    Сообщения:
    6
    неправильно выразился, в оьщем часть с прерываниями написана - нужно окно вызвать
     
  5. Rommel

    Rommel New Member

    Публикаций:
    0
    Регистрация:
    23 май 2009
    Сообщения:
    6
    в 1.asm работа с прерываниями, туда нужно интегрировать окно, которое будет вызываться после ввода параметров. Код с окном примерно такой
    Код (Text):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. start:    xor ebx,ebx
    4.       mov edi,wTitle
    5.       mov esi,400000h
    6.       ; +------------------------------+
    7.       ; | registering the window class |
    8.       ; +------------------------------+
    9.       invoke RegisterClass,esp,ebx,window_procedure,ebx,\
    10.       ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi
    11.       ; +--------------------------+
    12.       ; | creating the main window |
    13.       ; +--------------------------+
    14.       push ebx
    15.       push esi
    16.       push ebx
    17.       push ebx
    18.       shl esi,9
    19.       invoke CreateWindowEx,ebx,edi,edi,\
    20.       WS_OVERLAPPEDWINDOW+WS_VISIBLE+WS_OVERLAPPED,\
    21.       esi,esi,800,600
    22.       mov ebp,esp
    23.    ;+---------------------------+
    24.    ;| entering the message loop |
    25.    ;+---------------------------+
    26.    window_message_loop_start:
    27.       invoke GetMessage,ebp,ebx,ebx,ebx
    28.       invoke DispatchMessage,ebp
    29.       jmp window_message_loop_start
    30.    ;+----------------------+
    31.    ;| the window procedure |
    32.    ;+----------------------+
    33. window_procedure:
    34.     hWnd     equ ebp+8
    35.     uMsg     equ ebp+0xC
    36.     enter sizeof.PAINTSTRUCT,0
    37.          mov eax,[uMsg]
    38.          mov edi,[hWnd]
    39.          dec eax
    40.          dec eax; cmp uMsg,WM_DESTROY
    41.          je wmDESTROY
    42.          sub eax,WM_PAINT-WM_DESTROY; cmp uMsg,WM_PAINT
    43.          je wmPAINT
    44.          leave
    45.          jmp dword [DefWindowProc]
    46. wmDESTROY:  invoke ExitProcess,ebx
    47. wmPAINT: invoke BeginPaint,edi,esp
    48.     invoke Arc,dword[esp+32],50,80,519,220,69,122,64,174
    49.     invoke MoveToEx,dword[esp+12],69,122,ebx
    50.     invoke LineTo,dword[esp+8],130,78
    51.     invoke LineTo,dword[esp+8],248,4
    52.     invoke MoveToEx,dword[esp+12],64,174,ebx
    53.     invoke LineTo,dword[esp+8],121,215
    54.     invoke LineTo,dword[esp+8],250,297
    55.    
    56.     invoke MoveToEx,dword[esp+12],20,20,ebx
    57.     invoke LineTo,dword[esp+8],130,78
    58.    
    59.     invoke EndPaint,edi,esp
    60.    
    61. a1: leave
    62.     retn 0x10
    63. wTitle  db 'Мустафин ММ-494 F.Аппроксимация',0
    64.  
    65. data import
    66. library     KERNEL32, 'KERNEL32.DLL',\
    67.         USER32,   'USER32.DLL',\
    68.         GDI32,    'GDI32.DLL'
    69.    
    70.     import  KERNEL32,\
    71.         ExitProcess,        'ExitProcess'
    72.  
    73.     import  USER32,\
    74.         RegisterClass,      'RegisterClassA',\
    75.         CreateWindowEx,     'CreateWindowExA',\
    76.         DefWindowProc,      'DefWindowProcA',\
    77.         GetMessage,     'GetMessageA',\
    78.         DispatchMessage,    'DispatchMessageA',\
    79.         BeginPaint,     'BeginPaint',\
    80.         EndPaint,       'EndPaint'
    81.  
    82.     import  GDI32,\
    83.         Arc,           'Arc',\
    84.         MoveToEx,      'MoveToEx',\
    85.         LineTo,        'LineTo'
    86. end data
    В общем эти две части нужно совместить, чтобы сначала ввод - потом окно.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Покажите 1.asm
     
  7. Rommel

    Rommel New Member

    Публикаций:
    0
    Регистрация:
    23 май 2009
    Сообщения:
    6
    Извиняюсь, не прикрепил
    Код (Text):
    1. ;==============================================================
    2. ;============== Задача F.Аппроксимация ========================
    3. ;==============================================================
    4.  
    5. data segment
    6.     pkey     db "press any key...$"
    7.     winput   db "wrong input...$"
    8.     count    dw ?                   ;переменная - кол-во измерений
    9.     array    dw 100 dup (0)         ;массив измерений  
    10.     x        dw 100 dup (0)         ;массив абсцисс кривой
    11.     y        dw 100 dup (0)         ;массив ординат кривой
    12.     endl     db 0dh,0ah,'$'         ;перевод на другую строку
    13.     x1       dw 0
    14.     x2       dw 0  
    15.     y1       dw 0
    16.     y2       dw 0
    17.     min      dw 0
    18.     max      dw 0
    19.     min_calc dw 0
    20.     max_calc dw 0
    21.     index    dw 0
    22.     value    dw 0
    23. ends
    24.          
    25.          
    26.          
    27. stack segment
    28.     dw   128  dup(0)
    29. ends        
    30.  
    31.  
    32.  
    33. code segment
    34. start:
    35. ; set segment registers:
    36.     mov ax, data
    37.     mov ds, ax
    38.     mov es, ax
    39.  
    40.     ;-------------------------------------------------------------
    41.     ; ввод начальных параметров
    42.     ;-------------------------------------------------------------
    43.      
    44.     ;mov min,-5
    45.     ;mov max,5
    46.     ;mov min_calc,-3
    47.     ;mov max_calc,6
    48.     ;call AddIntervals
    49.    
    50.     ;ввод числа измерений
    51.     call ReadInteger      
    52.     mov count,ax
    53.     mov bx,count
    54.    
    55.     ;проверка значения числа измерений (д.б. от 2 до 40)
    56.     cmp count,2
    57.     jbe wrong_input
    58.     cmp count,40
    59.     jae wrong_input      
    60.    
    61.     ;переход на новую строку
    62.     mov ah,09h
    63.     lea dx,endl
    64.     int 21h
    65.    
    66.     ;ввод массива измерений
    67.     call ReadArray
    68.  
    69.     ;переход на новую строку
    70.     mov ah,09h
    71.     lea dx,endl
    72.     int 21h
    73.    
    74.     call GetLines
    75.    
    76.  
    77.    
    78.     ;-------------------------------------------------------------
    79.     ;выход и обработка ошибок
    80.     ;-------------------------------------------------------------  
    81.    
    82.     ;завершение работы
    83.     exit:
    84.     lea dx, pkey
    85.     mov ah, 9
    86.     int 21h        ;output string at ds:dx      
    87.     mov ah, 1      ;wait for any key....  
    88.     int 21h      
    89.     mov ax, 4c00h  ;exit to operating system.
    90.     int 21h
    91.    
    92.     ;при ошибке ввода выводим сообщение и завершаем работу
    93.     wrong_input:        
    94.     lea dx, winput
    95.     mov ah, 9
    96.     int 21h        ; output string at ds:dx
    97.     jmp exit  
    98.    
    99.      
    100.        
    101.        
    102. ;==============================================================
    103. ;============  Процедуры ======================================
    104. ;==============================================================
    105.        
    106.        
    107.     ;-------------------------------------------------------------
    108.     ;ВВОД ДЕСЯТИЧНОГО ЧИСЛА В AX
    109.     ;-------------------------------------------------------------
    110.     ReadInteger proc  
    111.         push    cx           ; сохранение регистров
    112.         push    bx
    113.         push    dx
    114.         xor     cx, cx  
    115.         mov     bx, 10
    116.         call    ReadChar     ; ввод первого символа
    117.  
    118.         cmp     al,'-'       ; если минус - ошибка ввода
    119.         je      wrong_input
    120.         jmp     not_minus
    121.  
    122.       read:  
    123.         call    ReadChar     ; ввод очередного символа
    124.      
    125.       not_minus:
    126.         cmp     al, 13       ; Enter ?
    127.         je      done         ; да -  > завершение
    128.    
    129.         sub     al, '0'      ; нет -> перевод цифры char -> int
    130.         xor     ah, ah  
    131.         xor     dx, dx  
    132.         xchg    cx, ax  
    133.         mul     bx  
    134.         add     ax, cx  
    135.         xchg    ax, cx  
    136.         jmp     read  
    137.       done:  
    138.         xchg    ax, cx  
    139.         pop     dx
    140.         pop     bx  
    141.         pop     cx
    142.         ret  
    143.     ReadInteger endp    
    144.    
    145.     ;-------------------------------------------------------------
    146.     ;ВВОД МАССИВА ЧИСЕЛ (РАЗДЕЛЕННЫХ ПРОБЕЛОМ) - array
    147.     ;-------------------------------------------------------------
    148.     ReadArray proc
    149.         push    cx            ; сохранение регистров
    150.         push    bx
    151.         push    dx
    152.         push    di
    153.         push    si
    154.         mov     di,-2
    155.         mov     si,-1
    156.       start_ra:
    157.         inc si
    158.         add di,2              ;увеличение индекса очередного элемента массива
    159.                
    160.         cmp si, count         ;проверка на превышение размера массива
    161.         je end_ra
    162.        
    163.         xor     cx, cx        
    164.         mov     bx, 10
    165.         call    ReadChar      ; ввод первого символа
    166.  
    167.         cmp     al,'-'        ; если минус - ошибка ввода
    168.         je      wrong_input
    169.         jmp     not_minus_ra
    170.  
    171.       read_ra:  
    172.         call    ReadChar      ; ввод очередного символа
    173.      
    174.       not_minus_ra:
    175.         cmp     al, ' '       ; Space ?
    176.         je      done_ra       ; да -  > завершение ввода числа
    177.        
    178.         cmp     al, 13        ; Enter ?
    179.         je      end_ra        ; да -  > завершение ввода
    180.    
    181.         sub     al, '0'       ; нет -> перевод цифры char -> int
    182.         xor     ah, ah  
    183.         xor     dx, dx  
    184.         xchg    cx, ax  
    185.         mul     bx  
    186.         add     ax, cx  
    187.         xchg    ax, cx  
    188.         jmp     read_ra
    189.          
    190.       done_ra:
    191.         xchg    array[di], cx
    192.         jmp     start_ra  
    193.        
    194.       end_ra:
    195.         xchg    array[di], cx
    196.         pop     si
    197.         pop     di
    198.         pop     dx
    199.         pop     bx  
    200.         pop     cx
    201.         ret    
    202.     ReadArray endp
    203.    
    204.     ;-------------------------------------------------------------
    205.     ;ВВОД ОДНОГО СИМВОЛА  
    206.     ;-------------------------------------------------------------
    207.     ReadChar proc  
    208.         mov     ah,1
    209.         int     21h
    210.         ret  
    211.     ReadChar endp
    212.    
    213.    
    214.    
    215.     ;-------------------------------------------------------------
    216.     ;РАСЧЕТ АБСЦИСС ТОЧЕК КРИВОЙ
    217.     ;-------------------------------------------------------------
    218.     GetLines proc
    219.         push ax             ;сохранение регистров
    220.         push bx
    221.         push cx
    222.         push dx
    223.         push di
    224.         push si  
    225.        
    226.         mov  ax,count       ;кол-во итераций  
    227.         sub  ax, 1          ;для цикла
    228.         mov  cx, ax         ;равно count-1
    229.        
    230.         mov  di, 0          ;индексы для извлечения из array
    231.         mov  si, 2          
    232.         mov  x1, 1          
    233.         mov  x2, 2
    234.        
    235.         mov  index,-2       ;устанавливаем переменные для добавления точек
    236.         mov  value,1
    237.         ;call AddX
    238.                
    239.         L:                  ;цикл для расчета точек кривой
    240.        
    241.         ;cчитаем пересечение (x1,y1)(x2,y2+1)c Y
    242.         mov  sp, array[di]
    243.         mov  bx, array[si]  
    244.         mov  y1, sp
    245.         mov  y2, bx
    246.         inc  y2             ;y2 = y2+1
    247.         call CalculateY
    248.         mov  max_calc,ax    
    249.        
    250.         ;cчитаем пересечение (x1,y1+1)(x2,y2)c Y
    251.         inc  y1
    252.         dec  y2
    253.         call CalculateY
    254.                
    255.         ;определяем интервал min,max
    256.         mov  min_calc,ax
    257.         cmp  max_calc,ax
    258.         jnle not_replace
    259.         jng  replace        
    260.        
    261.         replace:
    262.         mov  bx,max_calc
    263.         mov  max_calc,ax
    264.         mov  min_calc,bx
    265.        
    266.         not_replace:
    267.        
    268.         ;проверяем отрезок - первый?  (min==0 && max==0)
    269.         cmp  min,0
    270.         je   a
    271.         jne  not_first
    272.         a:
    273.         cmp  max,0
    274.         je   first
    275.         jne  not_first
    276.        
    277.         ;если первый - устанавливаем max, min
    278.         first:        
    279.         mov  ax, max_calc
    280.         mov  max, ax
    281.         mov  ax, min_calc
    282.         mov  min, ax
    283.         jmp  add_point
    284.        
    285.         not_first:
    286.         ;определяем пересечение интервалов
    287.         call AddIntervals
    288.         ;если интервалы не пересекаются, добавляем точку к ломаной
    289.         cmp  min,0
    290.         je   b
    291.         jne  end_iteration
    292.         b:
    293.         cmp  max,0
    294.         je   add_point
    295.         jne  end_iteration
    296.        
    297.        
    298.         add_point:
    299.         add  index,2
    300.         call AddX
    301.        
    302.        
    303.         end_iteration:
    304.         add  di,2           ;увеличиваем счетчики
    305.         add  si,2
    306.         inc  x1
    307.         inc  x2
    308.         inc  value
    309.                
    310.         loop L              ;конец цикла
    311.        
    312.         add  index,2        ;добавляем к ломаной последнюю точку
    313.         call AddX
    314.        
    315.         pop  si
    316.         pop  di
    317.         pop  dx
    318.         pop  cx
    319.         pop  bx
    320.         pop  ax        
    321.         jmp  exit
    322.         ;ret
    323.     GetLines endp
    324.    
    325.    
    326.     ;-------------------------------------------------------------
    327.     ;x1,x2,y1,y2(x2=x1+1)- две точки через которые проходит прямая
    328.     ;вычисляем в AX ординату пересечения прямой и оси Y
    329.     ;-------------------------------------------------------------
    330.     CalculateY proc                    
    331.         push cx            ;сохранение регистров
    332.         push bx
    333.        
    334.         mov  ax,x2
    335.         mul  y1
    336.         mov  bx,ax         ;bx = y1*x2
    337.              
    338.         mov  ax,y2
    339.         mul  x1
    340.         mov  cx,ax         ;cx = x1*y2
    341.        
    342.         sub  bx,cx         ;bx = y1*x2 - y2*x1
    343.         mov  ax,bx                  
    344.        
    345.         pop  bx
    346.         pop  cx
    347.         ret  
    348.     CalculateY endp
    349.    
    350.    
    351.     ;-------------------------------------------------------------
    352.     ;ДОБАВЛЕНИЕ value В x[index]  
    353.     ;-------------------------------------------------------------
    354.     AddX proc  
    355.         push di
    356.         push ax
    357.        
    358.         mov  di,index
    359.         mov  ax,value
    360.         mov  x[di],ax
    361.        
    362.         pop  ax
    363.         pop  di
    364.         ret  
    365.     AddX endp  
    366.    
    367.    
    368.     ;-------------------------------------------------------------
    369.     ; [min;max] U [min_calc;max_calc] - пересечение
    370.     ; Если рез-т нулевой, то max=0, min=0  
    371.     ;-------------------------------------------------------------
    372.     AddIntervals proc  
    373.         push ax
    374.         push bx
    375.        
    376.         ;gпроверка на то, что интервалы не пересекаются
    377.         mov  ax,max_calc
    378.         cmp  ax,min
    379.         jng  zero_ai
    380.        
    381.         mov  ax,min_calc
    382.         cmp  ax,max
    383.         jnl  zero_ai        
    384.        
    385.         ;если max_calc < max => max = max_calc
    386.         mov  ax, max_calc
    387.         cmp  ax, max
    388.         jnge less
    389.         jmp  min_check
    390.        
    391.         less:
    392.         mov  bx, max_calc
    393.         mov  max, bx
    394.        
    395.         ;если min_calc > min => min = min_calc
    396.         min_check:
    397.         mov  ax, min_calc
    398.         cmp  ax, min
    399.         jnle more
    400.         jmp  end_ai
    401.        
    402.         more:
    403.         mov  bx, min_calc
    404.         mov  min, bx
    405.        
    406.         end_ai:
    407.         pop  bx
    408.         pop  ax
    409.         ret
    410.        
    411.         ;интервалы не пересекаются
    412.         zero_ai:
    413.         mov  max,0
    414.         mov  min,0
    415.         pop  bx
    416.         pop  ax
    417.         ret
    418.          
    419.     AddIntervals endp
    420.    
    421.    
    422. ends
    423.  
    424.  
    425. end start ; set entry point and stop the assembler.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Это эмулятор доса(ntvdm), GUI не поддерживается. Нужно два процесса создавать, первый - враппер который запустит ntvdm и создаст GUI-окно.
     
  9. Rommel

    Rommel New Member

    Публикаций:
    0
    Регистрация:
    23 май 2009
    Сообщения:
    6
    Если кто-нибудь поделится реализацией алгоритма Брезенхэма или просто процедурой отрисовки линии между двумя точками, то очень мне поможет. А то пока не нагуглил ничего. :)
     
  10. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Только на MASMе.
    Когда-то, давно игрался. Отрабатывал алгос, на AVR нужно было написать прогу для работы с графикой на LCD.

    Код (Text):
    1. ;
    2. ;BrezLineCreate                     PROTO   :DWORD,:DWORD,:DWORD,:DWORD
    3. ;BrezLineFree                       PROTO   :DWORD
    4. ;BrezLineGetPixel                   PROTO   :DWORD
    5. ;BrezLineNextPixel                  PROTO   :DWORD
    6. ;
    7. BREZLINE    STRUCT
    8. X       DD  ?
    9. Y       DD  ?
    10. delta_x DD  ?
    11. delta_y DD  ?
    12. XErr    DD  ?
    13. YErr    DD  ?
    14. incX    DD  ?
    15. incY    DD  ?
    16. delta   DD  ?
    17. BREZLINE ends
    18. .code
    19.  
    20. BrezLineCreate   proc USES EBX x_1:DWORD,y_1:DWORD,x_2:DWORD,y_2:DWORD
    21.  
    22.     invoke  GetProcessHeap
    23.  
    24.     invoke  HeapAlloc,eax,HEAP_ZERO_MEMORY,sizeof BREZLINE
    25. ;   push    eax
    26.     ;
    27.     mov     ebx,                [x_1]
    28.     mov     [eax+BREZLINE.X],   ebx
    29.     mov     ebx,                [y_1]
    30.     mov     [eax+BREZLINE.Y],   ebx
    31.  
    32.     xor     ebx,                ebx
    33.     mov     [eax+BREZLINE.XErr],ebx
    34.     mov     [eax+BREZLINE.YErr],ebx
    35.     mov     [eax+BREZLINE.incX],ebx
    36.     mov     [eax+BREZLINE.incY],ebx
    37.  
    38.  
    39.     mov     ebx,                    [x_2]
    40.     sub     ebx,                    [x_1]
    41.     mov     [eax+BREZLINE.delta_x], ebx
    42.     .if SIGN?
    43.         neg     [eax+BREZLINE.delta_x]
    44.         dec     [eax+BREZLINE.incX]     ;mov    incX,   -1
    45.     .elseif ZERO?
    46.         ;nop                            ;mov    incX,   0
    47.     .else
    48.         inc [eax+BREZLINE.incX]     ;mov    incX,   1
    49.     .endif
    50.  
    51.  
    52.     mov     ebx,                    [y_2]
    53.     sub     ebx,                    [y_1]
    54.     mov     [eax+BREZLINE.delta_y], ebx
    55.     .if SIGN?
    56.         neg     [eax+BREZLINE.delta_y]
    57.         dec     [eax+BREZLINE.incY]     ;mov    incX,   -1
    58.     .elseif ZERO?
    59.         ;nop                            ;mov    incX,   0
    60.     .else
    61.         inc     [eax+BREZLINE.incY]     ;mov    incX,   1
    62.     .endif
    63.  
    64.  
    65.     mov     ebx,    [eax+BREZLINE.delta_x]
    66.     .if ebx > [eax+BREZLINE.delta_y]
    67.         ;mov    [eax+BREZLINE.delta],ebx
    68.     .else
    69.         mov     ebx,    [eax+BREZLINE.delta_y]
    70.     .endif
    71.         mov     [eax+BREZLINE.delta],   ebx
    72.  
    73.     ;
    74. ;   pop     eax
    75.     ret
    76. BrezLineCreate endp
    77.  
    78. BrezLineFree    proc    hBrzLine:DWORD
    79.     invoke  GetProcessHeap
    80.     invoke  HeapFree,eax,NULL,[hBrzLine]
    81.     ret
    82. BrezLineFree endp
    83.  
    84. BrezLineNextPixel   proc    USES esi    hBrzLine:DWORD
    85.     mov     esi,    [hBrzLine]
    86.  
    87.     mov     eax,    [esi+BREZLINE.delta_x]
    88.     add     eax,    [esi+BREZLINE.XErr]
    89.     .if eax > [esi+BREZLINE.delta]
    90.         sub     eax,                    [esi+BREZLINE.delta]
    91.         mov     [esi+BREZLINE.XErr],    eax
    92.         mov     eax,                    [esi+BREZLINE.incX]
    93.         add     [esi+BREZLINE.X],       eax
    94.     .else
    95.         mov     [esi+BREZLINE.XErr],    eax
    96.     .endif
    97.  
    98.     mov     eax,    [esi+BREZLINE.delta_y]
    99.     add     eax,    [esi+BREZLINE.YErr]
    100.     .if eax > [esi+BREZLINE.delta]
    101.         sub     eax,                    [esi+BREZLINE.delta]
    102.         mov     [esi+BREZLINE.YErr],    eax
    103.         mov     eax,                    [esi+BREZLINE.incY]
    104.         add     [esi+BREZLINE.Y],       eax
    105.     .else
    106.         mov     [esi+BREZLINE.YErr],    eax
    107.     .endif
    108.  
    109.     ;dec        [esi+BREZLINE.delta]
    110.     mov     eax,    [esi+BREZLINE.delta]
    111.     ret
    112.  
    113. BrezLineNextPixel endp
    114.  
    115. BrezLineGetPixel    proc    USES esi    hBrzLine:DWORD
    116.     mov     esi,    [hBrzLine]
    117.     mov     eax,    [esi+BREZLINE.Y]
    118.     shl     eax,    16
    119.     mov     ax,     word ptr [esi+BREZLINE.X]
    120.     ret
    121. BrezLineGetPixel endp
    Должно работать.
     
  11. Rommel

    Rommel New Member

    Публикаций:
    0
    Регистрация:
    23 май 2009
    Сообщения:
    6
    Задам вопрос здесь, чтобы не плодить темы.
    Мне нужно воспользоватся сопроцессором. Я написал такой код:
    Код (Text):
    1. ; multi-segment executable file template.
    2.  
    3. data segment
    4.     ; add your data here!
    5.     pkey db "press any key...$"
    6. ends
    7.  
    8. stack segment
    9.     dw   128  dup(0)
    10. ends
    11.  
    12. code segment
    13. start:
    14. ; set segment registers:
    15.     mov ax, data
    16.     mov ds, ax
    17.     mov es, ax
    18.  
    19.     ; add your code here
    20.     finit
    21.            
    22.     lea dx, pkey
    23.     mov ah, 9
    24.     int 21h        ; output string at ds:dx
    25.    
    26.     ; wait for any key....    
    27.     mov ah, 1
    28.     int 21h
    29.    
    30.     mov ax, 4c00h ; exit to operating system.
    31.     int 21h    
    32. ends
    33.  
    34. end start ; set entry point and stop the assembler.
    Это сгенерированный код, я добавил только finit И получил ошибку такого содержания
    Код (Text):
    1. (20) illegal instruction: finit or wrong parameters.
    Нашел пример на фасме, в котором используется сопроцессор. там указывается
    Код (Text):
    1. format PE
    Запустил этот пример, все работает. Но мне не надо format PE. Мне нужно просто заюзать сопроцессор.