-
Notifications
You must be signed in to change notification settings - Fork 0
/
write.asm
212 lines (194 loc) · 11.1 KB
/
write.asm
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
escribir macro ContieneHandle,EntradaDelFichero,MensajeDeMostramosError, GuardarEntradaTeclado, BufferLeerDisco, newl,score
LOCAL LeemosElFichero, CerramosElFichero, MostramosError
LEA DX,EntradaDelFichero ;Lo que hacemos con estas instrucciones
MOV AH,9 ;es pasar a la pantalla, el contenido
INT 21h
LEA DX,GuardarEntradaTeclado ; Puntero a la dirección para la entrada
MOV BYTE PTR [GuardarEntradaTeclado],60 ; Fijamos los 60 caracteres
MOV AH,10 ; función de entrada de teclado
INT 21h ; LLamar a la interrupción del DOS
MOV BL,[GuardarEntradaTeclado+1] ; Esta es la longitud efectiva tecleada
MOV BH,0
ADD BX,OFFSET GuardarEntradaTeclado ; apuntamos al final
MOV BYTE PTR [BX+2],0 ; ponemos el cero al final
LEA DX,GuardarEntradaTeclado+2 ; offset
MOV AL,2 ; Lo abrimos para lectura
MOV AH,3Dh ; Esta función nos abrirá el fichero
INT 21h ; Y ahora llamamos al DOS
JC MostramosError ; Mirando los flags si CF=1 Mostrariamos un error
MOV ContieneHandle,AX ; En el buffer reservado guardamos
LeemosElFichero:
MOV BX,ContieneHandle ;Movemos a BX el handle contenido en Contiene Hanndle
MOV CX,2000 ; 2000 será el número de bytes a leer
LEA DX,BufferLeerDisco ; dirección del BufferLeerDisco
MOV AH,3Fh ; Esta función es para leer del fichero
INT 21h ; Y aquí llamamos al DOS
JC MostramosError ;Si el flag CF=1 --> MostramosError
MOV CX,AX ; bytes leídos realmente
JCXZ CerramosElFichero ;Si es 0 leidos entonces no hay nada que i
PUSH AX ; preservarmos ax en La Pila
LEA BX,BufferLeerDisco ; imprimir BufferLeerDisco ...
; SacamosPorPantalla:
; MOV DL,[BX] ; carácter a carácter
; MOV AH,2 ; ir llamando al servicio 2 del
; INT 21h ; DOS para imprimir en pantalla
; INC BX ; siguiente carácter
; LOOP SacamosPorPantalla ; acabar caracteres
; POP AX ; recuperar nº de bytes leídos
; CMP AX,2000 ; ¿leidos 2000 bytes?
;LeemosElFichero:
MOV BX,ContieneHandle ;Movemos a BX el handle contenido en Contiene Hanndle
MOV CX,2
;LEA DX,BufferLeerDisco ;dirección del BufferLeerDisco
LEA DX,newl
MOV AH,40h ; Esta función es para escribir al archivo de texto
INT 21h ; Y aquí llamamos al DOS
JC MostramosError ;Si el flag CF=1 --> MostramosError
;LeemosElFichero:
MOV BX,ContieneHandle ;Movemos a BX el handle contenido en Contiene Hanndle
MOV CX,10
;100 será el número de bytes a leer
;LEA DX,BufferLeerDisco ;dirección del BufferLeerDisco
LEA DX,score
; lea dx, bufferleerdisco
MOV AH,40h ; Esta función es para escribir al archivo de texto
INT 21h ; Y aquí llamamos al DOS
JC MostramosError ;Si el flag CF=1 --> MostramosError
CerramosElFichero:
MOV BX,ContieneHandle ;Handle de acceso al fichero hilario.txt
MOV AH,3Eh ; CerramosElFichero
INT 21h ; Llamaremos al DOS
JC MostramosError
; sI EL FLAG CF = 1, QUE ESTARÍA EN CY --> MostramosError
jmp fin_escribir ; Y llegamos al fin del programa
MostramosError:
LEA DX,MensajeDeMostramosError ; MostramosError
MOV AH,9 ; función de escribir en consola
INT 21h ; Llamaremos al DOS
CMP ContieneHandle,0 ;Coparamos si el handle está 0 "!fichero abierto"!
JNE CerramosElFichero
jmp fin_escribir ; Y fin del programa
fin_escribir:
endm
;****Macro para escribir el puntaje en un txt
;.model small
;.stack 100h
;.data
;
; ContieneHandle DW 0 ; ContieneHandle de control del fichero
; EntradaDelFichero DB 13,10,"INTRODUCE EL NOMBRE DEL FICHERO: $"
; MensajeDeMostramosError DB 13,10," MostramosError.Mira si has escrito bien el fichero ***",13,10,10,"$"
; GuardarEntradaTeclado DB 80 DUP (0) ; BufferLeerDisco para leer desde el teclado
; BufferLeerDisco DB 2000 DUP (0) ; " " " " el disco
; newl DB 13,10
; cadena1 db 50,0,50 dup(?)
; score db "prueba_texto"
; numeros db "$"
; db "$"
; db "$"
; db "$"
; db "$"
;.code
; MOV AX,@DATA
; MOV DS,AX
;
; mov [numeros],30h
; mov [numeros+1],31h
; mov [numeros+2],30h
;
; escribir ContieneHandle,EntradaDelFichero,MensajeDeMostramosError, GuardarEntradaTeclado, BufferLeerDisco, newl,numeros
;
; mov ah,02h
; int 10h
;
;
; mov ah,4ch
; int 21h
;; mov ah,0ah ;Leer un string de caracteres, queda en dx -> cadena1
;; lea dx,cadena1
;; int 21h
;
;
;; LEA DX,EntradaDelFichero ;Lo que hacemos con estas instrucciones
;; MOV AH,9 ;es pasar a la pantalla, el contenido
;; INT 21h
;;
;; LEA DX,GuardarEntradaTeclado ; Puntero a la dirección para la entrada
;; MOV BYTE PTR [GuardarEntradaTeclado],60 ; Fijamos los 60 caracteres
;; MOV AH,10 ; función de entrada de teclado
;; INT 21h ; LLamar a la interrupción del DOS
;;
;; MOV BL,[GuardarEntradaTeclado+1] ; Esta es la longitud efectiva tecleada
;; MOV BH,0
;; ADD BX,OFFSET GuardarEntradaTeclado ; apuntamos al final
;; MOV BYTE PTR [BX+2],0 ; ponemos el cero al final
;;
;; LEA DX,GuardarEntradaTeclado+2 ; offset
;; MOV AL,2 ; Lo abrimos para lectura
;; MOV AH,3Dh ; Esta función nos abrirá el fichero
;; INT 21h ; Y ahora llamamos al DOS
;; JC MostramosError ; Mirando los flags si CF=1 Mostrariamos un error
;; MOV ContieneHandle,AX ; En el buffer reservado guardamos
;;
;; LeemosElFichero:
;; MOV BX,ContieneHandle ;Movemos a BX el handle contenido en Contiene Hanndle
;; MOV CX,2000 ; 2000 será el número de bytes a leer
;; LEA DX,BufferLeerDisco ; dirección del BufferLeerDisco
;; MOV AH,3Fh ; Esta función es para leer del fichero
;; INT 21h ; Y aquí llamamos al DOS
;; JC MostramosError ;Si el flag CF=1 --> MostramosError
;; MOV CX,AX ; bytes leídos realmente
;; JCXZ CerramosElFichero ;Si es 0 leidos entonces no hay nada que i
;; PUSH AX ; preservarmos ax en La Pila
;; LEA BX,BufferLeerDisco ; imprimir BufferLeerDisco ...
;;
;; ;SacamosPorPantalla:
;;; MOV DL,[BX] ; carácter a carácter
;;; MOV AH,2 ; ir llamando al servicio 2 del
;;; INT 21h ; DOS para imprimir en pantalla
;;; INC BX ; siguiente carácter
;;; LOOP SacamosPorPantalla ; acabar caracteres
;;; POP AX ; recuperar nº de bytes leídos
;;; CMP AX,2000 ; ¿leidos 2000 bytes?
;; ;LeemosElFichero:
;; MOV BX,ContieneHandle ;Movemos a BX el handle contenido en Contiene Hanndle
;; MOV CX,2
;; ;LEA DX,BufferLeerDisco ;dirección del BufferLeerDisco
;; LEA DX,newl
;; MOV AH,40h ; Esta función es para escribir al archivo de texto
;; INT 21h ; Y aquí llamamos al DOS
;; JC MostramosError ;Si el flag CF=1 --> MostramosError
;;
;; ;LeemosElFichero:
;; MOV BX,ContieneHandle ;Movemos a BX el handle contenido en Contiene Hanndle
;; MOV CX,50
;; ;100 será el número de bytes a leer
;; ;LEA DX,BufferLeerDisco ;dirección del BufferLeerDisco
;; LEA DX,numeros
;; ; lea dx, bufferleerdisco
;; MOV AH,40h ; Esta función es para escribir al archivo de texto
;; INT 21h ; Y aquí llamamos al DOS
;; JC MostramosError ;Si el flag CF=1 --> MostramosError
;;
;; CerramosElFichero:
;; MOV BX,ContieneHandle ;Handle de acceso al fichero hilario.txt
;; MOV AH,3Eh ; CerramosElFichero
;; INT 21h ; Llamaremos al DOS
;; JC MostramosError
;; ; sI EL FLAG CF = 1, QUE ESTARÍA EN CY --> MostramosError
;; MOV AH,4CH
;; INT 21h ; Y llegamos al fin del programa
;;
;; MostramosError:
;;
;; LEA DX,MensajeDeMostramosError ; MostramosError
;; MOV AH,9 ; función de escribir en consola
;; INT 21h ; Llamaremos al DOS
;; CMP ContieneHandle,0 ;Coparamos si el handle está 0 "!fichero abierto"!
;; JNE CerramosElFichero
;; MOV AH,4CH ; sí: CerramosElFicherolo
;; INT 21H ; Y fin del programa
;end
;
;
;