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
——————
çok faydalıydı teşekkürler.
Hayatımda bu kadar anlatım görmemiştim
çok güzldi bidaha olmasın