| 
	
		|  Autor | Tema: [Micro-rutina] strlen - ANSI  (Leído 8,723 veces) |  
	| 
			| 
					
						| Karcrack 
								       
								
								 Desconectado 
								Mensajes: 2.416
								
								 
								Se siente observado ¬¬'
								
								
								
								
								
								   | 
 
Me he visto en la necesidad de diseñar una rutina strlen() lo más pequeña posible... He acabado con esto...15bytes: strlen:    pop  edx    pop  edi    push -1    pop  ecx    xor  eax, eax    repne scasb    not  ecx    mov  eax, ecx    jmp  edx
 (No cumple el Intel ABI, pero puedo asumir que EDI se modifique y así me ahorro 2bytes) ¿Alguien ve la forma de recortarlo más?
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| xv0 
								       
								
								 Desconectado 
								Mensajes: 1.032
								
								   | 
 
Hola push -1   pop  ecx
 El push son dos bytes, pop uno, si el valor de ecx fuera cero podrías hacer un not y serian dos bytes. ¿Puedes hacer eso? Un saludo.
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| fary | 
 
include 'win32ax.inc' .data     Cadena     db 'mDrinky',0     longitud   dd ?.codestart:    push Cadena    call StrLen     mov [longitud],eax    invoke GlobalAlloc,GPTR,1024    push eax    invoke wsprintfA,eax,"%d",[longitud]    pop eax    invoke MessageBox,0,eax,0,MB_OK     ret      StrLen:  ; 14 bytes        pop edx        pop ecx        push -1        pop eax        bucle:        inc eax        cmp byte[ecx+eax],0        jne bucle        jmp edx .end start 
 14 Bytes
  |  
						| 
								|  |  
								|  |  En línea | 
 
 Un byte a la izquierda. |  |  |  | 
			| 
					
						| mr.blood 
								
								 Desconectado 
								Mensajes: 150
								
								
								
								
								
								   | 
 
No se si ya se puede acortar mas... yo creo que no. 13 bytes14 bytesinclude 'C:\FASM\include\win32ax.inc'.data	Mensaje db "mrblood",0.code	start:		push Mensaje		call strlen		ret	strlen:		pop ebx		pop edi		mov eax,edi		buc:			inc eax			cmp byte [eax],0			jne buc		sub eax,edi		jmp ebx 	.end start
 EDITO: Olvidadlo, no retorna correctamente. Lo mas corto son 14 bytes hasta el momento. P.D.: Drinky, quiero ese beso xDSa1uDoS |  
						| 
								|  |  
								| « Última modificación: 21 Enero 2013, 20:35 pm por mr.blood » |  En línea | 
 
 |  |  |  | 
			| 
					
						| Karcrack 
								       
								
								 Desconectado 
								Mensajes: 2.416
								
								 
								Se siente observado ¬¬'
								
								
								
								
								
								   | 
 
Ninguna de vuestras aproximaciones parece funcionar con una cadena nula     Además la función debe incluir el byte nulo en el tamaño. Por lo tanto, con una cadena nula debe devolver 1. |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Eternal Idol 
								Kernel coder ajeno al tiempo 
								Moderador
								      Desconectado 
								Mensajes: 5.970
								
								 
								Israel nunca torturó niños, ni lo volverá a hacer.
								
								
								
								
								
								     | 
 
Además la función debe incluir el byte nulo en el tamaño. Por lo tanto, con una cadena nula debe devolver 1.
 No, una cadena vacia tiene un tamaño de 0 caracteres. |  
						| 
								|  |  
								|  |  En línea | 
 
 La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.Juan Domingo Perón
 |  |  |  | 
			| 
					
						| fary | 
 
La mia si funciona con una cadena nula    |  
						| 
								|  |  
								|  |  En línea | 
 
 Un byte a la izquierda. |  |  |  | 
			| 
					
						| Karcrack 
								       
								
								 Desconectado 
								Mensajes: 2.416
								
								 
								Se siente observado ¬¬'
								
								
								
								
								
								   | 
 
No, una cadena vacia tiene un tamaño de 0 caracteres.
 No la función que yo quiero   
 La mia si funciona con una cadena nula   Devuelve 0 y quiero que sea 1    Fuera de esa necesidad tu código haría mejor el clone de strlen() y cumple el intel ABI   |  
						| 
								|  |  
								| « Última modificación: 22 Enero 2013, 00:00 am por Karcrack » |  En línea | 
 
 |  |  |  | 
			| 
					
						| Eternal Idol 
								Kernel coder ajeno al tiempo 
								Moderador
								      Desconectado 
								Mensajes: 5.970
								
								 
								Israel nunca torturó niños, ni lo volverá a hacer.
								
								
								
								
								
								     | 
 
No la función que yo quiero  Entonces no es strlen()  |  
						| 
								|  |  
								|  |  En línea | 
 
 La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.Juan Domingo Perón
 |  |  |  | 
			| 
					
						| MCKSys Argentina | 
 
Optimizando el code de mDrinky para que dé 1 con un str de largo 0 (   ), queda de 13 bytes: strlena:    pop edx    pop ecx    xor eax, eaxbucle:    inc eax    cmp byte ptr [ecx+eax],0    jne bucle    jmp edx 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 MCKSys Argentina"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando." |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | [ANSI C] Split(), strlen(), mid(), Instr(), strcpy().
							« 1 2 » Programación C/C++
 | BlackZeroX | 11 | 11,167 |  14 Enero 2011, 02:35 am por Littlehorse
 |  
						|   |   | Duda con strlen [Solucionado] Programación C/C++
 | Dark00 | 9 | 6,364 |  11 Noviembre 2012, 19:17 pm por Dark00
 |  
						|   |   | [FASM]strlen en ASM ASM
 | 0xDani | 7 | 6,413 |  28 Diciembre 2012, 14:30 pm por avesudra
 |  
						|   |   | strlen() y .length() Programación C/C++
 | erest0r | 4 | 4,957 |  17 Septiembre 2013, 08:25 am por erest0r
 |  
						|   |   | Duda con programa - funcion strlen? Programación C/C++
 | welchu | 9 | 5,305 |  18 Febrero 2014, 03:11 am por NOB2014
 |    |