You are on page 1of 5

LENGUAJE ENSAMBLADOR

ABDIEL SINAI VERA PONCE


ALUMNO

RAMON LOZANO SAVALA


PROFESOR

Derecho a Examen

LENGUAJE ENSAMBLADOR
ASIGNATURA

ING. EN SISTEMAS COMPUTACIONALES


CARRERA

1501
GRUPO

Este pequeo ejercicio de lenguaje ensamblador es para la arquitectura x86 (Procesadores Intel y Amd 32 bits) y utiliza la sintaxis de Nasm, un ensamblador libre, gratuito y que puede ser utilizado en diferentes plataformas como Windows o Linux. Adems, las funciones externas utilizadas provienen de la biblioteca de C estndar. El objetivo es el de escribir una funcin en ensamblador capaz de invertir una cadena de caracteres. Esta funcin deber aceptar como parmetro de entrada un puntero hacia una cadena de caracteres e invertir esta cadena en el mismo puntero.

ESTO ES UN EJEMPLO EN FUNCIN EN C:


void invertir_cadena(char *str); //El modelo de esta funcin //Ejemplo de uso: char string[] = "Esta es la cadena a invertir"; invertir_cadena(string); printf(string); //Mostrar "ritrevni a anedac al se atsE"

CDIGO INICIAL:
extern printf section .data cadena db 'invierteme! yo te dire que programador eres!', 0x0 section .text global main, invertir_cadena invertir_cadena: ; pon el cdigo aqu

main: mov eax, cadena ;direccion de cadena en eax push eax ;llamado de invertir_cadena con la direccin de la cadena a invertir call invertir_cadena ;las dos lneas siguientes son opcionales ya que la direccin de la cadena (ahora invertida) siempre est en la pila. mov eax, cadena; direccin de la cadena en eax push eax ;visualizacin de la cadena con printf call printf add esp, 4 ;salimos de la funcin main mov eax, 0

NOCIONES TRATADAS EN ESTE EJERCICIO Las funciones con parmetro de entrada Los saltos La pila Las cadenas de caracteres

POSIBLE SOLUCIN:
invertir_cadena: ;Inicio de la funcin push ebp mov ebp, esp ;Cargamos el puntero pasado como parmetro en eax mov eax, [ebp+8] ;Introducimos el carcter de fin de cadena en la pila push word 0 cadena_en_pila: ;Vamos a apilar cada carcter de la cadena ;Recuperacin del carcter actual mov bl, byte [eax] ;Es el fin de la cadena? (bl = 0 ?) test bl, bl ;Si es s pasamos a la etapa siguiente jz fin_cadena_en_pila ;Si no apilamos el siguiente carcter push bx ;Incrementamos el puntero en 1 para procesar el siguiente carcter inc eax ;Pasamos al siguiente carcter jmp cadena_en_pila fin_cadena_en_pila: ;Volvemos a cargar el puntero de la cadena para desapilar uno a uno cada carcter mov eax, [ebp + 8] invertir: ;Desapilamos el carcter actual pop bx ;Lo cargamos en el puntero de cadena mov byte [eax], bl ;Incrementamos la direccin inc eax ;Era el fin de la cadena? (el 0 que hemos apilado al inicio?) test bl, bl ;No entonces continuamos jnz invertir ;Es el fin de la cadena, indicamos el fin de la funcin leave ret

Ejercicio Realizado con el siguiente cdigo:


section .data section .text invertir_cadena: SEGMENT PARA PUBLIC missatge DB 'Inserta un Texto',cr,lf,'$' maxcad DB 30 lencad DB 0 cadena DB 30 DUP(0) girat DB 30 DUP(0) linia_blanc DB cr,lf,'$' missatge2 DB 'Voler a intentarlo?',cr,lf,'$' maxcad2 DB 2 ;longitud mxima. lencad2 DB 0 ;longitud leida. cadena2 DB 2 DUP(0) ;buffer que contendr el texto introducido. dades ENDS codi SEGMENT PARA PUBLIC 'code' main PROC FAR ASSUME CS:codi,DS:dades,SS:pila,ES:dades mov ax,dades mov ds,ax mov es,ax inicio: print missatge read maxcad print linia_blanc mov bx,0 pushpila: mov al, cadena[bx] push ax inc bl cmp bl, lencad jne pushpila mov bx, 0 salir: mov ax,4c00h int 21h main ENDP codi ENDS pila SEGMENT PARA STACK 'stack' DB 128 DUP(0) pila ENDS END main salir: mov ax,4c00h int 21h main endp codi ends pila segment para stack 'stack' db 128 dup(0) pila ends end main main: mov eax, cadena ;direccion de cadena en eax push eax ;llamado de invertir_cadena con la direccin de la cadena a invertir call invertir_cadena ;las dos lneas siguientes son opcionales ya que la direccin de la cadena (ahora invertida) siempre est en la pila. mov eax, cadena; direccin de la cadena en eax push eax ;visualizacin de la cadena con printf call printf add esp, 4 ;salimos de la funcin main mov eax, 0

;pide que se introduzca un mensaje y lo guarda en maxcad ;imprime lina en blanco ;pone el registro bx a 0

;movemos la cadena introducida a al

;hacemos la comparacion para que el proceso se repita mientras bl no sea 0

VISUALIZACIN:

Conclusin: Esta prctica fue realizada gracias a los comandos adquiridos en clases pasadas y as poder realizar el programa. Este fue un pequeo programa para despus evolucionar y crear mas programas en lenguaje ensamblador.

You might also like