Voilà un exemple propre d'un système d'inversion de bits.
Attention, si vous voulez commencer par en faire un vous même, ne choisissait pas la lettre A ni la lettre B.
Je m'explique la lettre A est 0x41 ce qui donne 0100 0001b et on pourrait penser que son double est la solution puisque 0x82 donne le bon résultat 1000 0010b, donc on pourrait être tenter de penser qu'il suffit de faire x2 pour inverser les bits.
Ensuite vient le problème de la lettre B 0x42, qui est en faite un miroir d'elle même 0100 0010b donc non utilisable pour commencer à travailler. C'est pourquoi j'ai choisi la lettre C 0x43 qui donne 0xC2 en sortie et une inversion de bits parfaite.
Amusez-vous bien.

A compiler avec FASM, fonctionne sous Windows 11, intel x86

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
format PE console
include 'include/win32a.inc'
entry start
 
section '.text' code readable executable
 
start:
    xor eax,eax
    mov al,0x43
 
    call reverse_bits
 
    push eax
    push formh
    call [printf]
 
    push 0
    call [ExitProcess]
 
reverse_bits:
    push ecx
    push edx
 
    xor edx,edx
    mov cl,8
 
@@:
    shl al,1        ; bit de gauche → CF
    rcr dl,1        ; CF → bit de droite de DL
    dec cl
    jnz @b
 
    mov al,dl
 
    pop edx
    pop ecx
    ret
 
section '.data' data readable writeable
 
formh db '%08x',13,10,0
 
section '.idata' import data readable writeable
 
library kernel32,'kernel32.dll',\
		msvcrt,'msvcrt.dll',\
		user32,'user32.dll',\
		wsock32,'ws2_32.dll'
 
include 'include\api\kernel32.inc'
include 'include\api\user32.inc'
include 'include\api\wsock32.inc'
 
import msvcrt,\
printf,'printf'