Başlangıç » Programlama » 8086 mimarisi ve assembly dili ile toplama, çarpma, bölme,çıkarma

8086 mimarisi ve assembly dili ile toplama, çarpma, bölme,çıkarma

Hafızada(memory) iki adet sayı olsun. hekzadesimal 6553h sayısı  0x00B00 adresinde, hekzadesimal 1287h sayısı 0x00B02 adresinde bulunuyor olsun. Bu iki sayının toplamını,farkını,çarpımını,bölümünü 0x00B10 adresinden başlayarak belleğe sırası ile yazalım.

—————————

org 1000

;Not: kodlar intel syntaxına uygun olarak yazılmıştır.

;sayıları bellek alanlarından yazmaçlara (register) kopyalayalım.

MOV ax, [0x00B00]                 ; 6553h sayısını ax yazmacına kopyaladık.

MOV bx, [0x00B02]                ; 1287h sayısını bx yazmacına kopyaladık.

;TOPLAMA

ADD ax,bx                              ; bu komutla iki sayı toplandı ve ax yazmacına yerleştirildi.

MOV [0x00B10], ax               ;  toplamı ax yazmacından belirtilen bellek adresine kopyaladık.

MOV ax, [0x00B00]               ; 6553h sayısını ax yazmacına tekrar kopyaladık , çünkü biraz önce toplam yazılmıştı. (bx’teki sayı ;değişmedi)

;ÇIKARMA

SUB ax, bx                            ;  bu komutla 6553h sayısından 1287h sayısı çıkarıldı ve ax yazmacına kopyalandı.

MOV [0x00B12], ax              ; farkı ax yazmacından belirtilen bellek adresine kopyaladık.

;ÇARPMA

;Çarpma komutu olan MUL tek operand alır. Diğer operand MUL komutunun aldığı operandın (bit olarak) boyutuna göre ah ;ya da ax ten otomatik olarak alınır (konumuz olmayan sonraki işlemcilerde eax ten de alınabilir.).

;İşlem sonucu eğer 8 bit ise ax yazmacına, 16 bit ise yüksek anlamlı kısmı dx ‘e düşük anlamlı kısmı ax ‘e olmak üzere dx:ax ‘e kaydedilir.

MOV ax, [0x00B00]       ; 6553h sayısını ax yazmacına tekrar kopyaladık , çünkü biraz önce fark yazılmıştı.

;bx yazmacında halen 1287h sayısı var ancak örneğin açıklığı açısından yeniden kopyalayalım.

MOV bx, [0x00B02]      ; 1287h sayısını bx yazmacına kopyaladık.

;MUL komutu aldığı operandın 16 bit veya 8 bit oluşuna göre değişik davranış gösterir

MUL bx                          ; bu komut bx’ teki sayı ile ax’ ten aldığı sayıyı çarptı ve dx:ax’ e yazdı. bx 16 bit olduğu için ax’ in ;doğrudan alındığına dikkat edin.Eğer bx yerine bl (veya 8 bitlik başka birşey) yazsaydık sonuç sadece ax’e kaydedilecekti.

;burada kullandığımız MUL işaretsiz çarpma yapar. İşaretli için IMUL kullanılmalıdır.

;sonuç olan 32 bitlik 075544C5h sayısı dx:ax ‘e kaydedildi.

MOV [0x00B14] , dx      ; sonucun 16 bitini belirtilen bellek adresine kopyaladık.

MOV [0x00B16] , ax      ; sonucun diğer 16 bitini belirtilen bellek adresine kopyaladık.

;BÖLME

; Bölme komutu olan DIV tek operand alır, bu bölendir. Diğer operand 8 bitlik bölmede ax’ten 16 bitlik bölmede dx:ax’ ten

;otomatik olarak alınır. Yani bölünenin uzunluğunu DIV komutunun aldığı operand olan bölen belirler.

; 8 bitlik bölmede al bölüm, ah kalan ;16 bitlik bölmede ax bölüm dx kalanı tutar.

MOV ax, [0x00B00]    ; 6553h sayısını ax yazmacına tekrar kopyaladık.

MOV bx, [0x00B02]    ; 1287h sayısını bx yazmacına kopyaladık (bx te zaten bu değer vardı, örneğin açıklığı açısından yeniden ;kopyaladık)

;BÖLME

;DIV komutu aldığı operandın 16 bit veya 8 bit oluşuna göre değişik davranış gösterir.

DIV bx                         ; bx yazmacındaki değer bölen olarak alındı ve ax’ teki  değeri böldü. Bölüm (05h) ax’ e  , kalan ;(08b0h) dx’ e kaydedildi. Eğer bx yerine 8 bit bir operand verseydik bu sefer bölüm al’ye kalan ah’a kaydedilecekti.

;burada kullandığımız DIV işaretsiz bölme yapar. İşaretli için IDIV kullanılmalıdır.

MOV [0x00B18] , ax   ; sonucu belirtilen bellek adresine kopyaladık.

hlt                                ;programı sonlandırdık

——————

3 thoughts on “8086 mimarisi ve assembly dili ile toplama, çarpma, bölme,çıkarma

Yorum bırakın