Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 3
1
TASM

Дамп памяти - не понимаю

10.04.2011, 08:45. Показов 5765. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравстуйте, у меня проблема с курсовой, мне ее сделали полностью, но препод задал пару вопросов: каким образом(математика) происходит преобразование числа строки в 16-тиричный адрес. каким образом дамп памяти преобразовывается в 16-тиричный формат и выводится на экран?
помогите пожалуйста-через 2 дня защита(

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
.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 '┌──────────────────────────────────────────────────────────┐',13,10,'$'
strokac db '│    :                                                     │',13,10,'$'  ;копия форматированной строки, выводимой в файл
strlen  equ $-strokac       ;длина строки, выводимой в файл
dno     db '└──────────────────────────────────────────────────────────┘',13,10
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
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2011, 08:45
Ответы с готовыми решениями:

Дамп памяти
Надо сделать вывод на экран содержимого шестнадцати байтов. org 100h jmp disp_line...

Вывести на экран дамп 256 байт памяти
Здравствуйте, требуется скорректировать программу (и соответствующие файлы) так, чтобы экранная...

Вычислить логический и физический адрес символа в Дамп памяти
Вычислить логический и физический адрес выделенного символа (смайла, во второй строке) в Дампе...

Вычислить логический и физический адрес символа в Дамп памяти
Помогите вычислить все тоже самое, что и в теме ...

5
232 / 102 / 6
Регистрация: 18.04.2010
Сообщений: 294
10.04.2011, 10:29 2
А что конкретно в этих вопросах для Вас непонятно? В комментариях есть вполне четкое объяснение к коду.
0
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 3
10.04.2011, 21:49  [ТС] 3
начиная вот с этого куска(строка 97 текста), препод взял листок бумаги и написал на нем число и попросоил показать на бумаге как же работает мой алгоритм преобразования строки в шеснацетиричный адрес(( тут я и села(
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
11.04.2011, 14:35 4
Катя23,
Препода не обманешь, он сердцем видит ((С) "Место встречи изменить нельзя")
Если "у меня проблема с курсовой, мне ее сделали полностью" курсовую хоть один раз перечитать нужно было (а лучше пять) вопросики самой себе позадавать, учебник почитать - полистать...
0
0 / 0 / 0
Регистрация: 10.04.2011
Сообщений: 3
11.04.2011, 15:03  [ТС] 5
да 125 раз читала. и учебников уже кучу посмотрела. не понимаю а сдать надо(
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
11.04.2011, 15:09 6
Катя23, а вот когда курсовая готова -- попробуй взять и переписать ее, как бы ты сама написала по учебникам, в сложных случаях -- смотри, как написали тебе, попробуй улучшить готовую работу (только копию старой оставь ради бога) так сама и разберешься, иначе ткнут совершенно в неожиданном месте и скажут "Не могла ты этого написать! Не могла..." а тебе и ответить нечего потому что это правда
0
11.04.2011, 15:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2011, 15:09
Помогаю со студенческими работами здесь

Резервирование памяти для char db (я так понимаю аналог dw)
Вот db резервирует для строки, но db - это два байта как я понимаю. Но здесь больше, чем 2а байта....

Запишите дамп оперативной памяти сегмента данных после выполнения программы
Добрий день! потрібно виконати таке завдання. Запишите дамп оперативной памяти первых восьми слов...

Дамп памяти
Здравствуйте. Вроде все правельно, но не вижу в дампе памяти свой файл, подскажите пожалуйста...

Дамп памяти чтение.
Прошу помочь с разбором темы дамп памяти. Дате пожалуйсто матереал (подробный ) работы с дампом...

Дамп памяти в Turbo Debugger
Как в TD просмотреть область памяти, в которой хранятся данные, объявленные в сегменте данных...

Дамп памяти в Turbo Debugger после трассировки меняет регистры
Доброго времени суток! Начал изучать асемблер и столкнулся с проблемой в отладчике (TD) дамп...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru