1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| #include <stdio.h> #include <windows.h>
char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
void base64enc_asm(char * m, char * c){ int j;
__asm{ mov dword ptr[j], 0 while_start: mov eax, dword ptr[m] mov al, byte ptr[eax] test al,al je while_end shr al, 2 and eax,0xff mov ecx, dword ptr[j] mov bl, byte ptr[base + eax] mov eax, dword ptr[c] mov byte ptr[eax + ecx], bl
mov eax, dword ptr[m] mov al, byte ptr[eax] and al,3 shl al,4 mov ebx, dword ptr[m] mov ah, byte ptr[ebx+1] shr ah,4 add al,ah and eax,0xff mov ecx, dword ptr[j] mov bl, byte ptr[base + eax] mov eax, dword ptr[c] mov byte ptr[eax + ecx + 1], bl
mov eax, dword ptr[m] mov al, byte ptr[eax+1] cmp al,0 jne cj2 mov ecx, dword ptr[j] mov eax, dword ptr[c] mov byte ptr[eax + ecx + 2], 61 mov byte ptr[eax + ecx + 3], 61 jmp while_end
cj2: mov eax, dword ptr[m] mov al, byte ptr[eax + 1] and al, 0xf shl al, 2 mov ebx, dword ptr[m] mov ah, byte ptr[ebx + 2] shr ah, 6 add al, ah and eax, 0xff mov ecx, dword ptr[j] mov bl, byte ptr[base + eax] mov eax, dword ptr[c] mov byte ptr[eax + ecx + 2], bl
mov eax, dword ptr[m] mov al, byte ptr[eax + 2] cmp al, 0 jne cj3 mov ecx, dword ptr[j] mov eax, dword ptr[c] mov byte ptr[eax + ecx + 3], 61 jmp while_end
cj3: mov eax, dword ptr[m] mov al, byte ptr[eax+2] and eax, 0x3f mov ecx, dword ptr[j] mov bl, byte ptr[base + eax] mov eax, dword ptr[c] mov byte ptr[eax + ecx + 3], bl
mov eax, dword ptr[m] add eax,3 mov dword ptr[m],eax mov ecx, dword ptr[j] add ecx,4 mov dword ptr[j],ecx
jmp while_start while_end: } }
void base64enc(char * m, char * c){ int j = 0; while (1){ if (*m == 0){ break; } c[j] = base[*m >> 2]; c[j + 1] = base[((*m & 3) << 4) + (*(m + 1) >> 4)]; if (*(m + 1) == 0){ c[j + 3] = c[j + 2] = '='; break; } c[j + 2] = base[((*(m + 1) & 0xf) << 2) + (*(m + 2) >> 6)]; if (*(m + 2) == 0){ c[j + 3] = '='; break; } c[j + 3] = base[*(m + 2) & 0x3f]; m += 3; j += 4; } }
int main(void){ char * m = "hello,world!"; char c[100] = { 0 }; base64enc(m, c); printf("%s\n", c); system("pause"); return 0; }
|