Assembly / IA-32 & x86-64 / Bilgisayar Mimarisi - 10-tabanlı sayıyı 2-tabanlı sayıya dönüştüren Assembly Komutları

Bilgisayar Mühendisliği Notları
By -
0

 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üş

Yorum Gönder

0Yorumlar

Yorum Gönder (0)