Práctica de Aritmética (Organización del Computador II)

De Cuba-Wiki
Saltar a: navegación, buscar
Back.png Volver a la página de la materia

Multiplicacion[editar]

Multiplicar por una potencia de dos menor a 2³²[editar]

El siguiente codigo multiplica un numero grande (mas de 32 bits) con signo por una potencia de dos determinada.

global multPot2

;extern void multPot2 (bignum a, int tam, int pot, bignum r);

%define ptrA	[ebp+8]
%define tamA	[ebp+12]
%define pot	[ebp+16]
%define ptrRes	[ebp+20]

section .text

multPot2:

;Armo stack frame y salvo regs
	push ebp
	mov ebp, esp
	push ebx
	push esi
	push edi

;Preparo regs
	mov ebx, pot		;ebx = potencia
	mov esi, ptrA		;esi = source
	mov edi, ptrRes		;edi = destination
	mov ebp, tamA		;ebp = iterador
	xor edx, edx		;edx = carry reg
	clc

;Shifteo
iter:
	mov eax, [esi]		;eax = actual
	mov ecx, ebx		;ecx = iterador potencia
	
	rotate:		
		rcr edx, 1	;Paso de eax a edx		
		rcl eax, 1
		loop rotate
	
	rcr edx, 1		;Guardo el carry (el ultimo bit sacado al eax)
	mov [edi], eax		;Bajo resultado a memoria
	
	mov ecx, ebx		;Corro el carry reg 32-pot bits a derecha
	neg ecx	
	add ecx, 0x20		
	shr edx, cl

	lea esi, [esi + 4]	;Incremento punteros
	lea edi, [edi + 4]	
	
	dec ebp
	jnz iter

;Bajo lo que sobro
	mov eax, [esi-4]	;Traigo el mas alto para ver el signo
	cmp eax, 0		
	jl bajarNeg

;bajarPos:
	xor eax, eax
	mov ecx, ebx
	
	rotatepos:		
		shr edx, 1	;Paso de eax a edx		
		rcl eax, 1
		loop rotatepos

	mov [edi], eax		;Bajo a memoria

	jmp fin

bajarNeg:
	xor eax, eax
	not eax
	mov ecx, ebx
	
	rotateneg:		
		shr edx, 1	;Paso de eax a edx		
		rcl eax, 1
		loop rotateneg

	mov [edi], eax		;Bajo a memoria
		

;Retorno
fin:	pop edi
	pop esi 
	pop ebx
	pop ebp
	ret