PDA

Ver la versión completa : Ayuda con assebler



newage
24/07/2006, 02:54
Estoy trabjando en algo para el consurso de GP2X, pero
da la casualidad de que un cacho del código esta en
ensamblador de los intelx86 y la verdad es que no estoy
muy metido en ello aún, he estado mirando como poder pasar
a ensamblador del ARM y esto es lo que llevo por ahora.

Lo comentado es del x86.
Lo posteo por si alguien controla me vaya diciendo si estoy haciendo algo mal xD, es que pasar codigo en assembler de x86
a arm es un poco rollo aunque sea solo este cacho código.

Ya se porque nadie se pone a portar el zsnes xD [wei] [wei]


.global _ticker
.global ticker_
_ticker:
ticker_:
@Guardo el puntero a la cumbre de la pila en ip
mov ip, sp
@Guardo el contexto
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #4
sub sp, sp, #8
str r0, [fp, #-16]
str r1, [fp, #-20]

@Muevo argumentos de {r0,r1} a {r2,r3}
ldr r2, [fp, #-16]
ldr r3, [fp, #-20]

@ix86 code
@push edx
@rdtsc
mov r2,r2,lsr #8
mov r3,r3,lsl #24
@shr eax,8
@shl edx,24
and r3,r3,#0xff000000
@and edx,0xff000000
orr r3,r3,r2
@or eax,edx
mov r0, r3
@pop edx

sub sp, fp, #12
@Cargo el contexto guardado en la pila.
@Al volver a cargar PC vuelvo de la función.
ldmfd sp, {fp, sp, pc}

.global rdtscCapableCpu_
.global _rdtscCapableCpu
rdtscCapableCpu_:
_rdtscCapableCpu:
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #4
sub sp, sp, #8
str r0, [fp, #-16]
str r1, [fp, #-20]

@push ebx
@push ecx
@push edx
@mov eax,1
@xor ebx,ebx
@xor ecx,ecx
@xor edx,edx
@cpuid
@test edx,0x10
@setne al
@and eax,1
@pop edx
@pop ecx
@pop ebx

sub sp, fp, #12
ldmfd sp, {fp, sp, pc}

Mmm... se supone que el opcode "rdtsc" es para tomar
medidas de precisión de memos de 1 useg.

Código original:

bits 32
section .data
bits 32

times ($$-$)&7 db 0
section .text
bits 32

global rdtscCapableCpu_
global _rdtscCapableCpu
global _ticker
global ticker_

_ticker:
ticker_:
push edx
rdtsc
shr eax,8
shl edx,24
and edx,0xff000000
or eax,edx
pop edx
ret

rdtscCapableCpu_:
_rdtscCapableCpu:
push ebx
push ecx
push edx
mov eax,1
xor ebx,ebx
xor ecx,ecx
xor edx,edx
cpuid
test edx,0x10
setne al
and eax,1
pop edx
pop ecx
pop ebx
ret
end


Ya iré editando con cambios.

Wild[Kyo]
24/07/2006, 03:35
Te aviso que, si no me equivoco, no se pueden presentar emuladores en el concurso de GP2X.

newage
24/07/2006, 04:44
']Te aviso que, si no me equivoco, no se pueden presentar emuladores en el concurso de GP2X.No fastidies. :rolleyes:
Bueno, despues del trabajo realizado no voy a cambiar.

En cuanto al codigo creo que voy a tener que reemplazarlo todo
porque es muy dependiente de intel.

Una version reducida de la funcionalidad en inline_asm sería:

unsigned __int64 read_clock_tick()
{
unsigned int h,l;
__asm
{// Flush pipelines
xor EAX, EAX
cpuid
// Read clock counter
rdtsc
mov h, EDX
mov l, EAX
}
return ((unsigned __int64)h<<32) + l;
}

Me metere al chat, que es lo mejor, a ver si pillo a Franxis.

Segata Sanshiro
24/07/2006, 05:14
Puedes presentarlo a otros concursos si quieres, que eso no te desanime :D

anibarro
24/07/2006, 05:49
Yo empezaria por pasar a C o C++ los trozos de codigo que tengas en ensamblador, luego, cuando tengas todo funcionando y si te hace falta mas velocidad (que si es un emu seguro que si), ya lo reescribiras en ensamblador