dump памяти

Тема в разделе "WASM.BEGINNERS", создана пользователем Andriushka92, 21 дек 2011.

  1. Andriushka92

    Andriushka92 New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2011
    Сообщения:
    11
    .model small
    .data
    buf db 8,10 dup(0) ;принимает строку, введенную с клавиатуры
    segm db 13,10,'Segment(hex): $'
    off db 13,10,'Disp(hex): $'
    block db 256 dup(0) ;копия данных из памяти по введенному сегменту и смещению
    sh db 'C:\temp.txt'
    strokac db '│ : │',13,10,'$' ;копия форматированной строки, выводимой в файл
    strlen equ $-strokac ;длина строки, выводимой в файл
    dno db 'C:\temp.txt'
    msg1 db 'Again? (Y/N)',13,10,'$'
    stroka db strlen dup(0) ;формируемая строка, которую записываем в файл
    s dw 0 ;сегмент
    o dw 0 ;смещение
    .stack 256
    .code
    start:
    mov ax,@data ;Настраиваем сегментные регистры
    mov ds,ax
    mov es,ax
    mlp: lea dx,segm ;Segment(hex):
    call inputhex ;вводим сегмент
    mov s,ax ;созраняем его в переменной
    push ax ;сохраняем его в стеке
    lea dx,off ;Disp(hex):
    call inputhex ;вводим смещение
    mov o,ax ;сохраняем его в переменной
    mov si,ax ;заносим смещение в si
    pop ds ;восстанавливаем в ds из стека сегмент
    lea di,block ;адрес куда копировать область памяти
    mov cx,128 ;размер копируемого участка 128 слов=256 байт
    rep movsw ;копируем в область памяти в сегмент данных программы
    push es ;
    pop ds ;ds=es
    mov ah,9 ;функция вывода сообщения на экран
    lea dx,sh ;шапка блока
    int 21h ;выводим на экран
    lea si,block ;арес дампируемого учаска памяти
    mov bp,16 ;количество выводимых строк
    lp: push si ;сохраняем si
    lea di,stroka ;начало строки, которую формиреум для вывода на экран
    push di ;сохраняем начало
    lea si,strokac ;начало копии форматируемой строки
    mov cx,strlen ;длина строки
    rep movsb ;очищаем строку
    pop di ;восстанавливаем начало
    pop si ;восстанавливаем si
    inc di ;пропускаем рамку
    mov ax,s ;сегмент
    call printhex16 ;преобразовываем в текст, в выводимую строку
    inc di ;пропускаем 1 символ(двоеточие)
    mov ax,o ;смещение
    call printhex16 ;преобразовываем в текст, в выводимую строку
    add di,2 ;пропускае 2 символа(пробелы)
    mov cx,16 ;количество выводимых в строку байт
    lp1: lodsb ;берем байт из памяти
    call printhex ;преобразовываем в текст, в выводимую строку
    inc di ;пропускаем 1 символ (пробел)
    loop lp1 ;преобразовываем все 16 байт строки
    mov ah,9 ;функция вывода сообщения на экран
    lea dx,stroka ;адрес выводимой строки
    int 21h ;выводим на экран
    add o,16 ;увеличиваем смещение на 16 дампированных байт
    dec bp ;уменьшаем количество оставшихся строк
    jnz lp ;продолжаем пока не ноль
    mov ah,9 ;функция вывода сообщения на экран
    lea dx,dno ;выводимое сообщение
    int 21h ;выводим на экран
    ag: mov ah,0 ;Ожидаем нажатия любой клавиши
    int 16h
    cmp ah,49 ;нажата N
    jz ex ;если да - выход
    cmp ah,21 ;нажата Y
    jz mlp ;тогда повторяем дамп
    jmp ag ;иначе опять ждем нажатия
    ex: mov ax,4c00h ;закончить программу
    int 21h
    ;Ввод шестнадцатеричного числа с проверкой
    ;ds:dx - адрес выводимого сообщения
    ;На выходе: ax - число
    inputhex proc
    mov di,dx ;сохраняем адрес сообщения
    inputhex1:
    mov dx,di ;адрес сообщения
    mov ah,9 ;функция вывода сообщения на экран
    int 21h ;выводим на экран
    mov ah,0ah ;функция ввода строки с клавиатуры
    mov dx,offset buf ;буфер куда вводить
    int 21h ;пользователь вводит в текстовом виде в buf значение элемента массива
    mov ch,0
    mov cl,buf[1] ;сх - длина введенной строки
    lea si,buf[2] ;начало введенной строки
    push si ;сохраняем начало строки
    push cx ;и ее длину
    ;проверяем, что это 16-ричная строка
    ihlp: mov al,[si] ;берем символ
    cmp al,'0' ;если он меньше символа 0
    jc inputhex1 ;выводим сообщение об ошибке
    cmp al,'9' ;если между 0 и 9
    jbe ihm1 ;то идем к следующему
    cmp al,'A' ;Если символ между 9 и А
    jc inputhex1 ;выводим сообщение об ошибке
    cmp al,'F' ;если между A и F
    jbe ihm1 ;то идем к следующему
    cmp al,'a' ;Если символ между F и а
    jc inputhex1 ;выводим сообщение об ошибке
    cmp al,'f' ;если между a и f
    jbe ihconvert ;то преобразовываем его в прописной
    jmp inputhex1 ;иначе выводим сообщение об ошибке
    ihm1: inc si ;следующий символ строки
    loop ihlp ;обработать все
    pop cx ;восстанавливаем размер
    pop si ;и адрес строки
    ;преобразовываем строку в ;16-ричное число
    xor dx,dx ;16-ричное число
    ihlp2: mov al,[si] ;берем символ
    cmp al,'9' ;если это цифра
    jbe ihm5 ;то вычитаем из него только '0'
    sub al,7 ;а если буква, вычитаем 7
    ihm5: sub al,'0' ;и вычитаем '0'
    shl dx,4 ;сдвинуть резльтат на одну тетраду влево
    or dl,al ;добавить получившееся число
    inc si ;следующий символ
    loop ihlp2 ;преобразовываем всю строку в число
    mov ax,dx ;помещаем результат в ax
    ret ;выход из подпрограммы
    ihconvert:
    and [si], byte ptr 11011111b ;преобразование строчной буквы в прописную
    jmp ihm1 ;возвращаемся в цикл
    inputhex endp
    printhex proc
    ;преобразование байта в текстовый вид в строку
    ;al - байт;
    ;es:di - адрес куда записывать строку
    push dx ;сохраняем регистры
    push ax
    push ax ;сохраняем значение
    shr al,4 ;сдвигаем выводимый код на 4 бита вправо
    add al,'0' ;преобразуем старшую(левую)тетраду в символ
    cmp al,'9' ;если не это буква A-F
    jbe @m1 ;то пропускаем
    add al,7 ;а если буква,то корректируем символ
    @m1: stosb ;записываем старшую тетраду в строку
    pop ax ;восстанавливаем значение
    and al,0fh ;выделяем младшую тетраду
    add al,'0' ;преобразуем старшую(левую)тетраду в символ
    cmp al,'9' ;если не это буква A-F
    jbe @m2 ;то пропускаем
    add al,7 ;а если буква,то корректируем символ
    @m2: stosb ;записываем младшую тетраду в строку
    pop ax ;восстанавливаем регистры
    pop dx
    ret ;выход из подпрограммы
    printhex endp
    ;Печать 16-разрядного 16-ричного числа
    ;На входе: AX - число
    printhex16 proc
    push ax ;сохранить параметр
    mov al,ah
    call printhex ;вывести старшую часть
    pop ax ;восстановить параметр
    call printhex ;вывести младшую часть
    ret ;выход из подпрограммы
    printhex16 endp

    end start
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Типа мы должны угадать, что подумал преподователь :)

    Сколько не глядел на исходник, так и не увидел там чтения из файла. А как писать в файл можно узнать тамже - в Интернете или по сайту поискать. Или иначе сюда : http://wasm.ru/forum/viewtopic.php?id=17088 Хотя на вопрос "ничего не получается" и там не ответят. Тут не детский сад.
     
  3. Andriushka92

    Andriushka92 New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2011
    Сообщения:
    11
    а я разве гдето такое упомянул в своем контексте??
     
  4. Andriushka92

    Andriushka92 New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2011
    Сообщения:
    11
    вот подправил как из файла считать...подскажите как записать в файл результат чтобы он не на экран выводился,немогу разобраться как записать=(
     
  5. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Выполнить команду открытия на запись и выполнить команду записи. Какие проблемы. В любом учебнике по Дос-ассемблеру это описано.
    Увы, нету там ни одной команды про файл.
     
  6. Andriushka92

    Andriushka92 New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2011
    Сообщения:
    11
    и вправду...нету...
     
  7. Andriushka92

    Andriushka92 New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2011
    Сообщения:
    11
    подскажите пожалуйста как считать из файла и записать в другой в файл...не получается эти моменты прикрепить к исходному коду=(
     
  8. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
  9. Andriushka92

    Andriushka92 New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2011
    Сообщения:
    11
    не плохие ссылки...есть чего полезного...но все же я незнаю как прикрепить это к исходному коду...подскажите=(
     
  10. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Ничего прикреплять не нужно: нужно уметь программировать. Т.е. знать как в текстовом редакторе в имеющийся текст программы добавить функционал(новые команды) и чтобы она продолжала работать. Никто за тебя это делать тут не будет. Тем более что ты так и не объяснил, что именно надо запрограммировать :)
    Ну и для начала надо уметь писать программу с нуля. Необязательно конечно набивать все строчки самому, можно и копипастить, но вот понимать что каждая строчка значит - обязательно. Тогда не будет таких глупых вопросов.
    От того, что ты "спер" где-то исходники с комментариями - умнее ты не стал. Вот если бы ты понимал их...
     
  11. Andriushka92

    Andriushka92 New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2011
    Сообщения:
    11
    если я просто мало знаком с Ассемблером и незнаю как к коду еще добавить функционал и чтобы продолжало работу прога то что я неумею программировать???а запрограмировать надо dump памяти, считать из файла и записать результат в другой файл