ASM x86 – Windows – ROT13

Hola Mundo
Ubyn Zhaqb
Hola Mundo

;##########################################################################################################
;# rot13Win.asm
;# Sintaxis NASM
;#
;# Ejemplo de la implementación del cifrado ROT13 en ensamblador x86 para Windows.
;#
;# Ensamblar:
;#     nasm -f win32 rot13Win.asm
;# Linkar:
;#     golink /entry main /console /mix rot13Win.obj kernel32.dll
;##########################################################################################################

[CPU 386]        ;un par de directivas realmente no necesarias
[BITS 32]
[GLOBAL main]    ;define el punto de entrada del programa

[EXTERN _GetStdHandle@4]       ;declaración de la API de Windows
[EXTERN _WriteFile@20]         ;
[EXTERN _ExitProcess@4]        ;

[SECTION .data]
cadena  DB      "Hola Mundo", 13, 10        ;cadena de texto
cadLen  EQU     $ - cadena                  ;longitud de la cadena de texto

[SECTION .text]
        main:
                CALL    printStr          ;imprime la cadena en pantalla

                PUSH    cadLen
                PUSH    cadena
                CALL    rot13             ;cifra la cadena

                CALL    printStr          ;imprime la cadena en pantalla

                PUSH    cadLen
                PUSH    cadena
                CALL    rot13             ;se descifra la cadena

                CALL    printStr          ;imprime la cadena en pantalla

                PUSH    0
                CALL    _ExitProcess@4    ;termina el proceso con el código de error 0 (sin error)

        ;
        ; Imprime una cadena de texto en pantalla.
        ;
        ; Locales: lpNumberOfBytesWritten:DWORD = [ebp - 4] > Dirección de memoria donde se guarda el
        ;                                                    resultado de bytes escritos.
        ;
        ; Utiliza: eax
        ;          edx
        ;          ebp
        ;
        printStr:
                PUSH   ebp         ;prólogo de la pila
                MOV    ebp, esp
                SUB    esp, 4

                PUSH    -11
                CALL    _GetStdHandle@4

                PUSH    0
                LEA     edx, [ebp - 4]
                PUSH    edx
                PUSH    cadLen
                PUSH    cadena
                PUSH    eax
                CALL    _WriteFile@20

                MOV     esp, ebp   ;epílogo
                POP     ebp
                RET

        ;
        ; Cifra o Descifra una cadena de texto en ROT13.
        ;
        ; Parámetros: cadena:DWORD = [esp + 4] > Cadena de texto.
        ;              cadLen:DWORD = [esp + 8] > Longitud de la cadena.
        ;
        ; Utiliza: eax (al)
        ;          ecx
        ;          edx
        ;
        rot13:
                MOV     edx, [esp + 4]	    ;copia el parámetro cadena:DWORD en EDX
                MOV     ecx, [esp + 8]	    ;copia el parámetro cadLen:DWORD en ECX

                .loop:                    	    ;comienza el bucle para analizar los bytes de cadena:DWORD
                        MOV     al, BYTE [edx]	    ;copia el byte de la posición actual de cadena:DWORD en AL para analizarlo

                        CMP     al, 'A'             ;compara AL con: [ASCII:A = Dec:65 = Hex:41]
                        JB      .next               ;si es menor, se ignora el byte y se salta a .next para analizar el siguiente byte

                        CMP     al, 'N'             ;compara AL con: [ASCII:N = Dec:78 = Hex:4E]
                        JB      .add13              ;si es menor, se salta a .add13 para realizar el desplazamiento sumándole 13

                        CMP     al, 'Z'             ;compara AL con: [ASCII:Z = Dec:90 = Hex:5A]
                        JBE     .sub13              ;si es menor o igual, se salta a .sub13 para realizar el desplazamiento restándole 13

                        CMP     al, 'a'             ;compara AL con: [ASCII:a = Dec:97 = Hex:61]
                        JB      .next               ;si es menor, se ignora el byte y se salta a .next para analizar el siguiente byte

                        CMP     al, 'n'             ;compara AL con: [ASCII:n = Dec:110 = Hex:6E]
                        JB      .add13              ;si es menor, se salta a .add13 para realizar el desplazamiento sumándole 13

                        CMP     al, 'z'             ;compara AL con: [ASCII:z = Dec:122 = Hex:7A]
                        JA      .next	            ;si es mayor, se ignora el byte y se salta a .next para analizar el siguiente byte
                                                    ;si es menor o igual, continua en .sub13 para realizar el desplazamiento restándole 13

                .sub13:                         ;
                        SUB     al, 13          ;resta 13 al byte en AL
                        MOV     [edx], al       ;copia AL a la posición actual de cadena:DWORD
                        JMP     .next	        ;salta a .next para analizar el siguiente byte

                .add13:                         ;
                        ADD     al, 13          ;le suma 13 al byte en AL
                        MOV     [edx], al       ;copia AL a la posición actual de cadena:DWORD
                                                ;continua  en .next para analizar el siguiente byte

                .next:                      ;
                        ADD     edx, 1      ;incrementa cadena:DWORD en uno para poder analizar al siguiente byte
                        LOOP    .loop       ;disminuye cadLen:DWORD en uno, y continua el bucle solo si es mayor que 0.

                .end:
                RET     4     ;retorna limpiando las variables locales de la pila

, , ,

  1. Deja un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: