IA-32 Soyut Komutları :
; decimalToBinary fonksiyonunun fiktif IA-32 satırları
; 1. Tam sayı ve ondalık kısımları ayır
MOV EAX, [num] ; num'u EAX'e al
MOV EBX, EAX ; EBX'e integer kısmı aktar
; 2. Tam sayı kısmını ikiliye çevir ve geçici belleğe kaydet
MOV ECX, 0 ; ECX = 0 (döngü sayacı)
LABEL_INTEGER_LOOP:
MOV EDX, 0 ; Kalanı temizle
DIV EBX, 2 ; EBX'i 2'ye böl, kalan EDX
ADD EDX, '0' ; Kalanı ASCII '0' veya '1' yap
MOV [temp + ECX], EDX ; Geçici diziye kaydet
INC ECX ; Sonraki pozisyona geç
MOV EBX, EBX / 2 ; Tam sayı kısmını güncelle
CMP EBX, 0
JNE LABEL_INTEGER_LOOP ; EBX sıfır değilse döngüye devam et
; 3. Geçici bellekteki bitleri ters sırayla binary dizisine ekle
MOV ESI, ECX ; ESI, döngü uzunluğu
MOV ECX, 0 ; ECX = 0, ters çevirme için
LABEL_REVERSE_LOOP:
MOV AL, [temp + ESI - ECX - 1] ; Geçici bellekteki sırayı ters çevir
MOV [binary + ECX], AL ; binary dizisine ekle
INC ECX
CMP ECX, ESI
JNE LABEL_REVERSE_LOOP ; Ters çevirme bitene kadar devam et
; 4. Ondalık kısmı işle (12 bit sınırı, 0.12 gibi kısım)
MOV EDX, fractionalPart ; fractionalPart'u al
MOV ECX, 12 ; 12 bit sınırı
LABEL_FRACTIONAL_LOOP:
MUL EDX, 2 ; Ondalık kısmı 2 ile çarp
CMP EDX, 1
JAE LABEL_ADD_ONE
MOV BYTE [binary + ECX], '0' ; binary dizisine '0' ekle
JMP LABEL_FRACTIONAL_CONTINUE
LABEL_ADD_ONE:
MOV BYTE [binary + ECX], '1' ; binary dizisine '1' ekle
SUB EDX, 1 ; fractionalPart'tan 1 çıkar
LABEL_FRACTIONAL_CONTINUE:
DEC ECX ; Bir bit azalt
JNZ LABEL_FRACTIONAL_LOOP ; Döngüyü bitir
; 5. binary dizisini ekrana yazdır veya işle
CALL PRINT_BINARY ; binary dizisini ekrana yazdır (fiktif bir çağrı)
; 6. Fonksiyondan çık
RET ; Fonksiyon dönüş
x86-64 Soyut Komutları :
; decimalToBinary fonksiyonunun fiktif 64-bit satırları
; 1. Tam sayı ve ondalık kısımları ayır
MOV RAX, [num] ; num'u RAX'e al
MOV RBX, RAX ; RBX'e integer kısmı aktar
; 2. Tam sayı kısmını ikiliye çevir ve geçici belleğe kaydet
MOV RCX, 0 ; RCX = 0 (döngü sayacı)
LABEL_INTEGER_LOOP:
MOV RDX, 0 ; Kalanı temizle (64-bit mod için RDX kullanılır)
DIV RBX, 2 ; RBX'i 2'ye böl, kalan RDX
ADD DL, '0' ; Kalanı ASCII '0' veya '1' yap
MOV [temp + RCX], DL ; Geçici diziye kaydet
INC RCX ; Sonraki pozisyona geç
MOV RBX, RBX / 2 ; Tam sayı kısmını güncelle
CMP RBX, 0
JNE LABEL_INTEGER_LOOP ; RBX sıfır değilse döngüye devam et
; 3. Geçici bellekteki bitleri ters sırayla binary dizisine ekle
MOV RSI, RCX ; RSI, döngü uzunluğu
MOV RCX, 0 ; RCX = 0, ters çevirme için
LABEL_REVERSE_LOOP:
MOV AL, [temp + RSI - RCX - 1] ; Geçici bellekteki sırayı ters çevir
MOV [binary + RCX], AL ; binary dizisine ekle
INC RCX
CMP RCX, RSI
JNE LABEL_REVERSE_LOOP ; Ters çevirme bitene kadar devam et
; 4. Ondalık kısmı işle (12 bit sınırı, 0.12 gibi kısım)
MOV RDX, fractionalPart ; fractionalPart'u al
MOV RCX, 12 ; 12 bit sınırı
LABEL_FRACTIONAL_LOOP:
MUL RDX, 2 ; Ondalık kısmı 2 ile çarp
CMP RDX, 1
JAE LABEL_ADD_ONE
MOV BYTE [binary + RCX], '0' ; binary dizisine '0' ekle
JMP LABEL_FRACTIONAL_CONTINUE
LABEL_ADD_ONE:
MOV BYTE [binary + RCX], '1' ; binary dizisine '1' ekle
SUB RDX, 1 ; fractionalPart'tan 1 çıkar
LABEL_FRACTIONAL_CONTINUE:
DEC RCX ; Bir bit azalt
JNZ LABEL_FRACTIONAL_LOOP ; Döngüyü bitir
; 5. binary dizisini ekrana yazdır veya işle
CALL PRINT_BINARY ; binary dizisini ekrana yazdır (fiktif bir çağrı)
; 6. Fonksiyondan çık
RET ; Fonksiyon dönüş