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

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

  1. Nelz.

    Nelz. Member

    Joined:
    2 Aug 2010
    Messages:
    151
    Likes Received:
    7
    Reputations:
    0
    делает он комманду (или) как и на всех языках

    Для выполнения логического или булевого 'или' двух логических значений. Если любой истинен, то результат истинен, иначе ложный.

    гуглите примеров много
     
  2. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0
    плиз скиньте пример на асме или на бантике ,удаление файла по времени допустим удалить файл на c:\через два месяца после запуска
     
  3. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    такой вопрос,как сделать чтобы допустим каждые 10 сек.запускался определенный файл,пытался сделать через settimer не получилось,файл запустился раз и все.кто знает подскажите
     
  4. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    У меня такой вопрос - как можно сделать на Fasm/Masm чтобы программа получал простейшие команды из сайта? Например, есть сайт ххх.ком, на нем файл 1.txt, с какой-то строкой. Как сделать, дабы моя программа зашла в этот файл, и вывела его содержимое через msgbox?
    Хотелось бы понять сам принцип, может есть готовые примеры или какие нужны апи функции? В теории, я понимаю это так: lpText функции мессаджебокс идет в "неинициализованные данные" (.data?), потом ей каким-то образом надо передать то, что в текстовом файле, что она и выведет на экран. Но как это осуществить - хз.

    Если вопрос противоречит каким-то правилам форума, то прошу прощения.
     
  5. foozzi

    foozzi Member

    Joined:
    13 Apr 2010
    Messages:
    195
    Likes Received:
    12
    Reputations:
    5
    насколько я знаю это массив, может в асме он подругому кличется, но сам факт ищи как подключить массив в asm
     
  6. foozzi

    foozzi Member

    Joined:
    13 Apr 2010
    Messages:
    195
    Likes Received:
    12
    Reputations:
    5


    Code:
    CSEG segment
    org 100h
    Begin:
    mov ah,9
    mov dx,offset Message
    int 21h
    int 20h
    Message db 'Hello, world$'
    CSEG ends
    end Begin 
    не забывай про org этот оператор определяет с какого места отсчитывать смещение
     
    #866 foozzi, 15 Feb 2011
    Last edited: 15 Feb 2011
  7. Tor Bel

    Tor Bel New Member

    Joined:
    13 Dec 2008
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Раз Masm, стало быть Windows. Почитайте про работу с winsock.
     
  8. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Flisk,

    Тут чистая работа с winsock + спецификация HTTP протокола (GET, POST запросы).
    http://ru.wikipedia.org/wiki/HTTP - примеры запросов.

    Создаем сокет, работающий по протоколу TCP. Подключаемся через него на сайт, указав IP, на 80-ый порт. После установки соединения, формируем специальный HTTP пакет, который в ответ вернет нам содержание файла 1.txt, а так же HTTP заголовок.

    Далее всё зависит от хорошего знания ASM. "Отрезаем" HTTP заголовок от содержимого 1.txt, заносим это дело в буфер, адрес которого передаем в параметр API функции MessageBoxA, и выводим на экран.

    В общем для начала учись работать с socket'ами - устанавливать соединение, принимать и отправлять данные. А за спецификацию протокола HTTP уже потом берись.
     
    #868 Sams, 23 Feb 2011
    Last edited: 23 Feb 2011
  9. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    Добрый вечер. Недавно начал осваивать Ассемблер (masm32), натолкнулся на небольшую проблему. Написал функцию для вывода числа:
    Code:
    PrintValue proc pNumber, pBuffer, pFmt
    	
    	sub esp, 8
    	invoke GetStdHandle, STD_OUTPUT_HANDLE
    	mov [ebp-4], eax
    	invoke wsprintf, pBuffer, [pFmt], [pNumber]
    	invoke WriteConsole, [ebp-4], pBuffer, sizeof [pBuffer], ADDR [ebp-8], 0
    	ret 12
    
    PrintValue endp
    
    
    Она не работает. Если в WriteConsole sizeof [pBuffer] поменять на sizeof szBuffer (это имя фактической переменной), то все будет норм, но выводит другие числа, т.к. в wsprintf использовал [pNumber] (аналогично, если [pNumber] заменить на фактическую переменную nNumber, все будет работать). Все аргументы в функию передаются по адресу, я хочу чтобы обращаться можно было к переменным по адресу, а не по значению. Полный код программы:
    Code:
    .486
    .model flat,stdcall
    option casemap:none
    
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
    
    PrintValue proto :DWORD, :DWORD, :DWORD
    
    .data
    nStdout dd ?
    szFmt db "%d",00h
    nWritten dd ?
    szBuffer db 4 dup(?)
    nNum dd 1024
    
    .code
    start:
    
    invoke PrintValue, ADDR nNum, ADDR szBuffer, ADDR szFmt
    
    invoke ExitProcess, 0
    
    PrintValue proc pNumber, pBuffer, pFmt
    	
    	sub esp, 8
    	invoke GetStdHandle, STD_OUTPUT_HANDLE
    	mov [ebp-4], eax
    	invoke wsprintf, pBuffer, [pFmt], [pNumber]
    	invoke WriteConsole, [ebp-4], pBuffer, sizeof [pBuffer], ADDR [ebp-8], 0
    	ret 12
    
    PrintValue endp
    
    end start
    
    В чем проблема?
     
  10. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    SHiNiGaMi, добрый. Катастрофически много ошибок. Скажите лучше что вы хотите, что бы ваша программа делала, тогда будет проще помочь. Да и метод вы выбрали совсем не рациональный. Сами себя запутали.

    1. Внутренние функции не нуждаются в объявлении прототипа.
    2. Зачем вы в функции делаете такие громоздкие методы, используя [ebp+...]? За вас это может делать компилятор. Всего лишь достаточно обращаться к переданным данным через имена.
    3. nNum dd 1024 - здесь 1024 по умолчанию будет воспринято в 16-ой системе счисления, что в десятичной равно 4132. А я так подозреваю, что вы хотели записать 1024 в десятичной. Потому в конце нужно добавить "d" - 1024d.
    5. Вычисляя размер через sizeof не нужно ставить квадратные скобки. Через квадратные скобки происходит работа с данными по адресу.

    Ну это так, "на глаз" прикинул. Есть еще пара нюансов.
     
    #870 Sams, 7 Mar 2011
    Last edited: 7 Mar 2011
  11. GRRRL Power

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

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Что за "внутренние"? Все нуждаются в объявлении прототипа, если используются до своего определения.

    МАСМ32 по умолчанию в десятичной вообще-то принимает. Для хекса ставится h.

    И, кстати, где пункт 4? :)
     
  12. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Это значит, что это не библиотечная функция на экспорт. А обычная функция, которая работает внутри программы.

    Ну тогда попробуйте выполнить функцию

    Code:
    PrintValue proc par1:DWORD,par2:DWORD
    	mov eax,par1
    	add eax,par2
    	xor eax,eax
    	ret
    PrintValue endp
    без объявления прототипа через PROTO после инклудов ;) Я это имел в виду. Зачем лишние строки, ведь так рациональней. Возможно я просто не так выразился.

    А я передумал его писать ;)

    Вот тут да, немного ошибся :eek: Просто привык всегда и везде указывать систему счисление, игнорируя факт "по умолчанию".
     
    #872 Sams, 7 Mar 2011
    Last edited: 7 Mar 2011
  13. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    Я написал, что хочу сделать функцию для вывода числа
    Я начинающий, хочу во всем разобраться.
    Про квадратные скобки я думал это получение значения по адресу, как в C++ *pointer;. Проблему решил, просто добавил дополнительный аргумент:
    Code:
    PrintValue proc nNumber, pBuffer, pFmt, nSize
    	
    	sub esp, 8
    	invoke GetStdHandle, STD_OUTPUT_HANDLE
    	mov [ebp-4], eax
    	invoke wsprintf, pBuffer, [pFmt], nNumber
    	invoke WriteConsole, [ebp-4], pBuffer, nSize, ADDR [ebp-8], 0
    	ret 12
    
    PrintValue endp
    
     
    #873 SHiNiGaMi, 8 Mar 2011
    Last edited: 8 Mar 2011
  14. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    Нужно сделать следующее задание, используя только debug (ввод команд через -a (assemble))
    1)Объявить массив размером 16 бит с 2A элементами
    2. Проинициализировать массив 0, используя любой метод адресации.
    3. В каждый элемент массива переслать число 7654, используя любой метод адресации
    4. Вычислить сумму элементов массива согласно варианту и переслать результат в элемент массива с номером 0

    в общем я пытаюсь обьявить массив таким образом, но дебаг ругается на ошибку
    Code:
    arr DB 2A DUP(0)
    потом попробовал
    Code:
    M1:
    DB 0
    INC DS
    JMP M1;тут будет другая разновидность джампа, пока точно не знаю какая
    
    и снова ошибка в первой строчке

    обьясните плиз
     
    #874 awdrg, 13 Mar 2011
    Last edited: 13 Mar 2011
  15. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    Проблема с выводом окна(

    Здравствуйте уважаемые форумчане! Начал тут учить assembler по туторилам iczlleon. Написал программу для вывода окна на экран, но она не запускается( Скомпилилась, слинковалась, но не запустилась. В чем проблема? Стоит у меня семерка, может из-за нее? но она 32 битная. Вот исходник (MASM):
    Code:
    .386
    .model flat, stdcall
    
    option casemap:none
    include C:\masm32\include\windows.inc
    include C:\masm32\include\user32.inc
    include C:\masm32\include\kernel32.inc
    
    includelib C:\masm32\lib\user32.lib
    includelib C:\masm32\lib\kernel32.lib
    
    WinMain proto :DWORD, :DWORD, :DWORD, :DWORD
    
    .DATA
    
    ClassName db "SimpleWinClass", 0
    AppName db "Our first window", 0
    
    .DATA?
    hInstance HINSTANCE ?
    CommandLine LPSTR ?
    
    .CODE
    start:
    
    invoke GetModuleHandle,NULL
    
    mov hInstance, eax
    
    invoke GetCommandLine
    mov CommandLine, eax
    
    invoke WinMain,hInstance, NULL, CommandLine, SW_SHOWDEFAULT
    
    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, NULL
    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 CreateWindowEx,NULL, ADDR ClassName,ADDR AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL, hInst, NULL
    
    mov hwnd, eax
    
    invoke ShowWindow,hwnd, CmdShow
    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
    
    WndProc proc hWnd:DWORD, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    .IF uMsg==WM_DESTROY
    	invoke PostQuitMessage,NULL
    .ELSE
    	invoke DefWindowProc,hWnd, uMsg, wParam, lParam
    .ENDIF
    
    xor eax, eax
    
    	Ret
    WndProc EndP
    
    end start
     
  16. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Code:
     .386
    .model flat,stdcall
    option casemap:none
    
    include include\windows.inc
    include include\user32.inc
    include include\kernel32.inc
    includelib lib\user32.lib
    includelib lib\kernel32.lib
    
    WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    
    .DATA
    
    ClassName db "WINDOW",0
    AppName db "MASM",0
    
    .DATA?
    hInstance HINSTANCE ?
    CommandLine LPSTR ?
    
    .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
        .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,NULL
        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 CreateWindowEx,NULL,\
                    ADDR ClassName,\
                    ADDR AppName,\
                    WS_OVERLAPPEDWINDOW,\
                    CW_USEDEFAULT,\
                    CW_USEDEFAULT,\
                    CW_USEDEFAULT,\
                    CW_USEDEFAULT,\
                    NULL,\
                    NULL,\
                    hInst,\
                    NULL
        mov   hwnd,eax
        invoke ShowWindow, hwnd,CmdShow
        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
    
    вот окно.посмотри что у тебя не так.
     
    #876 DooD, 13 Mar 2011
    Last edited: 13 Mar 2011
    1 person likes this.
  17. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    Спасибо, плюсанул, твое работает, посмотрю что у мя не так - отпишусь
    нашел 2 различия: забыл invoke ExitProcess, eax и поставил hWnd:DWORD вместо hWnd:HWND.
    исправил у себя в исходнике, все равно не запускается( ну да ладно, рабочий исходник все равно у меня уже есть)
     
    #877 maked0n, 13 Mar 2011
    Last edited: 13 Mar 2011
  18. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    maked0n, у вас пропущен ret в функции WndProc.

    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
    	[COLOR=DarkOrange][B]ret[/B][/COLOR]
    .ENDIF
    
    xor eax, eax
    
    	Ret
    WndProc EndP
     
    1 person likes this.
  19. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    да и стоять она должна перед winmain
     
  20. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    В данном случае это не имеет абсолютно никакого значения