Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .386
- .model flat, stdcall
- option casemap:none
- include masm32includewindows.inc
- include masm32includemsvcrt.inc
- includelib masm32libmsvcrt.lib
- .data
- formatstr db "%d",0
- .code
- start:
- mov eax , 2
- mov ecx , 38
- mov esi , eax
- mov edx , 0
- .while TRUE
- mul esi
- mov esi, edx
- add esi, eax
- mov edx, 0
- mov eax, 2
- dec ecx
- .break .if (!ecx)
- .endw
- invoke crt__cprintf, addr formatstr, esi
- end start
- xor edx,edx
- mov eax,2 ; now you have 2 in edx:eax
- mov ecx,38 ; 2^n, in this case 2^38 (any value x, 1 <= x <= 63, is valid).
- x1: dec ecx ; decrease ecx by 1
- jz ready ; if it's 2^1, we are ready.
- shl eax,1 ; shift eax left through carry flag (CF) (overflow makes edx:eax zero)
- rcl edx,1 ; rotate edx through carry flag (CF) left
- jmp x1
- ready: ; edx:eax contains now 2^38.
- mov ecx,38 ; input (exponent) in ecx. 2^n, in this case 2^38.
- ; (any value x, 0 <= x <= 63, is valid).
- ; the code begins here.
- xor eax,eax
- xor edx,edx ; edx:eax is now prepared.
- cmp cl,64 ; if (cl >= 64),
- setb al ; then set eax to 0, else set eax to 1.
- jae ready ; this is to handle cl >= 64.
- ; now we have 0 <= cl <= 63
- sub ecx,1
- setnc al ; if (count == 0) then eax = 0, else eax = 1.
- lea eax,[eax+1] ; eax = eax + 1. does not modify any flags.
- jna ready ; 2^0 is 1, 2^1 = 2, those are ready now.
- mov ebx,ecx ; copy ecx to ebx
- cmp cl,32 ; if (cl >= 32)
- jb low_5_bits
- mov cl,31 ; then shift first 31 bits to the left.
- shld edx,eax,cl
- shl eax,cl ; now shifted 31 bits to the left.
- lea ecx,[ebx-31] ; cl = bl - 31
- low_5_bits:
- shld edx,eax,cl
- shl eax,cl
- ready:
- mul esi
- mov esi, edx
- add esi, eax
Add Comment
Please, Sign In to add comment