[ Assembler ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by !_filin_!, 25 May 2007.

  1. JoeBlanc

    JoeBlanc New Member

    Joined:
    29 Oct 2010
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Пожалуйста распишите что значат строчки.Буду очень благодарен.

    #include <stdio.h>
    #include <malloc.h>
    #include <math.h>
    int main()
    {
    FILE *f,*g;
    unsigned n,e,i,j,k;
    char name1[50],
    name2[50];
    printf("Name of the input file? ");
    gets(name1);
    if((f=fopen(name1,"r"))==NULL)
    {
    printf("\nThe program can not find this file :( \n");
    getchar();
    exit(1);
    }
    printf("Name of the output file? ");
    gets(name2);
    g=fopen(name2,"w");
    n=0;
    while(!feof(f))
    {
    fscanf(f,"%u",&e);
    j=2; i=round(sqrt(e));
    while(e%j&&j<=i)j++; if(j>i&&i>1)
    {
    n++; fprintf(g,"%u ",e);
    }
    }
    fclose(f);
    fclose(g);
    unsigned *a=(unsigned *)malloc(n*sizeof(unsigned));
    g=fopen(name2,"r");
    for(j=0;j<n;j++)
    fscanf(g,"%u",&a[j]);
    fclose(g);
    for(i=1;i<n;i++)
    for(j=1;j<n;j++)
    if(a[j]>a[j-1])
    {
    k=a[j-1];a[j-1]=a[j];a[j]=k;
    }
    g=fopen(name2,"w");
    for(j=0;j<n;j++)
    fprintf(g,"%u ",a[j]);
    free(a);
    fclose(g);
    return 0;
    }
     
  2. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    А вот ниже у него там не Ret идет? Бред говорите.
     
  3. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    GRRRL Power, к чему эти слова? Скомпилируйте код, предоставленный maked0n, и скомпилируйте с "моим бредом", а потом будете говорить. Я очень редко советую "на глаз". Если вам удастся вывести окно без моего ret, я сниму перед вами шляпу.
    Как вы могли заметить, перед ret, в который вы формально ткнули меня носом, стоит очистка регистра eax (xor eax,eax), а значит результат функции DefWindowProc просто затрется нулем.
    Прежде чем делать такие заявления, пожалуйста, проверяйте на практике.

    Code:
    WndProc proc hWnd:DWORD, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    .IF uMsg==WM_DESTROY
    	invoke PostQuitMessage,NULL
    .ELSE
    	invoke DefWindowProc,hWnd, uMsg, wParam, lParam
    	ret
    .ENDIF
    
    [COLOR=Red][B]xor eax, eax[/B][/COLOR]
    
    	Ret
    WndProc EndP
     
    #883 Sams, 13 Mar 2011
    Last edited: 13 Mar 2011
  4. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Ну так тогда и надо было написать "уберите обнуление eax", а не "ставьте лишний ret".
     
  5. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    GRRRL Power, вы абсолютно не правы, и сейчас попросту пытаетесь показать меня с плохой стороны.
    Я повторюсь, проверяйте на практике. Попробуйте убрать xor eax,eax и ret после.

    Code:
    WndProc proc hWnd:DWORD, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    .IF uMsg==WM_DESTROY
    	invoke PostQuitMessage,NULL
    .ELSE
    	invoke DefWindowProc,hWnd, uMsg, wParam, lParam
    	ret
    .ENDIF
    WndProc EndP
    и при закрытии окна вы получите ошибку, т.е. программа завершится некорректно.

    xor eax,eax и ret там обязательны ровно так же, как и ret после функции DefWindowProc. Это стандартный шаблон процедуры обработки окна. Нарушение этого минимума приведет к ошибке.
     
    #885 Sams, 13 Mar 2011
    Last edited: 13 Mar 2011
  6. elite

    elite New Member

    Joined:
    6 Mar 2011
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    JoeBlanc, не в ту тему пишешь. пиши в С\С++
     
  7. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Sams, я говорил только лишь о том, чтобы убрать "xor eax,eax", а ret перед "WndProc EndP" оставить.
     
  8. Catbert

    Catbert Banned

    Joined:
    29 Jun 2010
    Messages:
    80
    Likes Received:
    27
    Reputations:
    10
    Sams, успокойся, все уже поняли, что ты эталон для любого человека, который программирует на ассемблере. Знания других меркнут в свете твоих и каждая твоя фраза является беспрекословной абсолютной истиной.
    Но ты ведь растрачиваешь свой талант попусту, общаясь на этом форуме со всякой "чернью", которые не в состоянии постичь и доли твоих великих знаний.
    Бросай это недостойное занятие и продолжай творить божественный код вне стен этого форума, собравшиеся здесь обречены на вечные безуспешные попытки постичь величественную простоту и эффективность твоих решений и высказываний.
     
  9. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Вообще-то вы утверждали, что я поставил лишний ret, а не что надо просто убрать xor eax,eax.

    Если вы считаете, что там лишний xor eax,eax, то тут вам надо спорить с туториалам Iczelion'a, а еще книгой "Самоучитель Ассемблер" Александр Крупник. Они решили именно так, и я не думаю, что зря.
    После завершения процедуры обработки окна, выполняется кусок кода

    Code:
    invoke ExitProcess,eax
    значит есть ситуации, в которых в eax может оказаться какая нибудь ерунда, по этому и делают обнуление.

    Я думаю не стоит развивать столь мизерную тему. Во всех книгах стандартный шаблон процедуры обработки окна выглядит именно так, как я написал. Если хотите делать иначе - пожалуйста. Просто не стоит критиковать других.

    Я лишь указал человеку на его ошибку так, как это изложил Iczelion, потому что именно по этому материалу он и изучал.
    А вы бы в свою очередь могли выложить свой вариант, чего вы не сделали, а раскритиковали мой работоспособный вариант, в котором возможно и написано 3 байта лишнего кода. Очень умно.
     
    #889 Sams, 13 Mar 2011
    Last edited: 13 Mar 2011
  10. Catbert

    Catbert Banned

    Joined:
    29 Jun 2010
    Messages:
    80
    Likes Received:
    27
    Reputations:
    10
    .BREAK .IF (!eax)
    ....
    mov eax,msg.wParam
    ....
    invoke ExitProcess,eax
     
  11. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    еще вопрос)
    почему не отображается меню? что я пропустил в коде? просто окно без меню(
    .asm:
    Code:
     .386
    .model flat,stdcall
    option casemap:none
    
    include windows.inc
    include user32.inc
    include kernel32.inc
    includelib user32.lib
    includelib kernel32.lib
    
    WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    
    .DATA
    
    ClassName db "WINDOW",0
    AppName db "MASM",0
    MenuName db "First menu", 0
    
    Test_string db "You selected test menu item", 0
    Hello_string db "Hello, my friend!", 0
    Goodbye_string db "See you again, bye", 0
    
    .DATA?
    hInstance HINSTANCE ?
    CommandLine LPSTR ?
    hMenu HMENU ?
    
    .CONST
    
    IDM_TEST equ 1
    IDM_HELLO equ 2
    IDM_GOODBYE equ 3
    IDM_EXIT equ 4
    
    .CODE
    start:
    
    
    
    invoke GetModuleHandle, NULL
    mov hInstance,eax
    invoke GetCommandLine
    
    mov CommandLine,eax
    invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    invoke ExitProcess, eax
    
    WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    
        .IF uMsg==WM_DESTROY
            invoke PostQuitMessage,NULL
        .ELSEIF uMsg==WM_COMMAND
        	mov eax, wParam
        	.IF ax==IDM_TEST
        		invoke MessageBox,NULL, ADDR Test_string, OFFSET AppName, MB_OK
        	.ELSEIF ax==IDM_HELLO
        		invoke MessageBox,NULL, ADDR Hello_string, OFFSET AppName, MB_OK
        	.ELSEIF ax==IDM_GOODBYE
        		invoke MessageBox,NULL, ADDR Goodbye_string, OFFSET AppName, MB_OK
        	.ELSE
        		invoke DestroyWindow,hWnd
        	.ENDIF 
        .ELSE
            invoke DefWindowProc,hWnd,uMsg,wParam,lParam
            ret
        .ENDIF
        xor eax,eax
    
        ret
    WndProc endp
    
    WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,  CmdShow:DWORD
        LOCAL wc:WNDCLASSEX
        LOCAL msg:MSG
        LOCAL hwnd:HWND
    
    
        mov   wc.cbSize,SIZEOF WNDCLASSEX
        mov   wc.style, CS_HREDRAW or CS_VREDRAW
        mov   wc.lpfnWndProc, OFFSET WndProc
        mov   wc.cbClsExtra,NULL
        mov   wc.cbWndExtra,NULL
        push  hInstance
        pop   wc.hInstance
        mov   wc.hbrBackground,COLOR_WINDOW+1
        mov   wc.lpszMenuName,OFFSET MenuName
        mov   wc.lpszClassName,OFFSET ClassName
        invoke LoadIcon,NULL,IDI_APPLICATION
        mov   wc.hIcon,eax
        mov   wc.hIconSm,eax
        invoke LoadCursor,NULL,IDC_ARROW
        mov   wc.hCursor,eax
    
        invoke RegisterClassEx, addr wc
        invoke LoadMenu,hInst, OFFSET MenuName
        mov hMenu, eax
        invoke CreateWindowEx,NULL,\
                    ADDR ClassName,\
                    ADDR AppName,\
                    WS_OVERLAPPEDWINDOW,\
                    CW_USEDEFAULT,\
                    CW_USEDEFAULT,\
                    CW_USEDEFAULT,\
                    CW_USEDEFAULT,\
                    NULL,\
                    hMenu,\
                    hInst,\
                    NULL
        mov   hwnd,eax
        invoke ShowWindow, hwnd,SW_SHOWNORMAL
        invoke UpdateWindow, hwnd
    
        .WHILE TRUE
                    invoke GetMessage, ADDR msg,NULL,0,0
                    .BREAK .IF (!eax)
    
                    invoke TranslateMessage, ADDR msg
                    invoke DispatchMessage, ADDR msg
       .ENDW
        mov     eax,msg.wParam
        ret
    
    WinMain endp
    
    
    
    
    end start
    .rc:
    Code:
    #define IDM_TEST 1
    #define IDM_HELLO 2
    #define IDM_GOODBYE 3
    #define IDM_EXIT 4
    
    FirstMenu MENU
    {
    	POPUP "&PopUp"
    	{
    		MENUITEM "&Say hello", IDM_HELLO
    		MENUITEM "Say &goodbye", IDM_GOODBYE
    		MENUITEM SEPARATOR
    		MENUITEM "E&xit", IDM_TEST
    	}
    	MENUITEM "&Test", IDM_TEST
    }
     
  12. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    как ты линкуешь?у меня все работает
     
    #892 DooD, 14 Mar 2011
    Last edited: 14 Mar 2011
  13. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    хм..... ну я через WinAsm Studio жму SHIFT+F7)

    вот вроде в свойствах нашел:
    /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0
     
  14. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    а как надо?
     
  15. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    можешь скачать мою mini IDE тут на ачате.надо создавать файл ресурсов с помощью rc.exe (тоесть с rc делаем res) и линковщиком его прилинковывать. в моей проге есть такое.
    выглядит примерно так
    poasm.exe srcfile.asm
    rc. exe /v rsrc.rc
    polink.exe /subsystem:windows srcfile.obj rsrc.res
    я пользуюсь pelle's macro assembler-ом
     
    #895 DooD, 14 Mar 2011
    Last edited: 14 Mar 2011
  16. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    скинь пожалуйста, а то найти не могу(
     
  17. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    прошу http://forum.antichat.ru/thread261755.html
    имя файла ресурсов обязательно rsrc.rc
     
  18. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    вся проблема в том, что он уже вроде как должен быть прилинкован
     
  19. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    но у меня же в моей среде пашет:)попробуй сначала.Если не хочешь так,создай просто батник как я выше написал.
     
    #899 DooD, 14 Mar 2011
    Last edited: 14 Mar 2011
  20. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    буду очень благодарен за перезаливку куда-нибудь, а то letitbit error выдает, а та ссылка на zalil.ru здохла(

    а как у тебя в среде прилинковать?
     
    #900 maked0n, 14 Mar 2011
    Last edited by a moderator: 5 Jul 2011