gcc -O2 -o keytest.asm -masm=intel -S -Wall -march=pentium keytest.c

keycmp

	.p2align 4,,15
	.def	_keycmp;	.scl	3;	.type	32;	.endef
_keycmp:
	push	ebp
	mov	ebp, esp
	push	edi
	push	esi
	push	ebx
mov eax, DWORD PTR [ebp+8] mov edi, DWORD PTR [eax+4] mov esi, DWORD PTR [eax] mov eax, DWORD PTR [ebp+12] mov ebx, DWORD PTR [eax+4] mov ecx, DWORD PTR [eax] cmp edi, ebx jb L7 ja L9 cmp esi, ecx jb L7 L9: mov eax, esi mov edx, edi xor eax, ecx xor edx, ebx or eax, edx setne al and eax, 255 L8: test eax, eax jne L2 mov eax, DWORD PTR [ebp+8] mov edi, DWORD PTR [eax+12] mov esi, DWORD PTR [eax+8] mov eax, DWORD PTR [ebp+12] mov ebx, DWORD PTR [eax+12] mov ecx, DWORD PTR [eax+8] cmp edi, ebx jb L15 ja L17 cmp esi, ecx jb L15 L17: mov eax, esi mov edx, edi xor eax, ecx xor edx, ebx or eax, edx setne al and eax, 255 L16: test eax, eax jne L2 mov eax, DWORD PTR [ebp+8] mov edi, DWORD PTR [eax+20] mov esi, DWORD PTR [eax+16] mov eax, DWORD PTR [ebp+12] mov ebx, DWORD PTR [eax+20] mov ecx, DWORD PTR [eax+16] cmp edi, ebx jb L23 ja L25 cmp esi, ecx jb L23 L25: mov eax, esi mov edx, edi xor eax, ecx xor edx, ebx or eax, edx setne al and eax, 255 L24: test eax, eax jne L2 mov eax, DWORD PTR [ebp+8] mov edi, DWORD PTR [eax+28] mov esi, DWORD PTR [eax+24] mov eax, DWORD PTR [ebp+12] mov ebx, DWORD PTR [eax+28] mov ecx, DWORD PTR [eax+24] cmp edi, ebx jb L31 ja L33 cmp esi, ecx jb L31 L33: mov eax, esi mov edx, edi xor eax, ecx xor edx, ebx or eax, edx setne al and eax, 255 .p2align 4,,7 L2: pop ebx pop esi pop edi pop ebp ret L31: or eax, -1 jmp L2 .p2align 4,,7 L23: or eax, -1 jmp L24 .p2align 4,,7 L15: or eax, -1 jmp L16 .p2align 4,,7 L7: or eax, -1 jmp L8

keycmp_new

	.p2align 4,,15					
	.def	_keycmp_new;	.scl	3;	.type	32;	.endef
_keycmp_new:
	push	ebp
	mov	ebp, esp
	push	edi
	push	esi
	push	ebx
	sub	esp, 12
	mov	eax, DWORD PTR [ebp+8]
	mov	edx, DWORD PTR [ebp+12]
	mov	edi, DWORD PTR [eax+4]
	mov	esi, DWORD PTR [eax]
	mov	ecx, DWORD PTR [edx]
	mov	ebx, DWORD PTR [edx+4]
	mov	eax, esi
	mov	edx, edi
	xor	edx, ebx
	xor	eax, ecx
	or	edx, eax
	jne	L67
	mov	eax, DWORD PTR [ebp+8]
	mov	edx, DWORD PTR [ebp+12]
	mov	edi, DWORD PTR [eax+12]
	mov	esi, DWORD PTR [eax+8]
	mov	ecx, DWORD PTR [edx+8]
	mov	ebx, DWORD PTR [edx+12]
	mov	eax, esi
	mov	edx, edi
	xor	edx, ebx
	xor	eax, ecx
	or	edx, eax
	jne	L67
	mov	eax, DWORD PTR [ebp+8]
	mov	edx, DWORD PTR [ebp+12]
	mov	edi, DWORD PTR [eax+20]
	mov	esi, DWORD PTR [eax+16]
	mov	ecx, DWORD PTR [edx+16]
	mov	ebx, DWORD PTR [edx+20]
	mov	eax, esi
	mov	edx, edi
	xor	edx, ebx
	xor	eax, ecx
	or	edx, eax
	je	L49
	.p2align 4,,7
L67:
	mov	eax, 1
	cmp	edi, ebx
	ja	L61
	jb	L62
	cmp	esi, ecx
L63:
	ja	L61
	.p2align 4,,7
L62:
	xor	eax, eax
L61:
	mov	ecx, eax
L34:
	add	esp, 12
	mov	eax, ecx
	pop	ebx
	pop	esi
	pop	edi
	pop	ebp
	ret
	.p2align 4,,7
L49:
	mov	edx, DWORD PTR [ebp+8]
	mov	ecx, 2
	mov	eax, DWORD PTR [edx+24]
	mov	edx, DWORD PTR [edx+28]
	mov	DWORD PTR [ebp-24], eax
	mov	DWORD PTR [ebp-20], edx
	mov	eax, DWORD PTR [ebp+12]
	mov	edx, DWORD PTR [ebp-20]
	mov	ebx, DWORD PTR [eax+24]
	mov	esi, DWORD PTR [eax+28]
	mov	eax, DWORD PTR [ebp-24]
	xor	edx, esi
	xor	eax, ebx
	or	edx, eax
	je	L34
	mov	eax, 1
	cmp	DWORD PTR [ebp-20], esi
	ja	L61
	jb	L62
	cmp	DWORD PTR [ebp-24], ebx
	jmp	L63