Advertisement
TomasGhilino

CODIGO CESAR ARM ASSEMBLY / GRUPO 9 / GHILINO TOMAS

Jun 16th, 2021 (edited)
2,201
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 10.37 KB | None | 0 0
  1. .data
  2. bienvenida: .asciz "Ingrese una cadena valida poder codificar/decodificar a continuacion: \n"
  3. input: .asciz ""
  4. longitudInput: .space 140
  5. frase: .asciz "OUTPUT: \n"
  6. mensaje: .asciz ""
  7. longitudMensaje: .space 100
  8. clave: .space 100
  9. opciones: .space 100
  10. despedida: .asciz "Se procesaron la siguiente cantidad de caracteres: "
  11. caracteres: .space 100
  12.  
  13. error_mensaje: .asciz "Usted uso un parametro incorrecto, revise nuevamente. \n"
  14. testeo: .space 100
  15. enter: .ascii "\n"
  16.  
  17. pista: .asciz "MESSI"
  18. msjpista: .asciz "El desplazamiento que se utilizo con la clave 'MESSI' fue de: 5"
  19.  
  20. .text
  21.  
  22. @---------------------------------------------------
  23. @recibe en r0 el puntero a string1
  24. @recibe en r1 el puntero a string2
  25. @r4 = 1 si true, 0 si false
  26. compararString:
  27.         .fnstart
  28.         ciclo10:
  29.         ldrb r3, [r0]   @ cargo string 1 y 2
  30.         ldrb r4, [r1]
  31.         cmp r3, #0      @ si termino de iterar es pq todo es igual = true
  32.         beq true
  33.  
  34.         cmp r3, r4      @ si char1 != char2 entonces es false
  35.         bne false
  36.  
  37.         b iterar10       @ si no termino el string todavia, iterar
  38.  
  39.         iterar10:
  40.         add r0, #1
  41.         add r1, #1      @ siguente char
  42.         b ciclo10
  43.         false:
  44.         mov r4, #0
  45.         b salir10
  46.         true:
  47.         mov r4, #1
  48.         b salir10
  49.         salir10:
  50.         bx lr
  51.         .fnend
  52.  
  53. @---------------------------------------------------
  54. @ r0, puntero a  'caracteres'
  55. @ toma en r1, r2 ,r3 los ascii de los carac procesados
  56. @ asigna al string 'caracteres' el numero transformado a ascii para imprimir
  57. escribirCarac:
  58.     .fnstart
  59.     ldr r0, =caracteres
  60.     ldrb r4, [r0]
  61.  
  62.     strb r3,[r0]
  63.     add r0, #1
  64.  
  65.     ldrb r4, [r0]
  66.     strb r2, [r0]
  67.     add r0, #1
  68.  
  69.     strb r1, [r0]
  70.     add r0, #1
  71.  
  72.     mov r6, #'\n'
  73.     strb r6, [r0]
  74.  
  75.     bx lr
  76.     .fnend
  77. @----------------------------------------------------
  78. convertir:
  79. @input:
  80. @r0=el entero a convertir, @asumo no voy a trabajar con numeros de mas de 3 digitos
  81. @output:
  82. @r1= el codigo ascii de las unidades
  83. @r2= el codigo ascii de las decenas
  84. @r3= el codigo ascii de las centenas
  85. @-------------------------------------------------------------
  86.     .fnstart            @guardamos la dirección de retorno
  87.     push {lr}
  88.  
  89.     mov r1, r0
  90.     mov r2, #100
  91.     bl division         @r0= A/B, r1=resto(A/B)
  92.     mov r3, r0          @r3 = r0/100 @en r3 tenemos las centenaS
  93.  
  94.  
  95.     mov r0, r1          @ r0 = resto(r0/100)
  96.                 @calculamos las decenas en el resto que me quedo de la anterior division
  97.     mov r1, r0
  98.     mov r2, #10
  99.     bl division         @r0= A/B, r1=resto(A/B)
  100.     mov r2, r0
  101.     mov r0, r1
  102.  
  103.     mov r1, r0
  104.  
  105.     add r1, #48         @codigo ascii de las unidades
  106.                         @r2=r2+48 =2 + 48 = 50
  107.     add r2,#48      @codigo ascii de las decenas
  108.                         @r3=r3+48 =1 + 48 = 49
  109.     add r3, #48         @codigo ascii de las centenas
  110.  
  111.     pop {lr}
  112.     bx lr           @volvemos a donde nos llamaron
  113.     .fnend
  114.  
  115.  
  116. @--------------------------------------------------------------
  117. division:
  118. @ dividimos A/B
  119. @ output: r0 = A/B, r1 = resto (A/B)
  120.     .fnstart
  121.     mov r0, #0
  122.     @while( A >= B )
  123.     ciclo9:
  124.     cmp r1, r2
  125.     bcc  finCiclo  @si A<B
  126.  
  127.     sub r1, r1, r2
  128.     add r0, r0, #1
  129.     b ciclo9
  130.     finCiclo:
  131.     bx lr
  132.     .fnend
  133.  
  134. @@@----------------------------------------------------------
  135. @ recibe en r0 el puntero a la cadena
  136. @ devuelve en r0 la longitud de la cadena
  137.  
  138. longitud:
  139.     .fnstart
  140.     mov r1, r0
  141.     mov r0, #0
  142.  
  143.     ciclo0:
  144.     ldrb r3, [r1, r0]
  145.     cmp r3, #0
  146.     beq salir0
  147.  
  148.     add r0, #1
  149.     b ciclo0
  150.  
  151.     salir0:
  152.  
  153.     bx lr
  154.     .fnend
  155.  
  156. @---------------------------------------------------------
  157. leerMensaje:
  158.  
  159. @Parametros inputs: no tiene
  160. @Parametros output:
  161. @r0=char leido
  162.     .fnstart
  163.     mov r7, #3    @ Lectura x teclado
  164.     mov r0, #0      @ Ingreso de cadena
  165.  
  166.     ldr r2, =longitudInput @ Leer # caracteres
  167.     ldr r1, =input @ donde se guarda la cadena ingresada
  168.     swi 0        @ SWI, Software interrup
  169.     ldr r0, [r1]
  170.  
  171.     bx lr @volvemos a donde nos llamaron
  172.     .fnend
  173. @----------------------------------------------------------
  174. imprimirString:
  175.     .fnstart
  176.     push {lr}
  177.     @Parametros inputs:
  178.     @r1=puntero al string que queremos imprimir
  179.     @r2=longitud de lo que queremos imprimir
  180.     mov r7, #4 @ Salida por pantalla
  181.     mov r0, #1      @ Indicamos a SWI que sera una cadena
  182.     swi 0    @ SWI, Software interrup
  183.     pop {lr}
  184.     bx lr @salimos de la funcion mifuncion
  185.     .fnend
  186.  
  187. @---------------------------------------------------------------------
  188. @ hace un salto de linea
  189. newLine:
  190.         .fnstart
  191.         push {lr}
  192.         mov r2, #1 @Tamaño de la cadena
  193.         ldr r1, =enter   @Cargamos en r1 la direccion del mensaje
  194.         bl imprimirString
  195.         pop {lr}
  196.         bx lr @salimos de la funcion mifuncion
  197.         .fnend
  198.  
  199. @----------------------------------------------------------
  200. @ recibe en r1 el puntero al buffer
  201. @ recibe en r2 el puntero a la cadena vacia de mensaje
  202. extraer_mensaje:
  203.      .fnstart
  204.      ciclo1:
  205.      ldrb r3, [r1] @ pos del mensaje input del usuario
  206.      ldrb r0, [r2] @ pos del string vacio
  207.      cmp r3, #59
  208.      beq salirse1      @ hasta aca recorro la cadena y si es ; salgo porque
  209.                          @ termina msj
  210.      strb r3,[r2]    @ agrego el char a la direc de memoria de mensaje
  211.  
  212.      b iterar1          @ siguiente char
  213.  
  214.      iterar1:
  215.      add r1, #1
  216.      add r2, #1
  217.      b ciclo1
  218.      salirse1:
  219.      bx lr
  220.      .fnend
  221.  
  222.  
  223. @-------------------------------------------------------------------
  224. @ recibe en r1 el puntero al input
  225. @ recibe en r2 el puntero a la cadena vacia de clave
  226. @ en r0 se cuenta las apariciones de ;
  227. extraer_clave:
  228.     .fnstart
  229.     ciclo2:
  230.     ldrb r3,[r1] @ pos del mensaje input del usuario
  231.              
  232.  
  233.     cmp r3, #59
  234.     beq esPuntoYComa
  235.     bne noEsPuntoYComa
  236.  
  237.  
  238.     noEsPuntoYComa:
  239.     cmp r0, #2  @ cuando aparece por segunda vez un ; me salgo
  240.     beq salirse2
  241.  
  242.     cmp r0, #0
  243.     beq iterar2
  244.  
  245.     ldrb r6,[r2]
  246.  
  247.     mov r4, r3
  248.     strb r4, [r2]
  249.     add r2, #1   @ si r0 = 1 entonces estoy en la clave, agrego el char
  250.     b iterar2    @ siguiente char
  251.  
  252.     esPuntoYComa:
  253.     add r0, #1
  254.     b iterar2
  255.  
  256.     iterar2:
  257.     add r1, #1
  258.     b ciclo2
  259.  
  260.     salirse2:
  261.     bx lr
  262.     .fnend
  263. @---------------------------------------------------------------------
  264. @ recibe en r1 la direccion de input
  265. @ recibe en r2 la direccion de opcion
  266. @ r0 = contador de ;
  267. extraer_opcion:
  268.     .fnstart
  269.     ciclo3:
  270.     ldrb r3, [r1]
  271.     ldrb r5, [r2]
  272.  
  273.     cmp r3, #59
  274.     beq esPuntoYComa2
  275.     bne noEsPuntoYComa2
  276.  
  277.     noEsPuntoYComa2:
  278.  
  279.     cmp r3, #0
  280.     beq salirse3
  281.  
  282.     cmp r0, #2
  283.     blt iterar3
  284.  
  285.     mov r4, r3
  286.     strb r4, [r2]
  287.     b salirse3
  288.  
  289.     esPuntoYComa2:
  290.     add r0, #1
  291.     b iterar3
  292.  
  293.     iterar3:
  294.     add r1, #1
  295.     b ciclo3
  296.  
  297.     salirse3:
  298.     bx lr
  299.     .fnend
  300. @--------------------------------------------------
  301. @ r0 recibE el puntero al mensaje
  302. @ r6 recibe el shift
  303. codificarlo:
  304.     .fnstart
  305.     push {lr}
  306.     ciclo5:
  307.     ldrb r1, [r0]
  308.     cmp r1, #0
  309.     beq salir5
  310.  
  311.     cmp r1, #32
  312.     beq iterar5
  313.  
  314.  
  315.     add r1, r6  @#95
  316.     cmp r1, #91
  317.     bge sePaso          @si es mayor a Z
  318.                      
  319.     mov r2, r1
  320.     strb r2, [r0]
  321.     b iterar5
  322.  
  323.     sePaso:
  324.     sub r1, #26 @ cantidad fija si se pasa
  325.     mov r2, r1
  326.     strb r2, [r0]
  327.     b iterar5
  328.  
  329.     iterar5:
  330.     add r0, #1
  331.     b ciclo5
  332.     salir5:
  333.     pop {lr}
  334.     bx lr
  335.     .fnend
  336. @----------------------------------------------------
  337. decodificarlo:
  338. @recibe en r0 puntero del mensaje
  339. @ r6 = shift
  340.     .fnstart
  341.     push {lr}
  342.     ciclo6:
  343.     ldrb r1, [r0]
  344.     cmp r1, #0
  345.     beq salir6
  346.  
  347.     cmp r1, #32
  348.     beq iterar6
  349.  
  350.  
  351.     sub r1, r6
  352.     cmp r1, #64 @ si es menor que A
  353.     ble sePaso2
  354.  
  355.     mov r2, r1
  356.     strb r2, [r0]
  357.     b iterar6
  358.  
  359.     sePaso2:
  360.     add r1, #26 @ cantidad fija si se pasa
  361.     mov r2, r1
  362.     strb r2, [r0]
  363.     b iterar6
  364.  
  365.     iterar6:
  366.     add r0, #1
  367.     b ciclo6
  368.     salir6:
  369.     pop {lr}
  370.     bx lr
  371.     .fnend
  372. @-------------------------------------------------------------------------------
  373. @ r0 -- recibe el puntero del ascii
  374. @ r6 -- devuelve el inmediato del entero
  375. convertir_ascii_a_entero:
  376.     .fnstart
  377.     push {lr}
  378.     ldrb r1, [r0]
  379.     sub r1, #0x30
  380.     mov r6, r1
  381.     b salir7
  382.     salir7:
  383.     pop {lr}
  384.     bx lr
  385.     .fnend
  386.  
  387. @---------------------------------------------------
  388.  
  389. .global main
  390. main:
  391.  
  392.     ldr r1, =bienvenida
  393.     mov r2, #90
  394.     bl imprimirString        @ imprime "Ingrese una cadena valida para poder codificar/decodificar a continuacion:"
  395.     bl newLine
  396.     bl newLine
  397.  
  398.     bl leerMensaje          @ input = leerMensaje *esto lee el string del usuario*
  399.     bl newLine
  400.     bl newLine
  401.  
  402.     ldr r1, =frase
  403.     mov r2, #90
  404.     bl imprimirString        @imprime "OUTPUT:"
  405.  
  406.     ldr r1, =input
  407.     ldr r2, =mensaje
  408.     bl extraer_mensaje      @ mensaje = extraer_mensaje(input)
  409.  
  410.     ldr r1, =input
  411.     ldr r2, =clave
  412.     mov r0, #0
  413.     bl extraer_clave        @ clave = extraer_clave(input)
  414.  
  415.  
  416.     ldr r1, =input
  417.     ldr r2, =opciones
  418.     mov r0, #0
  419.     bl extraer_opcion       @ opcion = extraer_opcion(input)
  420.  
  421.     ldr r0, =clave
  422.     bl longitud
  423.     cmp r0, #1          @ if (longitud(clave) > 1) : decodificarConPista (en esta funcion se verifica todo igual)
  424.     bgt decodificarConPista     @ if (longitud(clave) == 1) : decodificarConEntero
  425.     b codificar_decodificar
  426.  
  427.     codificar_decodificar:
  428.     ldr r0, =clave          @Aca se convierte el ascii a entero
  429.     bl convertir_ascii_a_entero @ y se decide si codificar o decodificar
  430.  
  431.     ldr r1, =opciones
  432.     ldrb r1,[r1]
  433.     cmp r1, #'C'            @ if(opcion == 'C') : codificarlo(mensaje)
  434.     bne check2
  435.  
  436.     ldr r0, =mensaje
  437.     bl codificarlo
  438.     b imprimirOutput
  439.  
  440.     check2:
  441.     cmp r1, #'D'            @ if(opcion == 'D') : decodificarlo(mensaje)
  442.     bne error           @ si no es 'C' o 'D' la opcion, tira msj de error
  443.  
  444.     ldr r0, =mensaje
  445.     bl decodificarlo
  446.     b imprimirOutput
  447.  
  448.     error:
  449.     ldr r1, =error_mensaje
  450.     mov r2, #99
  451.     bl imprimirString
  452.     b fin
  453.  
  454.     decodificarConPista:
  455.     ldr r0, =clave
  456.     ldr r1, =pista
  457.     bl compararString
  458.     cmp r4, #0          @ Si la clave no es "MESSI", tira msj error porque no es entero ni palabra clave
  459.     beq error
  460.  
  461.     ldr r0, =mensaje
  462.     mov r6, #5          @ La pista "MESSI" tiene un shift de 5
  463.     bl decodificarlo
  464.  
  465.     mov r2, #100
  466.     ldr r1, =msjpista
  467.     bl imprimirString       @ imprimir(msjpista) una vez que se decodifique con el shift de "MESSI"
  468.     bl newLine
  469.  
  470.     imprimirOutput:         @ imprimirOutput lo que hace es informar de los caracteres procesados
  471.     mov r2, #100
  472.     ldr r1, =mensaje
  473.     bl imprimirString       @ imprime el mensaje codificado / decodificado
  474.     bl newLine
  475.  
  476.  
  477.     ldr r0, =mensaje
  478.     bl longitud
  479.     bl convertir
  480.     bl escribirCarac        @ pasa los carac procesados a ascii
  481.     bl newLine
  482.  
  483.  
  484.     mov r2, #100
  485.     ldr r1, =despedida
  486.     bl imprimirString       @ imprime el mensaje final con los carac procesados
  487.  
  488. fin:
  489.     mov r7, #1
  490.     swi #0
  491.  
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement