se supone que pide un texto e imprime su longitud pero sucede:
pide texto, falla de segmentacion
la consola toma lo que tecle y me dice como que si lo hubiera escrito como un comando ejemplo:
si en el programa pongo hola
no me imprime nada y despues la terminal me dice
bash: ola comando no encontrado
mi code es el siguiente
Código
include '/home/nyox/include/linux.inc' format ELF executable entry start segment readable executable start: mov eax,SYS_READ mov ebx, STDIN mov ecx,texto mov edx,size int 0x80 push texto call strlen push eax push numtexto call itoa push numtexto call strlen mov edx,eax mov eax, SYS_WRITE mov ebx, STDOUT mov ecx, numtexto int 0x80 mov eax, SYS_EXIT xor ebx,ebx int 0x80 strlen: push edi xor ecx,ecx mov edi, [esp + 8] not ecx xor eax,eax cld repne scasb not ecx pop edi add eax,ecx dec eax retn 4 strrev: push ebp mov ebp,esp push edi mov edi,[ebp + 8] push edi call strlen xor ecx,ecx dec eax jmp LL1 LL0: dec eax inc ecx cmp ecx,eax jge LL2 LL1: mov dl,byte[edi + ecx] xchg byte[edi + eax],dl mov byte[edi + ecx],dl jmp LL0 LL2: pop edi pop ebp retn 4 itoa: push ebp mov ebp,esp pushad mov edi,[ebp + 8] mov eax,[ebp + 12] mov ebx,10 L@@1: xor edx,edx div ebx xchg eax,edx or eax,48 stosb mov eax,edx cmp eax,0 jnz L@@1 inc edi mov byte[edi],al push dword[ebp + 8] call strrev popad pop ebp retn 8 numtexto db 5 dup(0) texto db 10 dup(0) size dd 9
SYS_WRITE = 4
SYS_READ = 3
STDIN = 0
STDOUT = 1
el codigo rula perfectamente en win aunque no es lo mismo porque uso printf y scanf asi que supongo que mi error esta en el uso de las syscalls a ver si me pueden echar una mano
el code en win es
Código
format PE console entry start include 'c:\fasm\include\win32ax.inc' .code start: invoke scanf,"%s",texto push texto call strlen push eax push numtexto call itoa push numtexto call strlen invoke printf,numtexto leave ret strlen: push edi xor ecx,ecx mov edi, [esp + 8] not ecx xor eax,eax cld repne scasb not ecx pop edi add eax,ecx dec eax retn 4 strrev: push ebp mov ebp,esp push edi mov edi,[ebp + 8] push edi call strlen xor ecx,ecx dec eax jmp LL1 LL0: dec eax inc ecx cmp ecx,eax jge LL2 LL1: mov dl,byte[edi + ecx] xchg byte[edi + eax],dl mov byte[edi + ecx],dl jmp LL0 LL2: pop edi pop ebp retn 4 itoa: push ebp mov ebp,esp pushad mov edi,[ebp + 8] mov eax,[ebp + 12] mov ebx,10 L@@1: xor edx,edx div ebx xchg eax,edx or eax,48 stosb mov eax,edx cmp eax,0 jnz L@@1 inc edi mov byte[edi],al push dword[ebp + 8] call strrev popad pop ebp retn 8 section '.data' data readable writeable numtexto db 5 dup(0) texto db 10 dup(0) size dd 9 section '.idata' import data readable library msvc,'msvcrt.dll' import msvc,printf,'printf',scanf,'scanf'
no cambia mucho solo el uso de entrada y salida
gracias de antemano