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

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

  1. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    А кто подскажет мне?У меня есть строка 00450281-89 8e 08 0b 00 00 -mov [esi+00000b08],ecx,
    где 00450281 - адрес, 89 8e 08 0b 00 00-маш.команды,mov [esi+00000b08],ecx команды asm.Как мне изменить 89 8e 08 0b 00 00 вот эту команду на 9b 00 00 00 00 90 по средставм asm.Не могу понять(
     
  2. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    MTV,
    самый простой метод - файловый меппинг.
    WinAPI - CreateFileMapping, MapViewOfFile. Проецируем в оперативку нужную программу. По адресу 00450281 банальным movsb перезаписываем 6 байт на "9b 00 00 00 00 90".
    Это довольно таки сложно будет освоить, т.к. по файловому меппингу я вообще инфы в и-нете не видел, да и к тому же нужно понимать что такое плоская модель, и как загрузчик размещает программу в ОЗУ.

    Можно конечно и другим методом - CreateFile, SetFilePointer, WriteFile. Но тогда придется вычислить физический адрес, т.к. 00450281 - это виртуальный.
     
    #962 Sams, 14 May 2011
    Last edited: 14 May 2011
  3. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Тут вот такая трабла.Написал я ренэймер,все нормально скомпилился.Но при запуске пишет "Ошибка приложения память не может быть read... и т.д."(Вот собственно исходник:
    .386
    .model flat, stdcall
    option casemap :none ; case sensitive
    ;#########################################################################
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    ;#########################################################################
    .data
    names db "Element Client"
    FW dd ?
    MT db "Multi CLient"
    .code
    start:
    invoke FindWindow,0,names
    push eax
    pop [FW]
    invoke SendMessage,FW,WM_SETTEXT,0,MT
    invoke ExitProcess,0
    end start
    В чем проблема?Заранее благодарен.
     
  4. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    addr names
    addr mt
     
  5. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    а вообще лучше сделай так
    Code:
    .386
    .model flat, stdcall
    option casemap:none
    include include\windows.inc
    include include\kernel32.inc
    include include\user32.inc
    
    includelib lib\user32.lib
    includelib lib\kernel32.lib
    
    .data
    name1 db 'Диспетчер задач Windows',0
    name2 db 'UHAHAHA!',0
    .code
    
    start:
    invoke FindWindow,0,addr name1
    invoke  SetWindowText, eax,addr name2
    invoke ExitProcess,0
    end start
    
     
  6. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    А вот еще такая же ошибка ,писал патч вроде все нормально должно быть.Вот исходник:
     
  7. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    та же фигня,
    addr classname
    addr adress
    ps код ставится в тегах code( решеточка)
     
  8. Nek1t

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

    Joined:
    7 Mar 2008
    Messages:
    181
    Likes Received:
    16
    Reputations:
    1
    Простой (и глупый?) вопрос.
    Можно ли как-нибудь задать строковую константу / переменную в сегменте кода и вывести ее (но не посимвольно, а через функцию 09h) ?
     
  9. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    .model tiny
    .code
    org 100h

    start:
    mov ah,09 ; 9 функция вывод строк на экран
    mov dx,offset msg ;строка можно так lea dx,msg
    int 21h ; прерывание 21
    ret
    msg db "hello world!",0dh,0ah,'$'

    end start
     
    #969 DooD, 18 May 2011
    Last edited: 18 May 2011
  10. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    lea заменяет offset, + легче адресуются операнды,точнее более гибко.
     
    #970 DooD, 18 May 2011
    Last edited: 18 May 2011
  11. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    1. Ничем оно не легче.
    2. mov eax,offset metka на 1 байт меньше, чем lea eax,[metka]. От сюда получаем локальную оптимизацию кода. Ну это так, к слову.

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

    Так что если код не является базонезависимым, то лучше писать через offset.
     
  12. Nek1t

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

    Joined:
    7 Mar 2008
    Messages:
    181
    Likes Received:
    16
    Reputations:
    1
    DooD,
    Не совсем то - я неправильно вопрос поставил. Меня интересует некий самописный аналог printf("hello") (т.е. в итоге - некая реализация на макросах).
    Для меня проблема в том, что в Асме нельзя вывести константу, не задав ее перед этим как переменную.
    Во всех примерах, которые я видел, переменные идут либо в сегменте данных, либо в самом начале / конце сегмента кода (иначе не компилируется / выводит мусор и т.д.). Есть ли способ задавать переменную в произвольном месте сегмента кода?

    И сразу же в догонку "кривой" пример:
     
    #972 Nek1t, 18 May 2011
    Last edited: 18 May 2011
  13. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    если я не ошибаюсь могут быть глобальные переменные в начале или конце кода и локальные в процедурах,по-другому вроде нет.а зачем так делать как ты хочешь?
     
    #973 DooD, 18 May 2011
    Last edited: 18 May 2011
    2 people like this.
  14. Nek1t

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

    Joined:
    7 Mar 2008
    Messages:
    181
    Likes Received:
    16
    Reputations:
    1
    Похоже, так и есть...
    Задание у меня такое. Ну, вернее, создание макроса для вывода строки через функцию 09, т.е. что-то вроде printstr <sometext>, но т.к. в произвольном месте объявлять переменную нельзя, то у меня нет идеи нормальной реализации.

    Я вначале хотел использовать локальные метки в макросах. Т.е. в середине кода вызывается printstr <sometext>, на этапе компиляции "прыгаем" в сегмент данных, там прописываем str1 DB 'sometext', и далее выводим эту строчку. Как-то так. Но как я понял, "прыгать" можно только в прeделах данного макроса, т.е. в сегмент данных я никак не попаду. Поправьте, если не прав.
     
    #974 Nek1t, 18 May 2011
    Last edited: 19 May 2011
  15. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    а ясно,смотри составляешь файл

    printstr.asm

    printstr macro strn
    push ax
    mov ah,09
    mov dx,offset strn
    int 21h
    pop ax
    endm

    сохраняешь как printstr.asm

    теперь прога выглядит так

    .model tiny
    .code
    org 100h
    include printstr.asm
    start:
    printstr msg
    ret
    msg db "hello world!",0dh,0ah,'$'

    end start

    все вот те и макрос или не так ты хотел?
     
    #975 DooD, 19 May 2011
    Last edited: 19 May 2011
    1 person likes this.
  16. felix_v26

    felix_v26 New Member

    Joined:
    19 Mar 2011
    Messages:
    20
    Likes Received:
    0
    Reputations:
    0
    в чём различие между jg и ja ? я понял что jg сравнивает числа со знаком,а ja для сравнения чисел без знака.. а в чём различие этого сравнения?
     
  17. ShyRka_coder

    ShyRka_coder Member

    Joined:
    27 Jul 2010
    Messages:
    127
    Likes Received:
    7
    Reputations:
    5
    ja - если больше/ не менше или равно
    jg - переход если больше не меньше или равно
     
    #977 ShyRka_coder, 7 Jun 2011
    Last edited by a moderator: 7 Jun 2011
  18. felix_v26

    felix_v26 New Member

    Joined:
    19 Mar 2011
    Messages:
    20
    Likes Received:
    0
    Reputations:
    0
    ну это понятно, что оба сравнивают если больше.... но один сравнивает число со знаком а другой нет...
    вот когда я сравниваю 6000 со значениями в таблице, по команде ja и jg всё работает, а когда сравниваю 26000 с той же таблицой, команда jg не рабоатет...а ja работает
     
  19. GRRRL Power

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

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    ja сравнивает числа как есть, т.е. все биты считаются разрядами числа
    jg сравнивает числа с учетом того, что старший бит - это знак (если он единица, то число отрицательное)

    Пример для 8-битных чисел:

    ja:
    11010101 > 00001010
    (213 > 10)

    jg:
    11010101 < 00001010
    (-43 < 10)

    Можешь почитать про дополнительный код.
     
    #979 GRRRL Power, 7 Jun 2011
    Last edited: 7 Jun 2011
  20. bad_boy

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

    Joined:
    30 Dec 2004
    Messages:
    187
    Likes Received:
    33
    Reputations:
    3
    felix_v26, посмотри(запомни) какие флаги проверяются.Желательно ещё знать что эти самые флаги означают. Касательно твоего вопроса - CF(carry flag)
    http://faydoc.tripod.com/cpu/ja.htm