-
Notifications
You must be signed in to change notification settings - Fork 0
/
T3.LST
328 lines (305 loc) · 13.6 KB
/
T3.LST
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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
Turbo Assembler Version 3.2 12/14/18 10:33:27 Page 1
T3.ASM
1 assume cs:codigo,ds:dados,es:dados,ss:pilha ; define segmentos do código
2 =000D CR EQU 0DH ; constante - codigo ASCII do caractere "carriage return"
3 =000A LF EQU 0AH ; constante - codigo ASCII do caractere "line feed"
4 =0008 BKSPC EQU 08H ; caractere ASCII "Backspace"
5 =001B ESCP EQU 27 ; caractere ASCII "Escape"
6 =000D ENTR EQU 13 ; caractere ASCII "Enter"
7
8 ; definicao do segmento de dados do programa
9 0000 dados segment
10 ;mensagens de systema
11 0000 41 6C 75 6E 6F 3A 20+ msgIdentificacao db 'Aluno: Victor Arnt Numero Cartao: 00291097','$' ;reutiliza
12 56 69 63 74 6F 72 20+
13 41 72 6E 74 20 4E 75+
14 6D 65 72 6F 20 43 61+
15 72 74 61 6F 3A 20 30+
16 30 32 39 31 30 39 37+
17 24
18 002B 4E 6F 6D 65 20 64 6F+ msgNomeArq db 'Nome do arquivo: ','$'
19 20 61 72 71 75 69 76+
20 6F 3A 20 24
21 003D 50 72 6F 67 72 61 6D+ msgFimEnter db 'Programa Encerrado, voce clicou Enter','$'
22 61 20 45 6E 63 65 72+
23 72 61 64 6F 2C 20 76+
24 6F 63 65 20 63 6C 69+
25 63 6F 75 20 45 6E 74+
26 65 72 24
27 0063 4F 70 73 2C 20 6E 61+ msgErro db 'Ops, nao encontrei o arquivo, digite novamente',CR,LF,'$'
28 6F 20 65 6E 63 6F 6E+
29 74 72 65 69 20 6F 20+
30 61 72 71 75 69 76 6F+
31 2C 20 64 69 67 69 74+
32 65 20 6E 6F 76 61 6D+
33 65 6E 74 65 0D 0A 24
34 0094 41 63 68 6F 20 2E 6D+ msgAchou db 'Acho .mov','$'
35 6F 76 24
36 ;constantes
37 009E 0D 0A 24 fimlinha db CR,LF,'$' ;mantem
38 00A1 0F coresPrograma db 0Fh ; fundo preto (0), texto em branco (F)
39 00A2 ???? handler dw ?
40 ;variaveis
41 00A4 40*(????) varNome dw 64 dup (?)
42 0124 2E 6D 6F 76 24 varSuxMOV db '.mov','$'
43 0129 80*(??) varBuffer db 128 dup (?)
44 01A9 ???? varAchoMov dw ?
45 01AB dados ends
46
47 ; definicao do segmento de pilha do programa
48 0000 pilha segment stack ; permite inicializacao automatica de SS:SP
49 0000 80*(????) dw 128 dup(?)
50 0100 pilha ends
51
52 ; definicao do segmento de codigo do programa
53 0000 codigo segment
54 0000 inicio: ; CS e IP sao inicializados com este endereco
55 0000 B8 0000s mov ax,dados ; inicializa DS
56 0003 8E D8 mov ds,ax ; com endereco do segmento DADOS
57 0005 8E C0 mov es,ax ; idem em ES
Turbo Assembler Version 3.2 12/14/18 10:33:27 Page 2
T3.ASM
58 ; fim da carga inicial dos registradores de segmento
59
60 ;TAREFA 1 DO PROGRAMA
61
62 ;LIMPAR TELA
63 0007 limpaTela:
64 0007 B0 00 mov al,0 ; rolar todas as linhas da janela
65 0009 8A 3E 00A1r mov bh,coresPrograma ; inserir novas linhas com este atributo
66 000D B5 00 mov ch,0 ; linha do canto superior esquerdo da janela
67 000F B1 00 mov cl,0 ; coluna do canto superior esquerdo da janela
68 0011 B6 18 mov dh,24 ; linha do canto inferior direito da janela
69 0013 B2 4F mov dl,79 ; coluna do canto inferior direito da janela
70 0015 B4 06 mov ah,6 ; rolar janela para cima
71 0017 CD 10 int 10h ; executa rolagem
72 ; posiciona cursor
73 0019 B6 00 mov dh,0 ; linha 0
74 001B B2 00 mov dl,0 ; coluna 0
75 001D E8 0114 call poscursor ; posiciona cursor na posicao (0,0) da tela
76
77 ;NOME ALUNO
78
79 0020 BA 0000r lea dx,msgIdentificacao ; endereco da mensagem em DX
80 0023 B4 09 mov ah,9 ; funcao exibir mensagem no AH
81 0025 CD 21 int 21h ; chamada do DOS
82 ; posiciona cursor
83 0027 B6 01 mov dh,1 ; linha 0
84 0029 B2 00 mov dl,0 ; coluna 0
85 002B E8 0106 call poscursor ; posiciona cursor na posicao (0,0) da tela
86
87 ;ARQUIVOS
88 002E BA 002Br repete: lea dx,msgNomeArq ; endereco da mensagem em DX
89 0031 B4 09 mov ah,9 ; funcao exibir mensagem no AH
90 0033 CD 21 int 21h ; chamada do DOS
91 ; le nome do arquivo
92 0035 BF 00A4r lea di, varNome
93 0038 B4 01 entradaEnter: mov ah,1
94 003A CD 21 int 21h ; le um caractere com eco
95
96 003C 3C 0D cmp al,ENTR ; compara com Enter
97 003E 75 07 jne depois
98 0040 E8 00F8 call fimEnter
99 0043 B4 01 entrada: mov ah,1
100 0045 CD 21 int 21h ; le um caractere com eco
101
102 0047 depois:
103 0047 3C 0D cmp al,CR ; compara com carriage return
104 0049 74 26 je continua
105
106 004B 3C 08 cmp al,BKSPC ; compara com 'backspace'
107 004D 74 05 je backspace
108
109 004F 88 05 mov [di],al ; coloca no buffer
110 0051 47 inc di
111 0052 EB EF jmp entrada
112
113 0054 backspace:
114 0054 81 FF 00A4r cmp di,offset varNome
Turbo Assembler Version 3.2 12/14/18 10:33:27 Page 3
T3.ASM
115 0058 75 08 jne adiante
116 005A B2 20 mov dl,' ' ; avanca cursor na tela
117 005C B4 02 mov ah,2
118 005E CD 21 int 21h
119 0060 EB E1 jmp entrada
120 0062 adiante:
121 0062 B2 20 mov dl,' ' ; apaga ultimo caractere digitado
122 0064 B4 02 mov ah,2
123 0066 CD 21 int 21h
124 0068 B2 08 mov dl,BKSPC ; recua cusor na tela
125 006A B4 02 mov ah,2
126 006C CD 21 int 21h
127 006E 4F dec di
128 006F EB D2 jmp entrada
129
130 0071 continua:
131 0071 C6 05 00 mov byte ptr [di],0 ; forma string ASCIIZ com o nome do arquivo
132 0074 B2 0A mov dl,LF ; escreve LF na tela
133 0076 B4 02 mov ah,2
134 0078 CD 21 int 21h
135 ;COMPARA SE TEM MOV
136 007A FC cld
137 007B BF 00A4r lea di, varNome
138 007E B9 0040 mov cx,64
139 0081 FC cld
140 0082 B0 2E mov al,'.'
141 0084 C7 06 01A9r 0000 mov varAchoMov,0
142 008A F2> AE repne scasb
143 008C 75 27 jne acoplaMov ; parou sem achar nenhum caractere '.'
144 008E B0 4D mov al,'M'
145 0090 C7 06 01A9r 0000 mov varAchoMov,0
146 0096 F2> AE repne scasb
147 0098 75 1B jne acoplaMov ; parou sem achar nenhum caractere 'M'
148 009A B0 4F mov al,'O'
149 009C C7 06 01A9r 0000 mov varAchoMov,0
150 00A2 F2> AE repne scasb
151 00A4 75 0F jne acoplaMov ; parou sem achar nenhum caractere 'O'
152 00A6 B0 56 mov al,'V'
153 00A8 C7 06 01A9r 0000 mov varAchoMov,0
154 00AE F2> AE repne scasb
155 00B0 75 03 jne acoplaMov ; parou sem achar nenhum caractere 'V'
156 00B2 EB 30 90 jmp ExibeNomeArq
157
158
159
160 00B5 acoplaMov:
161 00B5 BF 00A4r lea di,varNome
162 00B8 B9 0040 mov cx,64
163 00BB FC cld
164 00BC B0 20 mov al,20h ; codigo ascii do caractere espaço (ou usar ' ')
165 00BE F2> AE repne scasb
166 00C0 75 6D jne fim ; nao achou nenhum espaço
167 00C2 89 3E 00A4r mov word ptr varNome,di
168 00C6 FF 0E 00A4r dec varNome ; corrige endereço do primeiro espaço
169 00CA F3> AE repe scasb
170 00CC 74 61 je fim ; so tem espaços ate o fim
171 00CE 89 3E 0124r mov word ptr varSuxMOV,di
Turbo Assembler Version 3.2 12/14/18 10:33:27 Page 4
T3.ASM
172 00D2 FE 0E 0124r dec varSuxMOV ; corrige endereço do primeiro caractere
173 00D6 8B 36 0124r mov si,word ptr varSuxMOV ; endereço do ultimo espaço + 1
174 00DA 8B 3E 00A4r mov di,word ptr varNome
175 00DE 41 inc cx ; corrige contador
176 00DF F3> A4 rep movsb ; concatena segundo string com o primeiro
177 00E1 EB 01 90 jmp ExibeNomeArq
178
179 ;exibe nome arquivo
180 00E4 ExibeNomeArq:
181 00E4 BA 00A4r lea dx,varNome ; endereco da mensagem em DX
182 00E7 B4 09 mov ah,9 ; funcao exibir mensagem no AH
183 00E9 CD 21 int 21h
184 00EB EB 01 90 jmp abreArquivo
185 ;
186 ; abre arquivo para leitura
187 00EE abreArquivo:
188 00EE B4 3D mov ah,3dh
189 00F0 B0 00 mov al,0
190 00F2 BA 00A4r lea dx,varNome
191 00F5 CD 21 int 21h
192 00F7 73 0A jnc abriu_ok
193 00F9 BA 0063r lea dx,msgErro ; endereco da mensagem em DX
194 00FC B4 09 mov ah,9 ; funcao exibir mensagem no AH
195 00FE CD 21 int 21h ; chamada do DOS
196 0100 E9 FF2B jmp repete
197 ;
198 0103 A3 00A2r abriu_ok: mov handler,ax
199 0106 B4 3F laco: mov ah,3fh ; le um caracter do arquivo
200 0108 8B 1E 00A2r mov bx,handler
201 010C B9 0001 mov cx,1
202 010F BA 0129r lea dx,varBuffer
203 0112 CD 21 int 21h
204 0114 3B C1 cmp ax,cx
205 0116 75 17 jne fim
206 0118 8A 16 0129r mov dl, varBuffer ; escreve caracter na tela
207 011C B4 02 mov ah,2
208 011E CD 21 int 21h
209 ;
210 0120 8A 16 0129r mov dl, varBuffer ; escreve na tela at� encontrar um LF (fim de linha)
211 0124 80 FA 0A cmp dl, LF
212 0127 75 DD jne laco
213 ;
214 0129 B4 08 mov ah,8 ; espera pela digitacao de uma tecla qualquer
215 012B CD 21 int 21h
216 012D EB D7 jmp laco
217 ;
218
219 ; retorno ao DOS com codigo de retorno 0 no AL (fim normal)
220 012F fim:
221 012F B8 4C00 mov ax,4c00h ; funcao retornar ao DOS no AH
222 0132 CD 21 int 21h ; chamada do DOS
223
224 0134 poscursor proc ; posiciona o cursor na linha dada por DH e coluna dada por DL
225 0134 B4 02 mov ah,2 ; funcao posicionar cursor
226 0136 B7 00 mov bh,0 ; pagina 0 da memoria da placa de video
227 0138 CD 10 int 10h ; chama o servico do BIOS
228 013A C3 ret
Turbo Assembler Version 3.2 12/14/18 10:33:27 Page 5
T3.ASM
229 013B poscursor endp
230
231
232
233 013B fimEnter proc ; posiciona o cursor na linha dada por DH e coluna dada por DL
234 013B BA 003Dr lea dx,msgFimEnter ; endereco da mensagem em DX
235 013E B4 09 mov ah,9 ; funcao exibir mensagem no AH
236 0140 CD 21 int 21h ; chamada do DOS
237
238
239 0142 EB EB jmp fim
240 0144 C3 ret
241 0145 fimEnter endp
242 0145 codigo ends
243
244 ; a diretiva a seguir indica o fim do codigo fonte (ultima linha do arquivo)
245 ; e informa que o programa deve começar a execucao no rotulo "inicio"
246 end inicio
Turbo Assembler Version 3.2 12/14/18 10:33:27 Page 6
Symbol Table
Symbol Name Type Value
??DATE Text "12/14/18"
??FILENAME Text "T3 "
??TIME Text "10:33:27"
??VERSION Number 0314
@CPU Text 0101H
@CURSEG Text CODIGO
@FILENAME Text T3
@WORDSIZE Text 2
ABREARQUIVO Near CODIGO:00EE
ABRIU_OK Near CODIGO:0103
ACOPLAMOV Near CODIGO:00B5
ADIANTE Near CODIGO:0062
BACKSPACE Near CODIGO:0054
BKSPC Number 0008
CONTINUA Near CODIGO:0071
CORESPROGRAMA Byte DADOS:00A1
CR Number 000D
DEPOIS Near CODIGO:0047
ENTR Number 000D
ENTRADA Near CODIGO:0043
ENTRADAENTER Near CODIGO:0038
ESCP Number 001B
EXIBENOMEARQ Near CODIGO:00E4
FIM Near CODIGO:012F
FIMENTER Near CODIGO:013B
FIMLINHA Byte DADOS:009E
HANDLER Word DADOS:00A2
INICIO Near CODIGO:0000
LACO Near CODIGO:0106
LF Number 000A
LIMPATELA Near CODIGO:0007
MSGACHOU Byte DADOS:0094
MSGERRO Byte DADOS:0063
MSGFIMENTER Byte DADOS:003D
MSGIDENTIFICACAO Byte DADOS:0000
MSGNOMEARQ Byte DADOS:002B
POSCURSOR Near CODIGO:0134
REPETE Near CODIGO:002E
VARACHOMOV Word DADOS:01A9
VARBUFFER Byte DADOS:0129
VARNOME Word DADOS:00A4
VARSUXMOV Byte DADOS:0124
Groups & Segments Bit Size Align Combine Class
CODIGO 16 0145 Para none
DADOS 16 01AB Para none
PILHA 16 0100 Para Stack