Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    *енум
     
  2. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    Clerk
    В любом случае большинство документированных kernel API (относительно Windows XP, в последующий не ковырялся - не перевариваю) в начале имеют 5-байтовый пролог, который легко воспроизводится (вроде что-то типа этого mov edi, edi (2-байта)/push ebp (байт)/mov ebp, esp (2-байта)). С исключениями тоже можно, но как это отлаживать. Пошаговые стратегии уже давно не в моде.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PowerASM
    Мы определяем моду ;)
    Пролог введён для хотпатча.
     
  4. kamax70

    kamax70 New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    36
    Спасибо, разобрался :)

    А как мы можем узнать адрес первой команды функции ? Например
    Адрес Байты Код
    Код (Text):
    1.          
    2. 13001010:   8BFF                mov edi, edi     
    3. 13001012:   55                   push ebp
    4. 13001013:   8BEC                mov ebp, esp
    5. 13001014          5D                   что угодно
    Как я определю адрес 13001010 , ды и 13001014, мне же на него надо вернуться, так?
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    kamax70
    Дизассемблер длин вам нужен. Пролог восстанавливать не нужно и копировать его в буфер тоже - непосредственно обработчик пусть исполнит mov ebp,esp и вернётся на 0x13001014.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    *push ebp/mov ebp,esp
     
  7. kamax70

    kamax70 New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    36
    А почему именно в 0x13001014 ? Не может быть другого адреса? Как его определить? Привидите пожалуйста маленький пример, я не очень силен в asm...
     
  8. kamax70

    kamax70 New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    36
    И если винда SP 2, зачем нужен дизассемблер длин? Ведь используется 5-байтовый пролог.
     
  9. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    изначально
    Код (Text):
    1. CreateFileW+0: 89 FF ; mov edi, edi
    2. CreateFileW+2: 55    ; push ebp
    3. CreateFileW+3: 89 D5 ; mov ebp, esp
    4. CreateFileW+5: ...
    вы записываете
    Код (Text):
    1. CreateFileW+0: E9 dword(MyFunc-CreateFile-5) ; jmp MyFunc
    в конце MyFunc у Вас
    Код (Text):
    1. MyFunc+X+0: 89 FF ; mov edi, edi
    2. MyFunc+X+2: 55    ; push ebp
    3. MyFunc+X+3: 89 D5 ; mov ebp, esp
    4. MyFunc+X+5: E9 dword(CreateFileW-MyFunc-X) ; jmp CreateFileW+5
    X - длина полезного кода в байтах из MyFunc
    у Вас получается
    Код (Text):
    1. CreateFileW+0: jmp MyFunc
    2. MyFunc+0: pusha
    3. ; некоторый полезный код
    4. MyFunc+X-1: popa
    5. MyFunc+X: mov edi, edi
    6. MyFunc+X+2: push edi
    7. MyFunc+X+3: mov ebp, esp
    8. MyFunc+X+5: jmp CreateFileW+5
    9. CreateFileW+5: ...
    или как предлагает Clerk

    поставить в начале CreateFileW команду int3 (CCh) и ловить сепшены, по состоянию камня ориентироваться что делать
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    kamax70
    Адрес любым может быть. Вы указали в качестве примера этот.
    Эти все манипуляции примитивны, неужеле сложно самому подумать ?
     
  11. n0vak

    n0vak New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2010
    Сообщения:
    3
    Всем привет.
    Может кто помочь с написанием программы на tasm?
    "Программа для просмотра заголовков исполняемых файлов. Формат файла PE."
    ICQ 331 608 257
     
  12. kolkiy

    kolkiy New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2010
    Сообщения:
    2
    привет всем!
    помоги пожалуйста люди добрые и умные!
    Задание
    Составить алгоритм решения (в виде структурной схемы) и программу на языке Ассемблера для двух задач из приводимого ниже списка заданий.
    Отладить составленную программу на ЭВМ с использованием пакета Turbo Assembler.
    Составить программу вычисления суммы чисел кратных 5, входящих в массив из 20 чисел
    Составить программу сортировки элементов массива из 25 целых чисел, которая
    располагает положительные числа в одной, а отрицательные в другой области
    памяти
     
  13. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    mov bx, offset mas
    mov cx, 20
    xor bp, bp
    mov dl, 5
    lp:
    mov al, [bx]
    xor ah, ah
    div dl
    test ah, ah
    jnz no
    add bp, ax
    no:
    inc bx
    loop lp

    оформления не просили

    вторую по позже
     
  14. kolkiy

    kolkiy New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2010
    Сообщения:
    2
    спасибо большое а с оформление можно извиниясь что сразцу не пропросил!!!
     
  15. qweqwe

    qweqwe New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2008
    Сообщения:
    2
    ПОЛУЧИТЬ ЧИСЛО С ПЛАВАЮЩЕЙ ТОЧКОЙ ИЗ ЧИСЛА С ФИКСИРОВАННОЙ
    всем привет,
    мне необходимо перегнать число из представления с фиксированной точкой (напр 12.34) в представление с плавающей точкой, соотв. получить мантиссу и порядок, с получением мантиссы проблем не возникло(для представления мантиссы использую 2 числа по 32 байта, дробную часть перевожу через таблицу с десятичными дробями(к целой части прибавляю элемент таблицы, соотв. разряду текущего разбираемого бита дробной части числа с фиксированной точкой)), а вот порядок никак получить не могу. помогите пожалуйста, заранее спасибо.
     
  16. qweqwe

    qweqwe New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2008
    Сообщения:
    2
    (поправка к предыдущему сообш.) сопроцессор использовать нельзя!
     
  17. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    1234 * (2^64) / 100 / (2^64) это будет число с не нормализованное плавающей точкой
    это и будет мантиссой если отбросить положение точки
    порядок в зависимости от формата
    4 байта 127+смещение точки (в этом формате старшую единицу мантиссы надо выбросить)
    8 байт 1023+смещение точки (в этом формате старшую единицу мантиссы надо выбросить)
    10 байт 16383+смещение точки

    Код (Text):
    1.          1234(10)                    4D2(16)                   *2^32
    2. 5299989643264(10)            4D200000000(16)                   /100
    3. 52999896432.64(10)             C570A3D70(16)                   /2^32
    4.          12.34(10)            C.570A3D70(16)                  
    5.  
    6.  
    7.  4 # 4570A3D70 мантисса 127+3=130 порядок
    8.  8 # 4570A3D7000000000 мантисса 1023+3=1026 порядок
    9. 10 # 4570A3D700000000000 мантисса 16383+3=16386 порядок
     
  18. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    извините. скопировал, но не поправил
    Код (Text):
    1.  4 # 8AE147AE0 мантисса 127+3=130 порядок
    2.  8 # 8AE147AE000000000 мантисса 1023+3=1026 порядок
    3. 10 # С570A3D700000000000 мантисса 16383+3=16386 порядок
     
  19. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    зы надеюсь не надо писать как работать с длинными целыми числами?
    ззы все операции можно (и надо) произвести с целыми числами.
    зззы надеюсь не надо пояснять откуда взялось число 3 прибавляемое к порядку
    хотя почему бы и нет bsr 0x0000000C = 3. старший 3-и бит это и надо добавить.
     
  20. __EXP__

    __EXP__ New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2010
    Сообщения:
    12
    По заданию надо написать родительский и дочерний процессы . Родительский получает имя дочернего из командной строки :
    C:\MASM_1\PA.EXE ''C:\MASM_1\CP.exe''
    Дочерний процесс должен прочитать из окружения имя файла который ему надо открыть.
    Пишу в командной строке так C:\MASM_1\СP.exe SET WORKFILE=FILE39.txt
    Правильно ли я параметры передаю а то пишет что переменной нет , хотя если просмотреть все окружение то переменная добавлена.
    Родитель
    Код (Text):
    1. d_seg segment 'data'
    2. child_name db 20 dup (0)
    3. blok_param db 7 dup (0)
    4. str_1 db 'The child is active',10,13,'$'
    5. str_3 db 'Error child process',10,13,'$'
    6. err_c db 0
    7. d_seg ends
    8.  
    9. c_seg segment 'code'
    10. assume cs:c_seg ,ds:d_seg
    11. ; ===============ПОДПРОГРАММА============
    12. Get_cmd proc
    13.        mov si,80h   ;SI=смещение командной строки.
    14.        lodsb        ;Получим кол-во символов.
    15.        cmp al,25    ;Больше 25?
    16.        ja No_string ;Да - на метку No_string
    17.        or al,al     ;Нет командной строки?
    18.        jz No_string ;На метку No_string
    19.  
    20.        inc si       ;Теперь SI указывает на первый символ строки.
    21.  
    22. Next_char:
    23.        lodsb      ;Получаем очередной символ.
    24.        cmp al,0Dh ;Конец строки?
    25.        je Got_cmd ;Да - на выход...
    26.        stosb      ;Иначе - сохраним символ в переменной File_name (stosd - запись в память по адресу al)
    27.        jmp short Next_char ;Следующий символ...
    28.  
    29. Got_cmd:
    30.        xor al,al ;Строка получена! Допишем ASCII 0 в конец
    31.        stosb
    32.        clc  ;сбросить флаг переноса CF
    33.        ret  ;Выходим из процедуры
    34.  
    35. No_string:
    36.        stc  ;Строка неверна! Установим флаг переноса СF.
    37.        ret  ;Выходим из процедуры
    38. Get_cmd endp
    39. START:
    40. mov ax,d_seg
    41. mov ds,ax
    42.  
    43.       mov bx,offset Finish
    44.       mov cl,4
    45.       shr bx,cl
    46.       inc bx
    47.       mov ah,4Ah
    48.       int 21h    ;Ужимаем размер отведенной памяти до метки Finish
    49.      
    50. ;====================================ПОЛУЧЕНИЕ ИМЕНИ ФАЙЛА ИЗ КОМАНДНОЙ СТРОКИ======================
    51. mov di, offset child_name
    52.  call Get_cmd ;Получим командную строку.  
    53. ;===================================================ЗАПУСК ДОЧЕРНЕГО ПРОЦЕССА========================
    54.       mov ah,4Bh  ;Функция EXEC (EXECute - запус программы)
    55.       mov dx,offset child_name ;Имя файла для запуска
    56.       mov al,0    ;Загрузка и запуск
    57.       int 21h
    58.      
    59.       jc error
    60.       mov ah,9h
    61.       mov dx,offset str_1
    62.       int 21h
    63.       mov ah,4ch
    64.       int 21h
    65.      
    66.     error:
    67.     mov ah,9h
    68.     mov dx,offset str_3
    69.     mov ah,4ch
    70.     int 21h
    71. Finish:
    72. c_seg ends
    73. end START
    Дочерний
    Код (Text):
    1. d_seg segment 'data'
    2. fname db 50 dup(0)
    3. envvar db 'WORKFILE='
    4. err_code db 0
    5. str1 db 'CHILD is ACTIV',10,13,'$'
    6. str2 db 'File open',10,13,'$'
    7. str3 db 'Error of opening of a file ',10,13,'$'
    8. str4 db 'Error variable environment', 10,13,'$'
    9. len equ $-envvar ; подстановка
    10. handle dw 0
    11. buf db ?
    12. d_seg ends
    13.  
    14. c_seg segment 'code'
    15. assume ds:d_seg,cs:c_seg
    16. START:
    17. mov ax,d_seg
    18. mov ds,ax
    19.  
    20. mov ah,9h
    21. lea dx,str1
    22. int 21h
    23. ;====================ПОЛУЧЕНИЕ ПАРАМЕТРОВ ИЗ ОКРУЖЕНИЯ====================
    24. mov ax,es:2ch ; сегмент окружения
    25. mov es,ax
    26. ;Ищем в окружение подстроку параметров
    27. mov BX,0
    28. cld
    29. next_per:
    30.         mov CX,len
    31.         mov SI, offset envvar
    32.         mov DI,BX
    33.    repe cmpsb
    34.         je extraction
    35. ;Переменная не совпадает ищем дальще
    36. ;Ищем конес строки 0
    37. test_nul:
    38.         cmp byte ptr ES:[BX],0 ; сравнение с 0
    39.         je next_nul ; ноль найден
    40.         inc BX
    41.         jmp test_nul
    42. ; Проверка на 0 конец всего окружения
    43. next_nul:
    44.         inc BX
    45.         cmp byte ptr ES:[BX],0 ; сравнение с 0
    46.         jne next_per
    47. ; Переменная не найдена
    48. mov err_code,1
    49. mov ah,9h
    50. mov dx,offset str4
    51. int 21h
    52. jmp fin
    53.  
    54. extraction:
    55.            mov BX,-1
    56.     no_end:
    57.            inc BX
    58.            cmp byte ptr ES:[DI][BX],0 ; сравнение с 0
    59.            jne no_end
    60. ; BX-длина переменной
    61. ; DI- первый байт значения переменной
    62. ; ES- сегмент окружения
    63. ; DS- сегмент данных
    64. ;==========================ПЕРЕНОС ЗНАЧЕНИЯ ПЕРЕМЕННОЙ В ПРОГРАММУ=========
    65. mov CX,BX
    66. push ES
    67. push DS
    68. pop ES
    69. pop DS
    70. mov SI,DI
    71. mov DI, offset ES:fname
    72. rep movsb
    73. push ES
    74. pop DS
    75. ;=================ИМЯ ФАЙЛА===============
    76. mov ah,9h
    77. mov dx, offset fname
    78. int 21
    79. ;=====================================ОТКРЫВАЕМ ФАИЛ=============================
    80. mov ax, d_seg
    81. mov es, ax
    82. mov ah,3dh
    83. mov al,0 ; открываем для чтения
    84. mov dx,offset fname
    85. int 21h
    86. ;=====================================ПРОВЕРКА ОТКРЫТИЯ===========================
    87. mov handle,ax
    88. jnc open        ; заменил cmp ax, 0
    89.  
    90. mov err_code,1
    91. mov ah,9h
    92. mov dx,offset str3
    93. int 21h
    94. jmp fin
    95.  
    96. open:
    97. mov ah,9h
    98. mov dx,offset str2
    99. int 21h
    100.  
    101. out_text:
    102.     mov ah,3fh
    103.     mov bx, handle      ; добавил, как же он будет читать файл без дескриптора
    104.     mov dx,offset buf
    105.     mov cx,1
    106.     int 21h
    107.     cmp ax,0
    108.     je close
    109.     mov ah, 02h
    110.     mov dl, buf
    111.     int 21h
    112.     jmp out_text
    113.  
    114. close:          ; закрываем файл, после чтения
    115.     mov ah,3eh
    116.     int 21h
    117. fin:
    118.     mov ah, 10h
    119.     int 16h
    120.     mov ah, 4ch
    121.     mov al, err_code
    122.     int 21h
    123. c_seg ends
    124. end START