Implementación de una función de comparación de cadenas sin distinguir mayúsculas y minúsculas en ensamblador

Implementación en ensamblador x86 de 32 bits de una función que compara cadenas sin distinguir mayúsculas y minúsculas, usando syscalls en Linux.

Breve Introducción

Implementación de una función de comparación de cadenas sin distinguir mayúsculas y minúsculas en ensamblador (assembly)
DESCRIPCIÓN:
Este ejemplo muestra cómo implementar una función en ensamblador x86 de 32 bits que compara dos cadenas ignorando las diferencias entre mayúsculas y minúsculas. La función devuelve 0 si las cadenas son iguales (sin distinguir mayúsculas y minúsculas), un valor negativo si la primera cadena es lexicográficamente menor, y un valor positivo si es mayor. El código está escrito para un entorno Linux, utiliza llamadas al sistema para entrada/salida y sigue la convención cdecl.

NOTAS ADICIONALES:
El código maneja solo cadenas ASCII estándar y no soporta caracteres Unicode o codificaciones multibyte. La función convierte los caracteres mayúsculos a minúsculos sumando 32 si el carácter está entre 'A' y 'Z'. La entrada está codificada directamente para simplicidad, pero puede modificarse para leer desde stdin o memoria.

EXPLICACIONES:
- La función 'strcasecmp_asm' toma dos punteros a cadenas en ESI y EDI y compara los caracteres uno a uno.
- Para cada carácter, si es una letra mayúscula (entre 'A' y 'Z'), se convierte a minúscula sumando 32.
- La comparación continúa hasta encontrar un carácter nulo '\0' o una diferencia entre caracteres.
- El valor de retorno es similar a strcmp: 0 si son iguales, <0 si la primera cadena es menor, >0 si es mayor.
- En main se muestra un ejemplo de uso con dos cadenas codificadas y se imprime el resultado.

Código de Ejemplo: assembly

; Implementación de comparación sin distinguir mayúsculas y minúsculas entre dos cadenas en ensamblador x86 de 32 bits
; Convención cdecl: parámetros en pila, resultado en EAX
; Syscall de Linux para salida

section .data
    str1 db 'HelloWorld',0
    str2 db 'helloworld',0
    msg_equal db 'Las cadenas son iguales (sin distinguir mayúsculas y minúsculas).',10,0
    msg_diff db 'Las cadenas son diferentes.',10,0

section .bss

section .text
    global _start

; Función: int strcasecmp_asm(const char *s1, const char *s2)
; Parámetros: s1 en [esp+4], s2 en [esp+8]
; Retorno: EAX = 0 si iguales, <0 si s1 < s2, >0 si s1 > s2 (sin distinguir mayúsculas y minúsculas)
strcasecmp_asm:
    push ebp
    mov ebp, esp

    mov esi, [ebp+8]    ; puntero s1
    mov edi, [ebp+12]   ; puntero s2

.loop:
    mov al, [esi]       ; carga char de s1
    mov bl, [edi]       ; carga char de s2

    ; Convierte AL a minúscula si es mayúscula
    cmp al, 'A'
    jl .skip_lower1
    cmp al, 'Z'
    jg .skip_lower1
    add al, 32
.skip_lower1:

    ; Convierte BL a minúscula si es mayúscula
    cmp bl, 'A'
    jl .skip_lower2
    cmp bl, 'Z'
    jg .skip_lower2
    add bl, 32
.skip_lower2:

    cmp al, bl
    jne .diff

    cmp al, 0
    je .equal

    inc esi
    inc edi
    jmp .loop

.diff:
    movzx eax, al
    movzx ebx, bl
    sub eax, ebx
    jmp .end

.equal:
    xor eax, eax

.end:
    pop ebp
    ret


_start:
    ; Llama a strcasecmp_asm(str1, str2)
    push dword str2
    push dword str1
    call strcasecmp_asm
    add esp, 8

    cmp eax, 0
    je .print_equal

.print_diff:
    ; Imprime msg_diff
    mov edx, len_diff
    mov ecx, msg_diff
    jmp .print_msg

.print_equal:
    ; Imprime msg_equal
    mov edx, len_equal
    mov ecx, msg_equal

.print_msg:
    mov ebx, 1          ; stdout
    mov eax, 4          ; sys_write
    int 0x80

    ; Salida
    mov ebx, 0
    mov eax, 1          ; sys_exit
    int 0x80

section .data
len_equal equ $ - msg_equal
len_diff equ $ - msg_diff
×
×
×
¿Quieres regenerar la respuesta?
×
Exportar chat
Elige el formato de exportación
⏳ Generazione PDF in corso…
Allegati
×
⚠️ Estás a punto de cerrar el chat y pasar al generador de imágenes. Si no has iniciado sesión, perderás nuestro chat. ¿Confirmas?
👁 Estás viendo un chat compartido en modo temporal. No se guardará.
💬
×
Prompts guardados
×
Nota privada
×
Etiqueta
×
Buscar en todos los chats
×
Tus insights
Analizando…
×
Preferencias de IA
Nombre del asistente 30
Longitud de las respuestas
Modelo de IA
Respuestas estructuradas
Incluir ejemplos
Usar emojis
Guíame, no resuelvas Pistas y preguntas en vez de la solución hecha
Más ajustes →
×
Compartir este chat
Quien abra este enlace podrá ver el chat o añadirlo a su perfil como chat propio.
⚠️ Atención: también se compartirán los archivos adjuntos del chat. Quien lo añada recibirá una copia en su propia carpeta.
Chat compartido
Alguien ha compartido un chat contigo. ¿Solo quieres verlo o añadirlo a tus chats?
⚠️ Atención: también se compartirán los archivos adjuntos del chat. Quien lo añada recibirá una copia en su propia carpeta.
×

📌 Mensajes guardados

Cargando...

×

Historial de Chat

programas-ejemplo · HISTORIAL DE CHAT

Cargando...

Preferencias de IA

×
  • 🟢 BásicoRespuestas rápidas y esenciales para estudiar
  • 🔵 MedioMayor calidad para estudio y programación
  • 🟣 AvanzadoRazonamiento complejo y análisis detallado
Explicar Pasos

¿Qué se necesita?

Hardware: PC con arquitectura x86 de 32 bits

Software: Ensamblador NASM (Netwide Assembler) para compilar el código

Sistema operativo: Linux (para el uso de syscalls de entrada/salida)

Dependencias: ninguna librería externa, uso directo de syscalls de Linux

Configuración: compilar con 'nasm -f elf32 case_insensitive_compare.asm' y enlazar con 'ld -m elf_i386 -o case_insensitive_compare case_insensitive_compare.o'

Pinout/Conexiones: no aplicable (código de software puro)

Conexiones: el código es independiente y no requiere conexiones de hardware externas

Temas Similares

Comparación de dos números y establecimiento de una bandera en Assembly
Ejemplo en Assembly x86 para comparar dos números de 32 bits y establecer una bandera según el resultado en entorno Linux de 32 bits.
Impresión de una cadena constante en ensamblador
Ejemplo en ensamblador x86 de 32 bits para Linux que imprime una cadena constante usando syscalls write y exit sin librerías externas.
Programa Assembly para realizar una resta simple
Programa en assembly para AVR que realiza una resta simple entre dos números enteros, ideal para entender instrucciones básicas en microcontroladores.
Programa assembly que ejecuta una única instrucción de salto
Programa assembly AVR que ejecuta una instrucción de salto incondicional JMP para demostrar el control básico del flujo de ejecución en microcontroladores.
Uso de una etiqueta simple y salto incondicional en Assembly
Ejemplo de código Assembly x86 de 16 bits que muestra el uso de etiquetas y salto incondicional JMP para crear un bucle infinito en DOS.
Carga de una dirección de memoria en un registro
Ejemplo en ensamblador x86_64 que muestra cómo cargar la dirección de memoria en un registro usando la instrucción LEA para principiantes.
Uso de una directiva de datos simple (.data) en ensamblador
Ejemplo básico en ensamblador Linux x86_64 que muestra uso de la sección .data para definir cadenas y llamadas al sistema para imprimir en consola.
Programa assembly que define y utiliza una variable entera
Ejemplo de programa assembly en NASM para x86 32 bits que define, incrementa y guarda una variable entera en memoria en Linux.