Assembler'da resimli eğitim. Montaj Aritmetiği Talimatları

Takım ADC(Taşıyarak Ekle) grubuna aittir tamsayı komutları(veya ikili)aritmetik (İkili Aritmetik Talimatları) ve iki imzalı veya imzasız işlenenin tam sayı toplamasını gerçekleştirir ( HEDEF Ve SRC) Ve bayrak taşımak EFLAGS.CF . İlk işlenen ( hedef işlenen, HEDEF) bir kayıt defterindeki veya bellekteki bir değişken olabilir ( , r16, r32 , r/m8, r/m16, r/m32). İkinci işlenen ( kaynak işleneni, SRC) - acil anlam ( imm8, imm16, imm32), bir kayıt defterindeki veya bellekteki bir değişken. Bu durumda her iki işlenen de aynı anda bellekte değişken olamaz.

Komutla eklemenin sonucu ADC ilk işlenenin yerine yerleştirilir ( HEDEF). EFLAGS kaydındaki bayraklar sonuca göre ayarlanır.

Doğrudan değer eklerken imm8 veya imm16 iki baytlık veya dört baytlık bir işlenende, anlık değer ilk önce ilk işlenenin boyutuna işaretle genişletilir ve ancak bundan sonra ekleme gerçekleştirilir.

Takım ADC genellikle çok baytlı veya çok kelimeli olarak kullanılır ( çok kelimeli) ekleme işlemleri. Bu durumda, çok baytlı (çok kelimeli) işlenenlerin düşük sıralı bitlerinin toplamını döndüren ve yüksek dereceli bitler eklenirken taşımanın dikkate alınmasına izin veren ADD komutunu takip eder. Örneğin:

mov edx, 0 ; EDX = 0
mov eax, 0FFFFFFFFh ; İlk 32 bitlik eklenti EAX'a yerleştirildi
eax ekleyin, 0FFFFFFFFh ; ikinci 32 bitlik eklenti - 0x FFFFFFFFh, iki adet 32 ​​bitlik işlenen ekliyoruz
adc edx, 0; EDX = EDX + CF, aktarımı dikkate alın
; EDX:EAX = 0000000lh:FFFFFFFEh - elde edilen 64 bit sonuç

Takım ADC tamsayı işlenenlerin aşağıdaki gibi manipülasyonuna izin verir imzasız biçim, ve imzalı format. İşaretli veri eklerken işaret bayrağı EFLAGS.SF elde edilen sonucun işaretini yansıtacaktır. Taşma bayrağı EFLAGS.OF, ikinin tümleyeninde veya ikinin tümleyeninde temsil edilen işaretli tamsayı değerlerini eklerken bir taşma meydana gelirse (işaret bitinden önceki bitin karşılık geldiği en anlamlı bitten taşır), yani ortaya çıkan sonuç işlenenin -appointments ( randevularının) kullanılabilir boyutunu aşıyor HEDEF). Temel olarak bu, EFLAGS.CF bayrağının ekleme sırasında taşmayı (taşıma) yansıtma şekline benzer. imzasız işlenenler. Örneğin, ters kodda temsil edilen iki adet 32 ​​bitlik değer eklenirken şu şekilde görünebilir:

mov eax, işlenen1 ; EAX = işlenen1, ilk 32 bitlik eklenti EAX'a yerleştirilir
eax, işlenen2 ekleyin; ters koda iki adet 32 ​​bitlik işlenen ekliyoruz
içine ; taşma durumunda kesme işleyicisine atla

adc eax, 0 ; EAX = EAX + CF, taşımayı dikkate alın (ters kodda ekleme için gereklidir)
; EAX = işlenen1 + işlenen2 - ters koddaki eklemenin sonucu
jns m1; sonuç olumlu ise geçiş
xor eax, 7FFFFFFFh ; EAX'taki negatif değeri düz koda dönüştürme
m1: ; EAX - doğrudan koda eklemenin sonucu

Yardımcı bayrak(veya ek olarak)Aktar EFLAGS.AF, BCD formatındaki verilerin işlenmesine yardımcı olur ( paketlenmiş BCD formatı). Ekleme sırasında, sonucun düşük baytının düşük tetradından yüksek tetradına bir taşıma meydana gelirse ayarlanır. Komutun hemen ardından DAA komutunu kullanma ADC sözde üretmek mümkündür ondalık düzeltme toplamanın sonucu ve toplamı aynı şekilde elde edin paketlenmiş BCD formatı, orijinal şartlar gibi.

Takım ADC hedef işlenen ile ( HEDEF Bir bellek değişkeni olan ), komutun atomik yürütülmesini sağlayacak LOCK lock öneki ile birlikte kullanılabilir.

Ekleme komutları - ADD, ADC

ADD (ekle) ve ADC (taşıma ile ekle) talimatları hem 8 hem de 16 bitlik işlenenleri ekleyebilir.

ADD komutu kaynak işlenenin ve hedef işlenenin içeriğini ekler ve sonucu hedef işlenene yerleştirir.

Komut Formatı: ADD alıcısı, kaynak

Sembolik gösterimde eylemleri şu şekilde açıklanabilir: sink:= sink + source (havuz ve kaynak içeriklerinin toplamı havuza yazılır).

ADC komutu, ADD komutuyla aynı şeyi yapar ancak iki değil üç terim ekler: hedef, kaynak ve taşıma bayrağı.

Komut Formatı: ADC alıcısı, kaynak + CF

Sembolik gösterimde eylemleri şu şekilde tanımlanabilir:

lavabo:= lavabo + kaynak + taşıma bayrağının içeriği.

İkili sayıları toplarken taşıma işlemi, bir sütuna ondalık sayıları eklerken taşıma işlemine benzer. Bilgisayar ikili sayıları topladığında ve toplam hedef işlenene sığmadığında bir taşıma oluşturulur. Bildiğiniz gibi 8 bitlik bir yazmaç 0 ila 255 aralığında işaretsiz değerleri tutabilir. Örneğin 250 ve 10 sayılarının ikili toplamasını yaparsak aşağıdaki sonucu elde ederiz:

1111 1010; 250 sayısının ikili gösterimi.

0000 1010 ; 10 sayısının ikili gösterimi.

1 0000 0100; 260'a eşit toplamın ikili gösterimi.

Sonuç doğrudur ancak 9 ikili bit kaplar. Eğer 8 bitlik kayıtlar kullanılmışsa, daha düşük olan 8 bit hedef kaydına ve dokuzuncu bit de taşıma bayrağı CF'sine girilecektir.

Artık 8086 mikroişlemcisinin neden iki farklı ekleme talimatına sahip olduğunu anladık. Bunlardan biri (ADD), bayt veya kelimelerle temsil edilen değerlerin yanı sıra yüksek hassasiyetli değerlerin alt kısımlarını da ekleyebilir. Yüksek hassasiyetli değerleri eklemek için başka bir talimat (ADC) kullanılır.

Eklenecek işlenenler bellekte, bir kayıt defterinde olabilir veya anlık bir değere sahip olabilir. Örneğin:

AX,MEM_WORD EKLE; Bir bellek hücresinin içeriğini bir kayda eklemek,

MEM_WORD,AX EKLE; veya tam tersi, kaydın içeriğini bellek hücresine ekleyin.

AL'I EKLE, 10; kaydın içeriğine bir sabit ekleyin.

MEM_BYTE,8H EKLE; sabiti ve bellek hücresinin içeriğini ekleyin.

Olası kombinasyonların çoğuna izin verilir, ancak yasaktır iki hafıza hücresinin içeriğini ekleyin veya alıcı olarak doğrudan bir değer (sayı) kullanın.

ADD ve ADC komutları aşağıdaki altı bayrağı etkileyebilir:

bayrak taşımak Toplamanın sonucu hedef işlenene uymuyorsa CF 1'dir, aksi halde 0'dır;

parite bayrağı Sonuç 1 değerinde çift sayıda bit içeriyorsa PF 1'dir, aksi halde 0'dır;

Ondalık sayıların eklenmesinin sonucu düzeltme gerektiriyorsa AF 1'e eşittir;

sıfır bayrağı Sonuç 0 ise ZF 1'dir;

işaret bayrağı Sonuç negatifse SF 1'dir (en anlamlı bit 1'dir), aksi halde 0'dır;

taşma bayrağı Aynı işaretteki iki sayının toplamı, ters kodda alıcının kabul edilebilir değerleri aralığını aşarsa ve alıcının kendisi işaret değiştirirse OF 1'e eşittir. Aksi takdirde OF bayrağı 0'dır.

Alıcı değerini bir artırma komutu - INC

Takım dahil(artış) bir yazmaç veya bellek hücresinin içeriğine 1 ekler, ancak ADD komutunun aksine CF taşıma bayrağını etkilemez. Komut Formatı: INC alıcısı.

INC komutu, talimat döngülerindeki sayaçları artırmak için kullanışlıdır. Sıralı bellek hücrelerine erişirken indeks kaydının değerini artırmak için de kullanılabilir. İşlenen işaretsiz bir sayı olarak yorumlanır.

Örneğin:

INCCX; 16 bitin değerini artırın

DAHİL; veya birim başına 8 bitlik kayıt.

INC MEM_BYTE; bayt değerini artır

INC MEM_WORD; veya birim başına hafıza kelimeleri.

İşlenen olarak anlık bir değerin kullanılmasına izin verilmez.

Çıkarma komutları - SUB ve SBB ödünç alınarak çıkarma

Takımlar ALT(çıkarma - çıkarma) ve SBB(ödünç alma ile çıkarma) sırasıyla ADD ve ADC toplama komutlarına benzer, yalnızca çıkarma sırasında CF taşıma bayrağı bir kredi işareti görevi görür. Komut Formatı: SUB alıcısı, kaynak;

SUB komutu kaynak işleneni hedef işlenenden çıkarır ve sonucu sembolik gösterimle hedefe yerleştirir:

havuz:= havuz – kaynak.

Takım SBB aynı şeyi yapar, ancak ek olarak CF taşıma bayrağının değerini alıcıdan çıkarır:

SUB alıcısı, kaynak – CF;

Hedef:= lavabo - kaynak - taşıma bayrağının içeriği.

Ek olarak SUB ve SBB komutları iki ayrı işlevi yerine getirir. İlk komut, bayt veya kelime boyutundaki sayıların yanı sıra yüksek duyarlıklı sayıların düşük dereceli bitlerini de çıkarır (sayıların düşük dereceli kısmı AX kaydında bulunur ve yüksek dereceli kısmı AX kaydında bulunur). DX kaydı). İkinci komut, yüksek hassasiyetli sayıların en anlamlı bitlerini çıkarır. Örneğin SUB AX,CX komutu; CX kaydının içeriğini AX kaydının içeriğinden çıkarır ve sonucu AX kaydına döndürür.

İşlenen boyutları 16 bit'i aşarsa aşağıdaki komut dizisi kullanılmalıdır:

ALT AX,CX; Düşük 16 biti çıkarın;

SBB BX,DX; ve sonra en anlamlı 16 bit.

Burada AX ve BX kayıtlarında bulunan 32 bitlik sayıdan CX ve DX kayıtlarında bulunan 32 bitlik sayıyı çıkarıyoruz. DX kaydının içeriğini BX kaydının içeriğinden çıkarırken SBB talimatı, ilk çıkarma işlemi sırasında ödünç alma olasılığını dikkate alır.

ALT AX, MEM; Bir bellek hücresinin içeriğini bir kayıttan çıkarın.

ALT MEM ,AX; Bir bellek hücresinden bir kaydı çıkarın.

SUB AL,1O; Bir kayıttan bir sabiti çıkarın.

SUB MEM_BYTE,OFh; Bir bellek hücresinden bir sabiti çıkarın.

Doğrudan çıkarılamaz bir bellek hücresinin içeriğini diğerinden alabilir veya anlık değeri hedef olarak kullanabilir.

SUB ve SBB komutları altı bayrağı aşağıdaki gibi etkileyebilir:

· düzenlemek bayrak taşımak Kredi gerekiyorsa CF 1, değilse 0'dır;

· düzenlemek parite bayrağıÇıkarma işleminin sonucu 1 değerinde çift sayıda bit içeriyorsa PF 1'dir, aksi halde 0'dır;

· düzenlemek yardımcı taşıma bayrağı Ondalık çıkarma işleminin sonucu düzeltme gerektiriyorsa AF 1, aksi takdirde 0'dır;

· düzenlemek sıfır bayrağı Sonuç 0 ise ZF'den 1'e, aksi halde 0'dan;

· düzenlemek işaret bayrağı Sonuç negatifse SF 1'dir (en anlamlı bit 1'dir), aksi halde bayrak 0'dır;

· düzenlemek taşma bayrağıÇıkarma sonucu ters koddaki alıcı değerleri aralığını aşarsa ve alıcının kendisi işaret değiştirirse OF 1'dir.

SF ve OF bayrakları yalnızca işaretli sayıları çıkarırken anlamlıdır ve AF bayrağı yalnızca ondalık sayıları çıkarırken anlamlıdır.

Hedef İçeriğini Azalt Komutu - DEC

Takım DEC alıcısı(azaltma), bir kayıt veya bellek konumunun içeriğinden 1 çıkarır, ancak (SUB komutunun aksine) taşıma bayrağı CF'yi etkilemez.

DEC komutu genellikle döngülerde bir sayaç değerini sıfıra veya negatif olana kadar azaltmak için kullanılır. Sıralı bellek konumlarına erişirken bir indeks yazmacının veya işaretçinin değerini azaltmak için de kullanılabilir. Örneğin:

DECCX; 16 bit değerini azaltın,

DEC AL; veya 8 bitlik kayıt.

DEC MEM_BYTE; Bayt değerini azaltın,

DEC MEM_WORD; veya kelime hafıza hücresi.

Bölme talimatları - DIV, IDIV

Takım DIV(böl - böl) işaretsiz sayıların bölünmesini gerçekleştirir ve komut IDIV(tam sayı bölme - tam sayıları bölme) sayıların işaretli bölünmesini gerçekleştirir. Bu komutlar şu formata sahiptir:

DIV kaynağı; Nerede kaynak- bayt veya kelime boyutunun bölücüsü,

IDIV kaynağı;genel amaçlı bir kayıt defterinde veya hafıza konumunda bulunur.

Lütfen aşağıdakilere dikkat edin:

1. Temettü, bölene göre iki katı büyüklükte olmalıdır.

2. Bölüntü her zaman AX kaydında (8 bitlik bir sayıya bölünürken) veya DX ve AX kayıtlarında (16 bitlik bir sayıya bölünürken) olmalıdır.

3. Komutun sonuçları aşağıdaki gibi döndürülür:

· kaynak işlenen bir bayt ise, bölüm AL kaydına ve geri kalanı AN kaydına döndürülür;

· Kaynak işlenen bir kelime ise, bölüm AX kaydına ve geri kalanı DX kaydına döndürülür.

Her iki talimat da bayrakların durumunu tanımsız bırakır, ancak bölüm hedef kaydına (AL veya AX) uymuyorsa, mikroişlemci 0 tipi bir kesme (0'a bölme) üretir.

4. Bölme sonucunun taşması aşağıdaki koşullar altında meydana gelir:

· bölen 0'dır;

· Baytları işaretsiz olarak bölerken, bölenin en az 256 katı bölen olur;

· işaretsiz sözcükleri bölerken, bölünen bölenin en az 65.536 katıdır;

· baytları bir işaretle bölerken bölüm -128 ila +127 aralığının dışında kalır;

· sözcükleri bir işaretle bölerken bölüm şu aralığın dışında kalır:

32768 ila 32767.

İşte bölme işlemlerinin bazı tipik örnekleri:

DIV BX; DX:AX'i işaretsiz BX'e bölün.

DIV MEM_BYTE; AX'i imzasız bir bayt belleğe bölün.

IDIV DL; AX'i bir işaretle DL'ye bölün.

İDİV MEM SÖZÜ; DX:AX'i imzalı bir bellek sözcüğüne bölün.

DIV ve IDIV komutları doğrudan anlık değere bölmez çünkü işlemci bölenin veri tipini belirleyemez.

Çarpma talimatları - MUL, IMUL

Takım MUL(çarpın) işaretsiz sayıları çarpar, a İMÜL(tamsayı çarpma) işaretli tamsayıları çarpar. Her iki talimatın çarpanı ve çarpanı aynı veri türünde olmalıdır; yani bayt, kelime, çift kelime vb.

Bu komutlar aşağıdaki formata sahiptir:

MUL kaynağı; Nerede kaynak- genel amaçlı kayıt,

IMUL kaynağı; veya bayt veya kelime boyutunda bir hafıza hücresi.

İlk işlenen (çarpılabilir) olarak, MUL ve IMUL komutları AL kaydının (baytlar üzerindeki işlemler için) veya AX kaydının (kelimeler üzerindeki işlemler için) içeriğini kullanır. Ürün çift bedendir ve aşağıdaki şekilde iade edilir:

· çarpma işlemi bayt-16 bitlik ürünü AN (yüksek bayt) ve AL (düşük bayt) yazmaçlarına döndürür;

· çarpma işlemi kelimeler-32 bit ürünü DX (yüksek kelime) ve AX (düşük kelime) kayıtlarına döndürür. Böylece ürünün boyutu N- bit faktörleri eşittir 2n.

Taşıma ile ADC Tamsayı toplama

Takım adc birinci ve ikinci işlenenlerin toplamını gerçekleştirir ve taşıma bayrağı CF'nin değerini sonuca ekler. İlk işlenenin (hedef) orijinal değeri kaybolur, yerini toplama sonucu alır. İkinci işlenen değişmez. Komutun ilk işleneni olarak adc

İşlenenler bayt veya kelime olabilir ve imzalı veya imzasız sayıları temsil edebilir. Takım adc(ekiple birlikte eklemek) genellikle 32 bitlik sayıları eklemek için kullanılır. Komut OF, SF, ZF, AF, PF ve CF bayraklarını etkiler.

örnek 1:

Mov AX,1125h adc AX,2C25h; AX=3D4Bh, eğer CF = 1 ise;AX=3D4Ah, eğer CF = 0 ise

Örnek 2:

; Veri alanlarında: numlow dw 0FFFFh; 2. dönem numhigh dw'nin düşük kısmı 000Sh; 2. dönemin en yüksek kısmı;Sayı 0005FFFFh=393215;Program bölümünde: mov AX,000Sh; 1. dönem mov BX,0002h'nin düşük dereceli kısmı; 1. dönemin en yüksek kısmı;Sayı 00020005h=131077 AX ekle,numlow; Küçük parçaların eklenmesi. AX=4, CF=1 adc BX, sayıyüksek; Taşıma ile daha yüksek parçaların eklenmesi. BX:AX=0008:0004h. ;Sayı 00080004h=524292

32 bit işlenenlerin ve 32 bit işlemcilerin ek adresleme modlarının kullanımı kabul edilebilir. Takım adc 32 bit işlenenlerle, 64 bit tamsayıları eklemek için kullanılabilir.

Örnek:

; Veri alanlarında mem321 dd 0FFFFFFFFh; 1. dönem mem32h dd 98765432h'nin düşük dereceli kısmı; 1. dönemin en yüksek kısmı; Program bölümünde mov EAX,1; 2. dönem mov EBX,0'ın düşük dereceli kısmı; 2. dönemin en yüksek kısmı EAX,mem321; Alt yarımları ekleyin;Toplam=100000000h>32 bit;EAX=000000h, adc EBX,mem32h'yi taşıyın; Eski yarımları katlayın ve devam ettirin. EBX=90000001h; Tutar: 9876543300000000h

EKLE Tamsayı toplama

Takım eklemek birinci ve ikinci işlenenlerin eklenmesini gerçekleştirir. İlk işlenenin (hedef) orijinal değeri kaybolur, yerini toplamanın sonucu alır. İkinci işlenen değişmez. Komutun ilk işleneni olarak eklemek Bir kayıt (segment bir hariç) veya bir bellek hücresi belirtebilirsiniz, ikincisi bir kayıt (bir segment hariç), bir bellek hücresi veya bir anlık değer olabilir, ancak her iki işlenenin aynı anda bellek olarak tanımlanmasına izin verilmez. hücreler.

İşlenenler bayt veya sözcük olabilir ve imzalı veya imzasız sayıları temsil edebilir. Add komutu hem normal tamsayıları hem de ikili ondalık sayıları toplamak için kullanılabilir (sonucu depolamak için AX kaydını kullanarak). Paketlenmemiş ikili kodlu ondalık (BCD) sayılar eklenirse komuttan sonra eklemek aaa komutu kullanılmalıdır; paketlenmiş sayılar eklenirse komut Evet. Komut OF, SF, ZF, AF, PF ve CF bayraklarını etkiler.

örnek 1:

Mov BX,lFFEh mov CX,3 ekle BX,CX; BX=2001h, CX=0003h

Örnek 2:

Hareket AX,25 saat AX ekleyin, 12 saat; AX=0037h

Örnek 3:

; Veri alanlarında: mem dw 128 ;Program bölümünde: mem,100 ekle; mem=228

Taşıma ile ADC Tamsayı toplama

adc komutu birinci ve ikinci işlenenleri toplayarak taşıma bayrağı CF'nin değerini sonuca ekler. İlk işlenenin (hedef) orijinal değeri kaybolur, yerini toplamanın sonucu alır. İkinci işlenen değişmez. adc komutunun ilk işleneni bir yazmaç (bölüm bir dışında) veya bir bellek hücresi olabilir, ikinci işlenen bir kayıt (bölüm bir hariç), bir bellek hücresi veya anlık bir değer olabilir, ancak her iki işlenenin aynı anda bellek hücreleri olarak belirtilmesine izin verilir. İşlenenler bayt veya sözcük olabilir ve imzalı veya imzasız sayıları temsil edebilir. adc komutu (add komutuyla birlikte) genellikle 32 bitlik sayıları eklemek için kullanılır. Komut OF, SF, ZF, AF, PF ve CF bayraklarını etkiler.

örnek 1

Mov AX,1125h adc AX,2C25h ;AX=3D4Bh, eğer CF = 1 ise;AX=3D4Ah, eğer CF = 0 ise
Örnek 2; Veri alanlarında: numlow dw 0FFFFh ;2. terimin alt kısmı numhigh dw 000Sh ;2. terimin yüksek kısmı;Sayı 0005FFFFh=393215 ;Program segmentinde: mov AX,000Sh ;1. terimin alt kısmı mov BX, 0002h ; 1. dönemin en yüksek kısmı;Sayı 00020005h=131077 AX ekle,numlow;Alt kısımların eklenmesi. AX=4, CF=1 adc BX, numhigh ;transfer.BX:AX=0008:0004h ile daha yüksek parçaların eklenmesi. ;Sayı 00080004h=524292
32 bit işlenenlerin ve 32 bit işlemcilerin ek adresleme modlarının kullanımı kabul edilebilir. 32 bitlik işlenenlere sahip adc komutu, 64 bitlik tam sayıları toplamak için kullanılabilir. Örnek 3; Veri alanlarında mem321 dd 0FFFFFFFFh ;1. dönemin alt kısmı mem32h dd 98765432h ;1. dönemin yüksek kısmı; Program segmentinde mov EAX,1 ;2. terimin düşük kısmı mov EBX,0 ;2. terimin yüksek kısmı EAX,mem321'i topla ;Düşük yarımları ekle;Sum=100000000b>32 bit;EAX=000000h, taşı adc EBX,mem32h ;Eski yarıları ekleyin ve aktarın; EBX=90000001h ;Tutar: 9876543300000000h
EKLE Tamsayı toplama

Add komutu birinci ve ikinci işlenenleri ekler. İlk işlenenin (hedef) orijinal değeri kaybolur ve yerini toplamanın sonucu alır. İkinci işlenen değişmez. Ekle komutunun ilk işleneni bir kayıt defteri (bölüm bir hariç) veya bir bellek hücresi olarak belirtilebilir ve ikinci işlenen bir kayıt defteri (bölüm bir hariç), bir bellek hücresi veya anlık bir değer olabilir, ancak bu her iki işlenenin aynı anda bellek hücreleri olarak tanımlanmasına izin verilmez. İşlenenler bayt veya kelime olabilir ve işaretli veya işaretsiz sayıları temsil edebilir. Add komutu hem normal tamsayıları hem de ikili ondalık sayıları toplamak için kullanılabilir (sonucu depolamak için AX kaydını kullanarak). Paketlenmemiş ikili kodlu ondalık (BCD) sayıları eklerken, add komutundan sonra aaa komutunu kullanın; paketlenmiş sayılar eklenirse daa komutunu verin. Komut OF, SF, ZF, AF, PF ve CF bayraklarını etkiler. örnek 1

Mov BX,lFFEh mov CX,3 ekle BX,CX ;BX=2001h, CX=0003h
Örnek 2 mov AX,25h AX ekle,12h ;AX=0037h
Örnek 3; Veri alanlarında: mem dw 128 ;Program bölümünde: add mem,100 ;mem=228
Örnek 4 mov AX,0507h ;BCD paketlenmemiş 57 ekle AL,05h ;BCD 5, AX=050Ch aaa ;AX=0602h, BCD 62
Örnek 5 mov AL,57h ;BCD paketlenmiş 57 AL,05h ekle ;BCD 5, AL=5Ch daa ;AL=62h, BCD 62

32 bit işlenenlerin ve 32 bit işlemcilerin ek adresleme modlarının kullanımı kabul edilebilir. Örnek

Mov EAX,98765432h EAX,11111111h ekleyin; EAX=A9876543h
VE Mantıksal VE

And komutu, birinci işlenenin ikinciyle mantıksal (bit düzeyinde) çarpımını gerçekleştirir. İlk işlenenin (hedef) orijinal değeri kaybolur, yerini çarpma sonucu alır. and komutunun ilk işleneni bir yazmaç (bölüm bir hariç) veya bir bellek hücresi olabilir, ikinci işlenen bir kayıt (bölüm bir hariç), bir bellek hücresi veya anlık bir değer olabilir, ancak buna izin verilmez her iki işleneni aynı anda bellek hücreleri olarak belirtin. İşlenenler bayt veya kelime olabilir. Komut SF, ZF ve PF bayraklarını etkiler. Bit düzeyinde çarpma kuralları:

Birinci işlenen biti 0101 İkinci işlenen biti 0011 Sonuç biti 0001 örnek 1 mov AX,0FFEh ve AX,5555h ;AX=0554h Örnek 2; Veri alanlarında: mem dw 0С003h ;Program segmentinde: mov AX,700Eh ve AX,mem ;AX=4002h

32 bit işlenenlerin ve 32 bit işlemcilerin ek adresleme modlarının kullanımı kabul edilebilir. Örnek

Mov EDX, 0FA8 8 0 0 4 lh ve EDX,0FF00000Fh ; EDX = FA000001h
386P+ ARPL
İstenen seçici ayrıcalık düzeyini ayarlama

aprl komutu, seçiciyi izin verilen maksimum ayrıcalık düzeyini (genellikle CS seçici) içeren bir modelle karşılaştırır ve test edilecek değeri iki ayrıcalık düzeyinden daha düşük olana ayarlar. Seviye değişikliği gerekmiyorsa ZF bayrağı gerekirse sıfırlanır, ayarlanır. aprl komutunun ilk işleneni, 16 bitlik bir kayıt veya kontrol edilebilir bir seçiciye sahip bir hafıza sözcüğü olabilir; ikinci işlenen, bir model seçiciye sahip 16 bitlik bir kayıttır. 386+ BAĞLI
Dizi sınırlarının ötesine geçip geçmediğini görmek için dizi indeksini kontrol etme

Sınırlı komut, işaretli bir sayı olarak değerlendirilen belirtilen dizinin ikinci işlenen tarafından belirtilen sınırlar içinde olup olmadığını kontrol eder. İndeks dizinin sınırlarının altına veya üstüne çıkarsa, vektör 5 ile bir kesme oluşturulur. İlk işlenen, kontrol edilen dizini içeren bir kayıt olmalıdır, ikincisi ise dizinin iki sınırına sahip bir bellek alanının adresi olmalıdır. kontrol ediliyor. Sınırlı komut hem 16 bitlik hem de 32 bitlik işlenenlere izin verir (ancak hem birinci hem de ikinci işlenenler aynı türde olmalıdır).

Montajcı- Aptallar için montaj dili

Aptallar için montaj dili.(#2) (C) Mikhail Spitsyn 1995 Bayraklar İşlemcinin "F" kaydına bayrak denir. Ne olduğunu? Bayrak, iki duruma sahip olabilen bir değişkendir: ayarlanmış (bire eşit) ve temizlenmiş (sıfıra eşit). Bu nedenle, "F" kaydı sekiz bayrak biti kümesi olarak düşünülebilir. Bunlardan yalnızca dördünü kullanabiliriz: sıfır bayrağı, taşıma bayrağı, işaret bayrağı ve eşlik taşması bayrağı.Aritmetik işlemler. Aritmetik çok ama çok yararlı bir bilimdir; sürekli bir şeyler sayarız: toplar, çıkarır, böler, çarparız. Şimdi bunun assemblerda nasıl yapılacağından bahsedeceğiz. En basit şeyle başlayacağız, örneğin "A"yı kaydetmek için bir şeye bir tane ekleyerek başlayacağız: *************************** *** ** LD A,NUBER INC A RET ******************************** Gördüğünüz gibi bunun için çok basit bir "INC" komutu var - artış (bir artış), ardından bir işlenen, yani. bazı kayıt veya kayıt çifti: ******************************** INC A INC HL INC H INC DE INC E INC IY INC E Inc (HL) Inc (IX+N) Inc (IY+N) ****************************** ** Herhangi bir hafıza hücresini birer birer artırmak istiyorsanız şunu yapmalısınız: ********************************* ****** *** LD HL,ADRES LD IX,ADRES INC (HL) INC (IX+0) RET RET ********************* **************** ***** Bir bellek hücresiyle çalışıyorsanız ilk seçenek daha hızlı çalışır ve daha kullanışlıdır, ancak bir tabloda çalışıyorsanız o zaman değildir ekonomik ve çirkin. Karşılaştırın: tablodaki birinci, beşinci ve onuncu baytları birer birer artırmamız gerekiyor: ******************************* * LD HL,TABL+1 LD IX,TABL INC (HL) INC (IX+1) LD HL,TABL+5 INC (IX+5) INC (HL) INC (IX+10) LD HL,TABL+10 RET INC (HL) RET ******************************** Yukarıda birer artışla ilgili söylenenlerin hepsi doğrudur ve azalma için, yani birer azaltmak için: ******************************** DEC A DEC HL DEC L DEC IX DEC H DEC DE DEC E DEC BC DEC D DEC IY DEC C DEC IX DEC B DEC (HL) DEC (IX+N) DEC (IX+N) ********************* *********** Şimdi “A” kaydını bir değil on kat artırmamız gerektiğini varsayalım: **************** * *************** LD A,NUMARA EKLE A,10 RET ************************* * ****** "A" kaydını bir sayı ve diğer kayıtlarla ve "HL", "IX" ve "IY" kayıt çiftleri tarafından adreslenen bir bellek hücresiyle ekleyebilirsiniz. Ayrıca "HL", "IX" ve "IY" ile kayıt çiftleri de ekleyebilirsiniz. (PureBasic - dosya sistemi) ******************************** A EKLE,N A EKLE,(HL) A EKLE ,A EKLE A,(IX+N) EKLE A,B EKLE A,(IY+N) EKLE A,C HL EKLE,HL EKLE A,D HL EKLE,BC EKLE A,E HL EKLE,DE ​​EKLE A,H HL EKLE,SP EKLE IX,IX EKLE IX,BC EKLE IX,DE EKLE IX,SP ****************************** ** Gördüğünüz gibi komut seti oldukça geniştir. Bu komutu çalıştırırken bir hata oluşabilir: ******************************** LD A,45 LD B,230 ADD A ,B RET ******************************** "A" ve "B" toplamı 255'i aştı ve bu nedenle "A"daki "" 275 değil 20 olacaktır ("A" kaydı kauçuk değildir); Bir taşmanın meydana geldiğini bize bildirmek için işlemci, taşıma bayrağını bire ayarlar. Geriye sadece kontrol etmek kalıyor. "INC"nin "DEC"i olduğu gibi "ADD"nin de bir "çifti" vardır, bu "SUB"dur ve kendine has özellikleri vardır. "SUB" komutu yalnızca "A" kaydıyla çalışır, bu nedenle bu komut için anımsatıcılar yazarken "A" atlanır: ********************* *********** SUB N SUB C SUB A SUB H SUB B SUB D SUB E SUB (HL) SUB (IX+N) SUB (IY+N) ******** * ********************** Komut, taşıma bayrağını “ADD” ile aynı şekilde etkiler. "ADD" ve "SUB" komut çiftine ek olarak başka bir çift daha vardır. "ADC" ve "SBC" komutları taşıma bayrağını dikkate alarak çalışır; Toplama veya çıkarma sırasında, taşıma bayrağının değeri sonuca eklenir (çıkarılır). Taşıma bayrağını ayarlamak için iki özel komut vardır: "SCF" ve "CCF". "SCF" - taşıma bayrağını bire ayarlayın. "CCF" - taşıma bayrağını sıfıra ayarlayın. ******************************** ADC A,N SBC A,N ADC A,A SBC A,A ADC A ,H SBC A,H ADC A,L SBC A,L ADC A,D SBC A,D ADC A,E SBC A,E ADC A,B SBC A,B ADC A,C SBC A,C ADC A,( HL) SBC A,(HL) ADC A,(IX+N) SBC A,(IX+N) ADC A,(IY+N) SBC A,)IY+N) ADC HL,HL SBC HL,HL ADC HL ,BC SBC HL,BC ADC HL,DE SBC HL,DE ADC HL,SP SBC HL,SP **************************** **** Ve şimdi “ADC” ve “SBC” komutlarının çalışmasına örnekler: ***************************** ** * LD A,10 LD A,10 LD B,5 LD B,5 CCF CCF SBC A,B ADC A,B RET RET A=5 B=5 A=15 B=5 ******* * *********************** İki komut “CCF” ve “SBC A,B” yerine basitçe “SUB B” yazabilirsiniz, sonuç aynı olacak . ******************************** LD A,10 LD A,10 LD B,5 LD B,5 SCF SCF SBC A,B ADC A,B RET RET A=4 B=5 A=16 B=5 **************************** ********** **** Sonuçlardan da anlaşılacağı üzere taşıma bayrağı operasyon sonucunu önemli ölçüde etkilemektedir. Çıkarma yaparken sonuçtan çıkarılır, eklerken sonuca eklenir. Toplama ve çıkarma işlemleriyle ilgili hemen hemen her şey anlatıldı; şimdi bölme ve çarpmadan bahsedeceğiz. Ne yazık ki SPECCY'de bölme ve çarpma komutları yoktur, ancak bu komutlar birkaç başka komuttan oluşabilir. Örneğin, iki kaydın içeriğini çarpmamız gerekiyor - “A” ve “C”: ***************************** ********** *** LD A,10 LD C,5 LD B,A XOR A LOOP ADD A,C DJNZ LOOP RET *************** ********** ******* Örnekte iki yeni komut vardır - “XOR A” ve “DJNZ LOOP”. "XOR A", "A" kaydını temizler ve "DJNZ LOOP" komutu, bir etiketle işaretlenmiş komuttan (örneğin, "LOOP") "DJNZ" komutuna (ardından aynı etiket gelir) kadar tüm komutları tekrarlar. ka, döngünün başlangıcında olduğu gibi); tekrar sayısı "B" kaydında belirtilir. M'yi N ile çarpmanın M sayısını kendisine N kez eklemek anlamına geldiğini kullanarak yukarıda verilen örneği anlayabilirsiniz. Bu özellik aynı zamanda bölme işlemi için de kullanılabilir. Kendin dene. Bir dahaki sefere bitleri karşılaştırma ve bunlarla çalışma komutları hakkında konuşacağız.________________________________

Sayıdaki diğer yazılar:





Tepe