С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
lut1y
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 3
1

Вывести в файл содержимое указанного объекта

06.07.2010, 18:30. Просмотров 632. Ответов 1
Метки нет (Все метки)

Разработать ассемблер-программу, выводящую в файл содержимое указанного объекта. Для вывода использовать handle-ориентированные системные функции обработки файлов. Формат вывода: символьно-шестнадцатеричный. Пояснить назначенине выводимых обьектов и их отдельные поля:
* Заголовок символьного драйвера CON
* Заголовок символьного драйвера PRN
используем 52h.

Своего ума и нервов хватило на и все... только в файл параметры не пишет, а только шапку... вот что у меня получилось...
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
; Программа выводит информацию о загруженных драйверах
;
; Эта макрокоманда выводит символы на экран
;
@@out_ch MACRO c1,c2,c3,c4,c5
  mov   ah,02h
  IRP   chr,<c1,c2,c3,c4,c5>
  IFB   <chr>
  EXITM
  ENDIF
  mov   dl,chr
  int   21h
  ENDM
ENDM
 
  .MODEL  tiny
  DOSSEG
  .DATA
 
handle  dw 0    ;Хэндл файла*
crlf    db 0dh,0ah  ;перед строки (дописывает в конце каждой строки)
shlen   equ offset reportname-$ ;расчитываем размер шапки
sh  DB 13,10,"Device Drivers Information V1.1", 13, 10
  DB       "Address    Attr  Strg  Intr  Device Name",13,10
  DB       "-------    ----  ----  ----  -----------",13,10 
  DB       "$"  
reportname db 'otchet.txt',0    ;имя создаваемого файла*
module      db 'DRV',0  ;
typeb   db 0
 
  .STACK 256
  .CODE
  .STARTUP
 
  mov ax,@data
  mov ds,ax
  mov ah,3ch        
  xor cx,cx
  mov dx,offset reportname
  int 21h
 
  mov handle,ax
  mov bx,ax
  lea dx,sh
  mov ah,40h
  mov cx,shlen
  int 21h   
 
  mov     ah, 9h                ; Выводим заголовок
  mov     dx, OFFSET sh
  int     21h
 
  mov ah,52h      ; Получаем адрес первого
  int 21h         ;   драйвера в цепочке
  add bx, 22h
 
dr_loop:
  call show_driver_info           ; выводим параметры
 
  cmp  WORD PTR es:[bx], 0ffffh
  jz   end_of_driver_list
 
  
  mov  ax,es:[bx]        ; получаем адрес следующего
  mov  cx,es:[bx+2]      ;     драйвера
  mov  bx,ax
  mov  es,cx
 
  jmp  dr_loop
 
end_of_driver_list:
 
  .EXIT   0
 
show_driver_info proc near ;es:bx  - адрес драйвера
  push  es
  push  bx
 
   cmp   byte ptr es:[bx+10],'C'
    je   m1;
   cmp   byte ptr es:[bx+10],'P'
    je   m2;
   jmp   m;
m1:cmp   byte ptr es:[bx+11],'O'
    je   m3;
m2:cmp   byte ptr es:[bx+11],'R'
    je   m3;
   jmp   m;
m3:cmp   byte ptr es:[bx+12],'N'
    je   w;
m:jmp e  
 
w:mov   ax,es                ; выводим адрес драйвера
  call  Print_word
  @@out_ch ':'
  mov   ax,bx
  call  Print_word
  @@out_ch ' ',' '
 
  mov   ax,es:[bx+4]         ; выводим атрибут  драйвера
  call  Print_word
  @@out_ch ' ',' '
 
  mov   ax,es:[bx+6]
  call  Print_word           ; выводим ofs процедуры стратегии
  @@out_ch ' ',' '
 
  mov   ax,es:[bx+8] 
  call  Print_word           ; выводим ofs процедуры прерывания
  @@out_ch ' ',' '
      
  test  WORD PTR es:[bx+4],8000h  ; проверяем, это символьный
  mov   cx,8                      ; для символьного выводим
  mov   si,bx                     ;    имя драйвера
 
 
pr_name:   
  mov   al,BYTE PTR es:[si+10]
  @@out_ch al
  inc   si
  loop pr_name
  jmp  nxt  
 
nxt: 
  @@out_ch 13,10
e:pop   bx
  pop   es  
  ret
show_driver_info endp
 
; Вывод на экран содержимого регистра AX
 
Print_word proc near
;--------------------
          push ax
          push bx
          push dx
;
          push ax
          mov cl,8
          rol ax,cl
          call Byte_to_hex
          mov bx,dx
          @@out_ch bh                            
          @@out_ch bl
;
          pop ax
          call Byte_to_hex
          mov bx,dx
          @@out_ch bh
          @@out_ch bl
;
          pop dx
          pop bx
          pop ax
          ret
Print_word endp
;
Byte_to_hex proc near
;--------------------
; al - input byte
; dx - output hex
;--------------------
          push ds
          push cx
          push bx
;
          lea bx,tabl
          mov dx,cs
          mov ds,dx
;
          push ax
          and al,0fh
          xlat
          mov dl,al
;
          pop ax
          mov cl,4
          shr al,cl
          xlat
          mov dh,al
;
          pop bx
          pop cx
          pop ds
          ret
;
tabl db '0123456789ABCDEF'
Byte_to_hex endp
 
mov ah,3eh          ;закрываем открытый файл отчета
    mov bx,handle
    int 21h
 
    mov ax,4c00h    ;выход из программы
    int 21h
 
END
Пишите в аську: 558556303. просто горю, спасайте...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2010, 18:30
Ответы с готовыми решениями:

Прочитать файл, и вывести содержимое файла в 1-ю видеостраницу
Здравствуйте уважаемые! Решил попробовать небольшой примерчик на основе...

Прочитать файл и вывести его содержимое на экран. Assembler, tasm
Программа выводит нужный текст из программы. Ну при этом еще выдает ошибку, как...

Вывести на экран содержимое регистра
Здравствуйте. Нужно вывести на экран содержимое регистра xmm7, но при...

Вывести в графическом виде содержимое file.com
Есть желание для облегчения понимания начинающими программистами {и меня в том...

Вывести на экран содержимое буфера и произвести его очистку
Срочно нужна помощь, сам написать не в состоянии. Надо написать программу на...

1
vital792
2002 / 1274 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
07.07.2010, 11:53 2
просто убери макрос и выводи в файл функцией 40h

Добавлено через 11 часов 29 минут
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
; Программа выводит информацию о загруженных драйверах
 
;
; Эта макрокоманда выводит символы на экран
;
@@out_ch MACRO c1,c2,c3,c4,c5
  mov   ah,02h
  IRP   chr,<c1,c2,c3,c4,c5>
  IFB   <chr>
  EXITM
  ENDIF
  mov   dl,chr
  int   21h
  ENDM
ENDM
 
  .MODEL  tiny
  DOSSEG
  .DATA
 
handle dw 0 ;Хэндл файла*
crlf db 0dh,0ah ;перед строки (дописывает в конце каждой строки)
shlen equ offset reportname-$ ;расчитываем размер шапки
sh DB 13,10,"Device Drivers Information V1.1", 13, 10
DB "Address Attr Strg Intr Device Name",13,10
DB "------- ---- ---- ---- -----------",13,10  
reportname db 'otchet.txt',0 ;имя создаваемого файла*
module db 'DRV',0 ;
typeb db 0
out_str db 10 dup (0)
 
  .CODE
  .STARTUP
 
xor cx,cx
mov ax, 3c00h
mov dx,offset reportname
int 21h
 
mov handle,ax
mov bx,ax
lea dx,sh
mov ah,40h
mov cx,shlen
int 21h
 
  mov ah,52h      ; Получаем адрес первого
  int 21h         ;   драйвера в цепочке
  add bx,22h      ; es:bx - адрес первого драйвера
 
dr_loop:
  call show_driver_info           ; выводим параметры
 
  cmp  WORD PTR es:[bx+2], 0ffffh ; последний ?
  jz   end_of_driver_list
  cmp  WORD PTR es:[bx], 0ffffh
  jz   end_of_driver_list
 
  mov  ax,es:[bx]        ; получаем адрес следующего
  mov  cx,es:[bx+2]      ;     драйвера
  mov  bx,ax
  mov  es,cx
 
  jmp  dr_loop
 
end_of_driver_list:
 
mov ah,3eh ;закрываем открытый файл отчета
mov bx,handle
int 21h 
 
  .EXIT   0
 
show_driver_info proc near ;es:bx  - адрес драйвера
  push  es
  push  bx
 
cmp word ptr es:[bx+10], 'OC'
jz cmp_n
cmp word ptr es:[bx+10], 'RP'
jnz nolike_name 
cmp_n:
cmp byte ptr es:[bx+12], 'N'
jnz nolike_name
  
 
  mov   ax,es                ; выводим адрес драйвера
  call  Print_word
;  @@out_ch ':'
mov byte ptr [out_str], ':'
mov cx, 1
call print_to_file
  mov   ax,bx
  call  Print_word
;  @@out_ch ' ',' '
mov word ptr [out_str], '  '
mov cx, 2
call print_to_file
 
  mov   ax,es:[bx+4]         ; выводим атрибут  драйвера
  call  Print_word
;  @@out_ch ' ',' '
mov word ptr [out_str], '  '
mov cx, 2
call print_to_file
 
  test  WORD PTR es:[bx+4],8000h  ; проверяем, это символьный
  jz    is_block                  ;   драйвер или блочный
 
  mov   cx,8                      ; для символьного выводим
  mov   si,bx                     ;    имя драйвера
pr_name:
 
  mov   al,BYTE PTR es:[si+10]
;  @@out_ch al
mov byte ptr [out_str], al
push cx
mov cx, 1
call print_to_file
pop cx
  inc   si
  loop pr_name
  jmp  nxt
 
nxt:
 
;  @@out_ch 13,10
mov byte ptr [out_str], 13
mov byte ptr [out_str+1], 10
mov cx, 2
call print_to_file
 is_block:
nolike_name:
  pop   bx
  pop   es
 
  ret
show_driver_info endp
 
print_to_file proc
push bx
mov bx, handle
mov ah,40h
lea dx, out_str
int 21h
pop bx
ret
print_to_file endp
 
; Вывод на экран содержимого регистра AX
 
Print_word proc near
;--------------------
          push ax
          push bx
          push dx
;
          push ax
          mov cl,8
          rol ax,cl
          call Byte_to_hex
          mov bx,dx
;          @@out_ch bh
;          @@out_ch bl
mov word ptr [out_str], bx
mov cx, 2
call print_to_file
;
          pop ax
          call Byte_to_hex
          mov bx,dx
;          @@out_ch bh
;          @@out_ch bl
mov word ptr [out_str], bx
mov cx, 2
call print_to_file
;
          pop dx
          pop bx
          pop ax
          ret
Print_word endp
;
Byte_to_hex proc near
;--------------------
; al - input byte
; dx - output hex
;--------------------
          push ds
          push cx
          push bx
;
          lea bx,tabl
          mov dx,cs
          mov ds,dx
;
          push ax
          and al,0fh
          xlat
          mov dl,al
;
          pop ax
          mov cl,4
          shr al,cl
          xlat
          mov dh,al
;
          pop bx
          pop cx
          pop ds
          ret
;
tabl db '0123456789ABCDEF'
Byte_to_hex endp
  END
переделка примера из Фролова - тока комментарии не соответствуют

Добавлено через 2 минуты
и макрос можно удалить - он не используется)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2010, 11:53

Файл: Взять из каждого из трех файла по цифре, суммировать и, если получилось четное число, вывести его в 4 файл
помогите пожалуйста кажется не сложная задача, но не получается( Сама...

Копировать содержимое одного указанного файла в другой указанный файл, дописывая, а не стирая его содержимое
Dragokas, Помогите пожалуйста с заданием! Задание 3. Написать командный...

Создать командный файл, который выводил бы содержимое каталога, указанного в качестве параметра...
Помогите определить в чем ошибка бат файла:( Задание: Создать командный...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru