Ensamblador - Programación en ensamblador

 
Vista:
sin imagen de perfil
Val: 11
Ha disminuido 1 puesto en Ensamblador (en relación al último mes)
Gráfica de Ensamblador

Programación en ensamblador

Publicado por Andrés (4 intervenciones) el 16/08/2020 05:08:29
Hola soy nuevo en el lenguaje de Ensamblador y me tocó un trabajo que vale muchos puntos del cual no hemos recibido mucha materia y necesito su ayuda para poder conseguir esos puntos.
No sé si haya problemas de compatibilidad pero por si las dudas los pongo al tanto de que uso TASM (este es el ensamblador) V 3.2 y TLINK (este es linker (enlazador)) V 3.01 en el programa DosBox V 0.74-3.
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
.model small
.stack
.data
mensaje db "Curso: IC1400 Estudiante: Andres Martinez Fumero$"
mensaje2 db "Tarea de ASM Version 0.74-3 Fecha de Creacion: 15/08/20$"
salto db 13, 10, "$"
info db "Ingrese -H para ayuda, -M para Malespin, -E para Codif Num a Espanol y -N para Espanol a Codif Num$"
 
.code
main proc ; Inicia el proceso
mov ax,@data ; Se hace el set de @data
mov ds,ax ; Movemos los datos de data
mov ah,09h ; Función (Print String)
mov dx, offset mensaje ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset salto ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset mensaje2 ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset salto ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset info ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
main endp
end main
 
leerLetra:
mov ah,82h ; Lee la segunda posición del string
int 21h
cmp al,H ; Se compara con el carcter H
je Ayuda ; Salta a la etiqueta Ayuda
cmp al,M ; Se compara con el caracter M
je Malespin ; Salta a la etiqueta Malespin
cmp al,E ; Se compara con el caracter E
je Decodificar ; Salta a la etiqueta Decodificar
cmp al,N ; Se compara con el caracter N
je Codificar ; Salta a la etiqueta Codificar
 
Ayuda:
 
Malespin:
 
Decodificar:
 
Codificar:
La tarea requiere de documentación que explique los pasos que se realizan.
Lo de arriba es el código que tengo y en el archivo rar está la imagen de los requerimientos de la tarea.
De verdad les agradezco su ayuda y espero su respuesta cuanto antes, ya que, quedan alrededor de 26 horas para la entrega de la tarea.
Muchísimas gracias por su tiempo...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Programación en ensamblador

Publicado por Nacho (63 intervenciones) el 16/08/2020 15:07:50
Ya casi lo tienes

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
.model small
.stack
.data
 
mensaje db "Curso: IC1400 Estudiante: Andres Martinez Fumero$"
mensaje2 db "Tarea de ASM Version 0.74-3 Fecha de Creacion: 15/08/20$"
salto db 13, 10, "$"
 
info db 13,10, "Ingrese", 13, 10
i6 db "-H para ayuda,",13, 10
i1 db "-M para Malespin,",13, 10
i2 db "-E para Codif Num a Espanol",13, 10
i3 db "-N para Espanol a Codif Num", 13, 10
i4 db "-S para salir",13, 10
i5 db "Opcion $"
 
.code
main proc ; Inicia el proceso
mov ax,@data ; Se hace el set de @data
mov ds,ax ; Movemos los datos de data
mov ah,09h ; Función (Print String)
mov dx, offset mensaje ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset salto ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset mensaje2 ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset salto ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
call mostrarInfo
;mov ah,09h ; Función (Print String)
;mov dx, offset info ; Carga el mensaje a printear
;int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
call leerLetra
 
mov ax, 4c00h  ; salir del programa
int 21h
 
 
mostrarInfo proc        ; funcion que muestra la info del programa
 
   mov ah,09h ; Función (Print String)
   mov dx, offset info ; Carga el mensaje a printear
   int 21h ; Ejecuta la interrupcion 21h que llama al DOS
   ret
 
mostrarInfo endp
 
 
leerLetra proc
 
   xor ax,ax  ;Funcion 0
   int 16h    ;del teclado
 
   cmp al,'h' ; Se compara con el carcter H
   je Ayuda ; Salta a la etiqueta Ayuda
 
   cmp al,'m' ; Se compara con el caracter M
   je Malespin ; Salta a la etiqueta Malespin
 
   cmp al,'e' ; Se compara con el caracter E
   je Decodificar ; Salta a la etiqueta Decodificar
 
   cmp al,'n' ; Se compara con el caracter N
   je Codificar ; Salta a la etiqueta Codificar
 
   cmp al,'s' ; Se compara con el caracter S
   je Salir
 
   jmp leerLetra
 
leerLetra endp
 
Ayuda:          ; se muestra la ayuda
   call mostrarInfo
   jmp leerLetra
Malespin:
   jmp leerLetra
 
Decodificar:   ; se decodifica y se vuelve al menú
   jmp leerLetra
 
Codificar:     ; se codifica y se vuelve al menú
   jmp leerLetra
 
Salir:        ; se sale del programa
   ret
 
main endp
 
end main
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 11
Ha disminuido 1 puesto en Ensamblador (en relación al último mes)
Gráfica de Ensamblador

Programación en ensamblador

Publicado por Andrés Martínez Fumero (4 intervenciones) el 16/08/2020 18:24:39
El menú se ve bastante bien! Pero no me deja pasar de ahí porque no me deja ingresar caracteres y cuando presiono ciertos caracteres me lanza el menú de nuevo.
En la tarea dice que es mejor trabajar solo con mayúsculas por simplicidad entonces hice ese cambio pero igual de las dos formas está ese error que no me deja pasar. Si pudieras agregar una validación si el usuario ingresa una entrada incorrecta estaría genial!
De verdad que aprecio la ayuda, muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programación en ensamblador

Publicado por Nacho (63 intervenciones) el 16/08/2020 21:04:36
Una cosa es un menú y otra coger la línea de comandos. En tu programa están las cosas mezcladas.

Lo que he hecho yo es un menú en el que se pulsa una tecla, ni mayúscula ni minúscula. La línea de comandos está en el offset 82 pero no del segmento @data. Cuando tú lees esa posición en tu programa ds vale @data, que se lo has pasado en mov ax, @data mov ds, ax. La línea de comandos está en el offsett 82 del segmento ds que tiene el programa nada más cargarlo.

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
.model small
.stack
.data
 
letracomando db 0
 
mensaje db "Curso: IC1400 Estudiante: Andres Martinez Fumero$"
mensaje2 db "Tarea de ASM Version 0.74-3 Fecha de Creacion: 15/08/20$"
salto db 13, 10, "$"
 
info db 13,10, "Ingrese", 13, 10
i6 db "-H para ayuda,",13, 10
i1 db "-M para Malespin,",13, 10
i2 db "-E para Codif Num a Espanol",13, 10
i3 db "-N para Espanol a Codif Num", 13, 10
i4 db "-S para salir",13, 10
i5 db "Opcion $"
 
.code
main proc ; Inicia el proceso
 
mov di, 83h
mov cl, [di]
 
mov ax,@data ; Se hace el set de @data
mov ds,ax ; Movemos los datos de data
 
mov letracomando, cl
 
mov ah,09h ; Función (Print String)
mov dx, offset mensaje ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset salto ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset mensaje2 ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset salto ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
call mostrarInfo
;mov ah,09h ; Función (Print String)
;mov dx, offset info ; Carga el mensaje a printear
;int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
xor ax, ax
mov al, letracomando
push ax
call leerLetra
 
mov ax, 4c00h  ; salir del programa
int 21h
 
 
mostrarInfo proc        ; funcion que muestra la info del programa
 
mov ah,09h ; Función (Print String)
mov dx, offset info ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
ret
 
mostrarInfo endp
 
 
leerLetra proc
   LOCAL letra
 
   mov letra, ax
 
   xor ax,ax  ;Funcion 0
   int 16h    ;del teclado
 
   cmp al,'h' ; Se compara con el carcter H
   je Ayuda ; Salta a la etiqueta Ayuda
 
   cmp al,'m' ; Se compara con el caracter M
   je Malespin ; Salta a la etiqueta Malespin
 
   cmp al,'e' ; Se compara con el caracter E
   je Decodificar ; Salta a la etiqueta Decodificar
 
   cmp al,'n' ; Se compara con el caracter N
   je Codificar ; Salta a la etiqueta Codificar
 
   cmp al,'s' ; Se compara con el caracter S
   je Salir
 
   jmp leerLetra
 
leerLetra endp
 
 
Ayuda:          ; se muestra la ayuda
   call mostrarInfo
   jmp leerLetra
Malespin:
 
   jmp leerLetra
Decodificar:   ; se decodifica y se vuelve al menú
 
   jmp leerLetra
Codificar:     ; se codifica y se vuelve al menú
 
   jmp leerLetra
Salir:        ; se sale del programa
   ret
 
main endp
 
end main

Con eso tienes en el proc leerLetra el valor de la letra introducida después del guión. Con -h, la h. ¿Te animas a cambiar la función?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha disminuido 1 puesto en Ensamblador (en relación al último mes)
Gráfica de Ensamblador

Programación en ensamblador

Publicado por Andrés (4 intervenciones) el 16/08/2020 22:03:00
Lo siento, mala mía porque no me expliqué del todo bien.
Lo que necesito es el ejemplo de prueba a como viene al puro final del pdf del archivo adjunto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programación en ensamblador

Publicado por Nacho (63 intervenciones) el 17/08/2020 03:04:08
Ya, si lo que tienes que hacer ya veo lo que es, ¿pero tú sabes el trabajo que lleva hacer eso?
Sólo leer del PSP la línea de comando, comprobar que es correcta, qué tiene que hacer y pasar la frase que introduzcas al segmento ds del programa para procesarla ya es la leche.

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
.model small
.stack
.data
 
 
DECOD_TABLA_CHAR db "AEIOU"
COD_TABLA_CHAR db "4310V"
NUM_COD_CHAR dw 5
 
letracomando db 0
FRASE_COD db 50 dup (0)
FRASE_DECOD db 50 dup (0)
 
mensaje db "Curso: IC1400 Estudiante: Andres Martinez Fumero$"
mensaje2 db "Tarea de ASM Version 0.74-3 Fecha de Creacion: 15/08/20$"
salto db 13, 10, "$"
 
info db 13,10, "Ingrese", 13, 10
i6 db "-H para ayuda,",13, 10
i1 db "-M para Malespin,",13, 10
i2 db "-E para Codif Num a Espanol",13, 10
i3 db "-N para Espanol a Codif Num", 13, 10
i4 db "-S para salir",13, 10
i5 db "Opcion $"
 
.code
main proc ; Inicia el proceso
 
mov di, 83h
mov cl, [di]
 
mov ax,@data ; Se hace el set de @data
mov ds,ax ; Movemos los datos de data
 
mov letracomando, cl
 
mov ah,09h ; Función (Print String)
mov dx, offset mensaje ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset salto ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset mensaje2 ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
mov ah,09h ; Función (Print String)
mov dx, offset salto ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
call mostrarInfo
;mov ah,09h ; Función (Print String)
;mov dx, offset info ; Carga el mensaje a printear
;int 21h ; Ejecuta la interrupcion 21h que llama al DOS
 
xor ax, ax
mov al, letracomando
push ax
call leerLetra
 
mov ax, 4c00h  ; salir del programa
int 21h
 
 
mostrarInfo proc        ; funcion que muestra la info del programa
 
mov ah,09h ; Función (Print String)
mov dx, offset info ; Carga el mensaje a printear
int 21h ; Ejecuta la interrupcion 21h que llama al DOS
ret
 
mostrarInfo endp
 
 
sacarFrasePSP proc
 
 
   ret
 
sacarFrasePSP endp
 
 
 
 
codChar proc    ;codifica el carácter que entra en al
 
   mov cx, NUM_COD_CHAR
 
   mov bx, offset DECOD_TABLA_CHAR
   add bx, cx
   dec bx
cc:mov ah, [bx]
   cmp al, ah
   jne l1
   add bx, NUM_COD_CHAR
   mov al, [bx]
   jmp r1
 
l1:dec bx
   loop cc
r1:ret
 
codChar endp
 
 
decodChar proc    ;codifica el carácter que entra en al
 
   mov cx, NUM_COD_CHAR
 
dc:
 
   loop dc
 
decodChar endp
 
 
 
leerLetra proc
   LOCAL letra
 
   mov letra, ax
 
   xor ax,ax  ;Funcion 0
   int 16h    ;del teclado
 
   cmp al,'h' ; Se compara con el carcter H
   je Ayuda ; Salta a la etiqueta Ayuda
 
   cmp al,'m' ; Se compara con el caracter M
   je Malespin ; Salta a la etiqueta Malespin
 
   cmp al,'e' ; Se compara con el caracter E
   je Decodificar ; Salta a la etiqueta Decodificar
 
   cmp al,'n' ; Se compara con el caracter N
   je Codificar ; Salta a la etiqueta Codificar
 
   cmp al,'s' ; Se compara con el caracter S
   je Salir
 
   jmp leerLetra
 
leerLetra endp
 
 
Ayuda:          ; se muestra la ayuda
   call mostrarInfo
   jmp leerLetra
Malespin:
 
   jmp leerLetra
Decodificar:   ; se decodifica y se vuelve al menú
 
 
   jmp leerLetra
Codificar:     ; se codifica y se vuelve al menú
   mov al, 'E'
   call codChar
   jmp leerLetra
Salir:        ; se sale del programa
   ret
 
 
 
 
 
main endp
 
end main

Se supone que la codificación numérica esa la mejor manera de hacerla será con dos tablas, una con los caracteres sin codificar y otra codificados. Yo he puesto dos en la que están sólo las vocales.

Si le das a la n llama a la funcón que codifica pasándole una E. Con esa función puedes pasarle el carácter que quieras en al y si está en la tabla de vocales te devuelve el carácter codificado. Para descodificar es lo mismo pero al revés.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar