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.
; 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_diffHardware: 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