Assembler'da resimli öğretici. Montaj dili aritmetik talimatları

Takım ADC(Taşıyarak Ekle) bir gruba aittir tamsayı komutları(veya ikili)aritmetik (İkili Aritmetik Talimatlar) ve iki işaretli veya işaretsiz işlenenin ( HEDEF Ve SRC) Ve bayrak taşımak EFLAGS.CF . ilk işlenen ( hedef işlenen, HEDEF) bir kayıtta veya bellekte bir değişken olabilir ( , r16, r32 , r/m8, r/m16, r/m32). ikinci işlenen ( kaynak işlenen, SRC) — anlık değer ( ımm8, imm16, ımm32), bir kayıttaki veya bellekteki bir değişken. Bu durumda, her iki işlenen de aynı anda bellekte değişken olamaz.

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

Acil değeri eklerken ımm8 veya imm16 iki baytlık veya dört baytlık bir işlenenle, anlık değer önce ilk işlenenin boyutuna genişletilir ve ancak bundan sonra toplama gerçekleştirilir.

Takım ADC yaygın olarak çok baytlı veya çok sözcüklü olarak kullanılır ( çok kelimeli) toplama işlemleri. Bu durumda, çok baytlı (çok sözcüklü) işlenenlerin alt bitlerinin toplamını döndüren ve daha yüksek bitler eklenirken taşımanın dikkate alınmasına izin veren ADD komutunu izler. Örneğin:

taşı edx, 0 ; EDX = 0
hareket eax, 0FFFFFFFFh ; ilk 32 bitlik terim EAX'e yerleştirilir
eax ekle, 0FFFFFFFFh ; ikinci 32 bit terim - 0x FFFFFFFFh, iki adet 32 ​​bit işlenen ekleyin
adc edx, 0 ; EDX = EDX + CF, transferi dikkate alın
; EDX:EAX = 0000000lh:FFFFFFFEh - 64 bit sonuç alındı

Takım ADC tamsayı işlenenlerini olduğu gibi değiştirmenize olanak sağlar imzasız biçim, yanı sıra imzalı biçim. İmzalı veri ekleme işaret bayrağı EFLAGS.SF, sonucun işaretini yansıtacaktır. taşma bayrağı Ters kodda veya ikiye tümleyen kodda temsil edilen işaretli tamsayı değerlerinin eklenmesinde bir taşma varsa (işaret bitinden önceki bit'e karşılık gelen en anlamlı bitten taşıma), yani EFLAGS.OF 1 olarak ayarlanacaktır. , elde edilen sonuç -destination işleneninin kullanılabilir boyutunu aşıyor ( HEDEF). Özünde bu, EFLAGS.CF bayrağının toplama sırasında bir taşmayı (taşıma) nasıl yansıttığına benzer. işaretsiz işlenenler. Örneğin, ters kodda temsil edilen 32 bitlik iki değer eklenirken şöyle görünebilir:

hareket eax, işlenen1 ; EAX = işlenen1, ilk 32 bitlik terimi EAX'e koyun
eax, işlenen2 ekleyin; ters kodda iki 32 bit işlenenin eklenmesini gerçekleştirin
içine; taşma durumunda işleyiciyi kesmek için atla

adc eaks, 0 ; EAX = EAX + CF, taşımayı dikkate alın (ters koda eklenmesi için gereklidir)
; EAX = işlenen1 + işlenen2 - ters kodda toplamanın sonucu
jns m1 ; sonuç pozitifse atla
xor eax, 7FFFFFFFh ; EAX'teki negatif bir değeri doğrudan bir koda dönüştürme
m1: ; EAX - doğrudan koda eklemenin sonucu

yardımcı bayrak(veya ek olarak)Aktar EFLAGS.AF, BCD biçimindeki verilerin işlenmesine yardımcı olur ( paketlenmiş BCD formatı). Toplama, sonucun düşük baytının alt tetraddan yüksek tetrada taşınmasıyla sonuçlanırsa ayarlanır. Komuttan hemen sonra DAA komutunu kullanarak ADC, sözde üretmek mümkündür ondalık düzeltme Toplama sonucu ve toplamı aynı şekilde elde edin paketlenmiş BCD formatı, orijinal terimler gibi.

Takım ADC hedef işlenen ile ( HEDEF), bellekteki bir değişken olan, komutun atomik olarak yürütülmesini sağlayacak olan LOCK kilit ön eki ile birlikte kullanılabilir.

Toplama komutları - ADD, ADC

ADD (ekle - ekle) ve ADC (taşıyarak ekle) komutları hem 8-bit hem de 16-bit işlenenler ekleyebilir.

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

Komut formatı: Alıcı EKLE, kaynak

Sembolik gösterimde, eylemleri şu şekilde açıklanabilir: lavabo: = lavabo + kaynak (havuz ve kaynağın içeriğinin toplamı havuza yazılır).

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

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

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

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

İkili sayıları eklerken taşıma, bir sütuna ondalık sayılar eklerken taşımaya benzer. Bilgisayar ikili sayılar eklediğinde ve toplam, alıcı işlenene sığmadığında, bir taşıma üretilir. Bildiğiniz gibi, 8 bitlik bir kayıt, 0 ile 255 arasında işaretsiz değerler içerebilir. Örneğin, 250 ve 10 sayılarının ikili toplamasını yaparsak, aşağıdaki sonucu alırız:

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

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

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

Sonuç doğrudur, ancak 9 ikili bit kaplar. 8 bitlik kayıtlar kullanılmışsa, alt 8 bit hedef kayıt defterine ve dokuzuncu bit taşıma bayrağı CF'ye girilecektir.

Şimdi 8086 mikroişlemcisinin neden iki farklı toplama komutuna sahip olduğu açı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. Daha yüksek hassasiyet değerlerinin daha yüksek kısımlarını eklemek için başka bir komut (ADC) kullanılır.

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

BALTA EKLE,MEM_WORD; bir hafıza hücresinin içeriğini bir kayda eklemek,

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

EKLE, 10; yazmacın içeriğine bir sabit ekleyin.

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

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

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

bayrak taşımak Toplama sonucu hedef işlenene uymuyorsa CF 1'dir, aksi takdirde 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 önemli bit 1'dir), aksi halde 0'dır;

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

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

Takım A.Ş.(artırma - artırma), kayıt veya bellek konumunun içeriğine 1 ekler, ancak ADD komutunun aksine taşıma bayrağını CF etkilemez. Komut formatı: INC alıcısı.

INC komutu, komut döngülerindeki artan sayaçlar için kullanışlıdır. Ardışık bellek konumlarına erişirken bir dizin kaydının değerini artırmak için de kullanılabilir. İşlenen, işaretsiz bir sayı olarak yorumlanır.

Örneğin:

INC.CX; 16-bit değerini artırın

I.N.C.AL; veya birim başına 8 bitlik kayıt.

INC MEM_BYTE; bayt değerini artır

INC MEM_WORD; veya birim başına bellek kelimeleri.

İşlenen olarak anlık bir değere izin verilmez.

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

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

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

lavabo:= lavabo - kaynak.

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

ALT alıcı, kaynak - CF;

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

Toplamda olduğu gibi, SUB ve SBB komutları iki ayrı işlevi yerine getirir. İlk komut, bayt veya kelime boyutundaki sayıların yanı sıra yüksek kesinlikli sayıların düşük dereceli bitlerini çıkarır (sayının düşük dereceli kısmı AX kaydında bulunur ve yüksek dereceli kısmı DX kaydındadır) ). İkinci komut, daha yüksek hassasiyetli sayıların daha yüksek bitlerini çıkarır. Örneğin, SUB AX,CX komutu; CX içeriğini AX içeriğinden çıkarır ve sonucu AX'e döndürür.

İşlenen boyutları 16 biti aşarsa, aşağıdaki komut dizisi uygulanmalıdır:

ALT AX, CX; Alt 16 biti çıkarın;

SBB BX,DX; ve sonra üst 16 bit.

Burada AX ve BX kayıtlarındaki 32 bitlik sayıdan CX ve DX kayıtlarındaki 32 bitlik sayıyı çıkarıyoruz. DX kaydının içeriğini BX kaydının içeriğinden çıkarırken, SBB komutu ilk çıkarma işlemini gerçekleştirirken ödünç alma olasılığını dikkate alır.

ALT BALTA, MEM; Bellek hücresinin içeriğini kayıt defterinden çıkarın.

ALT MEM ,AX; Hafıza hücresinden kaydı çıkarın.

ALT AL,10; Bir kayıttan bir sabit çıkarın.

ALT MEM_BYTE,OFh; Bellek hücresinden bir sabiti çıkarın.

Doğrudan çıkarılamaz bir bellek konumunun içeriğini diğerinden alın veya hedef olarak anlık değeri kullanın.

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

düzenlemek bayrak taşımakÖdünç alınması gerekiyorsa CF'den 1'e, aksi takdirde 0'dır;

düzenlemek parite bayrağıÇıkarma sonucunda 1 değerine sahip çift sayıda bit varsa, PF'den 1'e, aksi halde 0'dır;

düzenlemek yardımcı taşıma bayrağı Ondalık sayıları çıkarmanın sonucunun düzeltilmesi gerekiyorsa AF'den 1'e, aksi takdirde 0'dır;

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

düzenlemek işaret bayrağı sonuç negatifse (en önemli bit 1'dir), aksi halde işaret 0'dır;

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

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.

Alıcı İçeriği Azaltma Komutu - DEC

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

DEC komutu genellikle döngülerde bir sayacı sıfır veya negatif olana kadar azaltmak için kullanılır. Ardışık bellek konumlarına erişirken bir indeks kaydını veya işaretçiyi azaltmak için de kullanılabilir. Örneğin:

DECCX; 16 bitin değerini azaltın,

ETİKET; veya 8 bitlik kayıt.

DEC MEM_BYTE; Bir baytın değerini azaltın,

Aralık MEM_WORD; veya kelime hafıza hücresi.

Bölme komutları - DIV, IDIV

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

div kaynağı; Nerede kaynak- bayt veya kelime cinsinden bölen boyutu,

IDIV kaynağı;genel bir kayıtta veya hafıza konumunda bulunur.

Aşağıdakilere dikkat edin:

1. Bölen ile ilgili temettü, çift büyüklüğe sahip olmalıdır.

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

3. Komut 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ı AH kaydına döndürülür;

· kaynak işlenen bir sözcük ise, bölüm AX kaydına, geri kalanı ise DX kaydına döndürülür.

Her iki komut da bayrakların durumunu tanımsız bırakır, ancak bölüm hedef yazmaca (AL veya AX) sığmazsa, mikroişlemci 0 tipinde bir kesme üretir (0'a böl).

4. Bölme sonucu taşması aşağıdaki koşullarda gerçekleşir:

bölen 0'dır;

· işaretsiz baytları bölerken, pay bölenin en az 256 katıdır;

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

· işaretli baytları bölerken, bölüm -128 ila +127 aralığının dışında kalıyor;

kelimeleri bir işaretle bölerken, bölüm aralığın dışında kalıyor

32768 ila 32767.

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

DIV BX; DX:AX'i BX'e bölün, imzasız.

DIV MEM_BYTE; AX'i imzasız bellek baytına bölün.

IDIV DL; AX'i imzalı DL'ye bölün.

İDIV MEM SÖZCÜ; DX:AX'i işaretli bir hafıza word'üne bölün.

DIV ve IDIV komutları, işlemci bölenin veri tipini belirleyemediği için anlık bir değerle doğrudan bölmez.

Çarpma yönergeleri - MUL, IMUL

Takım MUL(çarpma-çarpma) işaretsiz sayıları çarpar, a IMUL(tamsayı çarpma) işaretli tamsayıları çarpar. Her iki komutun çarpanı ve çarpanı aynı türde veri olmalıdır, yani baytlar, sözcükler, çift sözcükler vb.

Bu komutlar aşağıdaki biçime sahiptir:

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

IMUL kaynağı; veya bayt veya sözcük boyutunda bir bellek hücresi.

İlk işlenen (çarpan) 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- AH (yüksek bayt) ve AL (düşük bayt) kayıtlarında 16 bitlik bir ürün 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. Bu nedenle, ürünün boyutu N- bit faktörleri eşittir 2n.

Taşımalı ADC Tamsayı Toplama

Takım adc sonuca taşıma bayrağı CF'nin değerini ekleyerek birinci ve ikinci işlenenlerin toplamını gerçekleştirir. İlk işlenenin (alıcının) orijinal değeri kaybolur, yerine toplamanın sonucu gelir. İkinci işlenen değişmez. Bir talimatın ilk işleneni olarak adc

İşlenenler bayt veya sözcük olabilir ve işaretli veya işaretsiz sayıları temsil eder. Takım adc(ekip ile 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:

Hareket AX,1125h adc AX,2C25h; CF = 1 ise AX=3D4Bh ;CF = 0 ise AX=3D4Ah

Örnek 2:

; Veri alanlarında: numlow dw 0FFFFh; 2. dönem numhigh dw 000Sh'nin alt kısmı; 2. dönemin üst kısmı;Sayı 0005FFFFh=393215 ;Program segmentinde: mov AX,000Sh; 1. dönem mov BX,0002h'nin alt kısmı; 1. dönemin en yüksek kısmı;Sayı 00020005h=131077 add AX,numlow; Küçük parçaların eklenmesi. AX=4, CF=1 adc BX, numhigh; Transfer 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ılmasına izin verilir. Takım adc 32 bitlik işlenenlerle 64 bitlik tamsayıları eklemek için kullanılabilir.

Örnek:

; Veri alanlarında mem321 dd 0FFFFFFFFh; 1. dönem mem32h dd 98765432h'nin alt kısmı; 1. dönemin kıdemli kısmı; Program segmentinde hareket EAX,1; 2. dönem hareketin alt kısmı EBX,0; 2. terimin yüksek kısmı EAX,mem321'i ekler; Alt yarımları toplayın;Toplam=100000000h>32 bit;EAX=000000h, adc EBX,mem32h; Üst yarıları katlayıp aktarıyoruz. EBX=90000001h; Tutar: 9876543300000000h

EKLE Tamsayı toplama

Takım eklemek birinci ve ikinci işlenenlerin toplamını gerçekleştirir. İlk işlenenin (alıcının) orijinal değeri kaybolur, yerine toplamanın sonucu gelir. İkinci işlenen değişmez. Bir talimatın ilk işleneni olarak eklemek ikinci olarak bir kayıt (birinci segment hariç) veya bir bellek hücresi belirtebilirsiniz - bir kayıt (birinci segment hariç), bir bellek hücresi veya anlık bir değer, ancak, her iki işleneni aynı anda tanımlamanıza izin verilmez hafıza hücreleri olarak.

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

örnek 1:

Taşı BX,IFFEh taşı CX,3 BX,CX'i ekleyin; BX=2001h, CX=0003h

Örnek 2:

Hareket AX,25h AX,12h ekle; AX=0037h

Örnek 3:

; Veri alanlarında: mem dw 128 ;Program segmentinde: mem,100 ekleyin; mem=228

Taşımalı ADC Tamsayı Toplama

adc komutu birinci ve ikinci işlenenleri toplayarak sonuca taşıma bayrağının (CF) değerini ekler. İlk işlenenin (alıcının) orijinal değeri kaybolur, yerine toplamanın sonucu gelir. İkinci işlenen değişmez. adc komutunun ilk işleneni olarak, bir kayıt (segment hariç) veya bir bellek hücresi, ikincisi olarak - bir kayıt (bir segment hariç), bir hafıza hücresi veya anlık bir değer belirtebilirsiniz, ancak, bellek hücreleri olarak aynı anda her iki işleneni belirtmesine izin verilmez. İşlenenler bayt veya sözcük olabilir ve işaretli veya işaretsiz sayıları temsil eder. 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 daha yüksek kısmı;Sayı 0005FFFFh=393215 ;Program segmentinde: mov AX,000Sh ;1. terimin alt kısmı mov BX,0002h ; 1. terimin en yüksek kısmı;Sayı 00020005h=131077 add АХ,numlow ;Alt kısımların eklenmesi. AX=4, CF=1 adc BX, numhigh ;Sayı 00080004h=524292
32 bit işlenenlerin ve 32 bit işlemcilerin ek adresleme modlarının kullanılmasına izin verilir. 32 bit işlenenli adc komutu, 64 bit tamsayıları eklemek için kullanılabilir. Örnek 3; Veri alanlarında mem321 dd 0FFFFFFFFh ;1. terimin alt kısmı mem32h dd 98765432h ;1. terimin üst kısmı; Program segmentinde mov EAX,1 ;2. terim mov EBX,0'ın düşük kısmı ;2. terimin yüksek kısmı EAX,mem321 ekleyin ;Alt yarıları ekleyin;Sum=100000000b>32 bit;EAX=000000h, adc EBX,mem32h ; Biz eski yarımları ekleyin ve aktarın. EBX=90000001h ;Miktar: 9876543300000000h
EKLE Tamsayı toplama

Add komutu, birinci ve ikinci işlenenleri ekler. İlk işlenenin (alıcının) orijinal değeri kaybolur, yerine toplamanın sonucu gelir. İkinci işlenen değişmez. Ekle komutunun ilk işleneni olarak, bir kayıt (segment hariç) veya bir bellek hücresi, ikincisi olarak - bir kayıt (bir segment hariç), bir hafıza hücresi veya anlık bir değer belirtebilirsiniz, ancak, bellek hücreleri olarak aynı anda her iki işleneni tanımlamasına izin verilmez. İşlenenler bayt veya sözcük olabilir ve işaretli veya işaretsiz sayıları temsil eder. Add komutu hem normal tamsayıları hem de ikili ondalık sayıları toplamak için kullanılabilir (sonucu saklamak için AX kaydını kullanarak). Paketlenmemiş ikili ondalık (BCD) sayılar ekleniyorsa, add komutundan sonra aaa komutu kullanılmalıdır; paketlenmiş sayılar toplanırsa, o zaman daa komutu. Komut OF, SF, ZF, AF, PF ve CF bayraklarını etkiler. örnek 1

Mov BX,lFFEh mov CX,3 BX,CX ekleyin ;BX=2001h, CX=0003h
Örnek 2 hareket AX,25h AX,12h ekle ;AX=0037h
Örnek 3; Veri alanlarında: mem dw 128 ;Program segmentinde: mem,100 ;mem=228 ekleyin
Örnek 4 mov AX,0507h ;BCD ambalajsız 57 AL,05h ekle ;BCD 5, AX=050Ch aaa ;AX=0602h, BCD 62
Örnek 5 hareket 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ılmasına izin verilir. Örnek

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

ve komutu, birinci işlenenin ikinci işlenenle mantıksal (bit düzeyinde) bir çarpımını gerçekleştirir. İlk işlenenin (alıcının) orijinal değeri, çarpmanın sonucuyla değiştirilerek kaybolur. ve komutunun ilk işleneni olarak, bir kayıt (bölüm hariç) veya bir bellek hücresi, ikincisi olarak - bir kayıt (bölüm hariç), bir bellek hücresi veya anlık bir değer belirtebilirsiniz, ancak bu her iki işleneni aynı anda bellek hücreleri olarak tanımlamasına izin verilmez. İşlenenler bayt veya sözcük olabilir. Komut SF, ZF ve PF bayraklarını etkiler. Bitsel çarpma kuralları:

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

32 bit işlenenlerin ve 32 bit işlemcilerin ek adresleme modlarının kullanılmasına izin verilir. Örnek

Mov EDX, 0FA8 8 0 0 4 lh ve EDX,0FF00000Fh ; EDX=FA000001h
386P+ARPL
Seçicinin talep edilen ayrıcalık seviyesinin düzeltilmesi

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 kontrol edilecek değeri iki ayrıcalık düzeyinden daha düşük olanına ayarlar. Seviye değişikliği gerekmiyorsa ZF bayrağı sıfırlanır, gerekirse ayarlanır. aprl komutunun ilk işleneni, kontrol edilecek bir seçici ile 16 bitlik bir kayıt veya bellek sözcüğü olabilir; ikinci işlenen olarak, model seçicili 16 bitlik bir kayıt. 386+ BAĞLI
Sınır dışı dizi için bir dizi dizinini kontrol etme

Bağlı komut, işaretli bir sayı olarak ele alınan belirtilen dizinin ikinci işlenen tarafından verilen sınırlar içinde olup olmadığını kontrol eder. İndeks, dizinin altındaki veya üstündeki sınırların dışındaysa, vektör 5 ile bir kesme üretilir. İlk işlenen, kontrol edilen indeksi içeren bir kayıt olmalıdır, ikinci işlenen, iki ile bir bellek alanının adresi olmalıdır kontrol edilen dizinin sınırları. Bağlı yönerge hem 16-bit hem de 32-bit işlenenleri kabul eder (ancak hem birinci hem de ikinci işlenen aynı türde olmalıdır).

montajcı- Aptallar için montajcı

Aptallar için montajcı.(#2) (C) Mihail Spitsyn 1995 Bayraklar Kayıt "F" işlemci bayrağı olarak adlandırılır. Ne olduğunu? İşaret, iki duruma sahip olabilen bir değişkendir - ayarlanmış (bire eşit) ve temizlenmiş (sıfıra eşit). Bu nedenle, "F" yazmacı, sekiz bayrak biti kümesi olarak düşünülebilir. Bunlardan sadece dördünü kullanabiliriz: sıfır bayrağı, taşıma bayrağı, işaret bayrağı ve parite taşma bayrağı.Aritmetik işlemler. Aritmetik çok ama çok faydalı bir bilimdir, sürekli bir şeyler sayarız: toplar, çıkarır, böler, çarparız. Bunun bir montajcıda nasıl yapılacağı hakkında şimdi konuşacağız. En basitinden başlayalım, bir şeye, örneğin "A" kaydına bir tane ekleyelim: ***************************** * ** LD A,NUBER A.Ş. A RET ********************************* Gördüğünüz gibi, çok basit, bunun için bir "INC" takımı var - işlenen geldikten sonra artış (bir artış), 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 bellek hücresini bir artırmanız gerekiyorsa, bunu yapmanız gerekir: ****************************** * *** LD HL,ADRES LD IX,ADRES INC (HL) INC (IX+0) RET RET ************************** **** ***** Tek bellek hücresi ile çalışıyorsanız ilk seçenek daha hızlı ve daha uygundur, ancak bir masada çalışıyorsanız ekonomik ve çirkin değildir. Karşılaştırma: tablodaki birinci, beşinci ve onuncu baytları bir 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 ********************************* Artış hakkında yukarıda söylenenlerin hepsi by one doğrudur ve azalma için, yani. bir azaltmak için: ********************************* ARA A ARA HL ARA L ARA IX ARA H ARALIK DE ARALIK ARALIK BC ARALIK D ARALIK ARALIK C ARALIK IX ARALIK B ARALIK (HL) ARALIK (IX+N) ARALIK (IX+H) ****************** *** *********** Ve şimdi "A" kaydını bir değil, diyelim ki on artırmamız gerektiğini varsayalım: ************* ******** *************** LD A,NUMBER ADD 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 hafıza hücresi ile ekleyebilirsiniz. Kayıt çiftlerini "HL", "IX" ve "IY" ile de ekleyebilirsiniz. (PureBasic - dosya sistemi) ******************************* ADD A,N ADD A,(HL ) ADD A ,A ADD A,(IX+N) ADD A,B ADD A,(IY+N) ADD A,C ADD HL,HL ADD A,D ADD HL,BC ADD A,E ADD HL,DE ADD A,H ADD HL,SP ADD IX,IX ADD IX,BC ADD IX,DE ADD IX,SP *************************** *** ** Gördüğünüz gibi, komut dizisi oldukça geniştir. Bu komutu yürütürken bir hata oluşabilir: ********************************* LD A,45 LD B ,230 ADD A ,B RET ****************************** "A" ve "B" toplamı aşıldı 255 ve bu nedenle "A" da 275 değil, 20 ("A" kaydı kauçuk değildir); Taşma olduğunu anlamamız için işlemci taşıma bayrağını bir olarak ayarlar. Sadece kontrol etmek için kalır. Tıpkı "INC"de "DEC" olduğu gibi, "ADD"de de bir "çift" var, bu "SUB" ve kendine has özellikleri var. "SUB" ekibi yalnızca "A" kaydıyla çalışır, bu nedenle bu komutun anımsatıcısını yazarken "A" atlanır: ********************* ** ********* ALT N ALT C ALT A ALT H ALT B ALT D ALT E ALT (HL) ALT (IX+N) ALT (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ğıyla çalışır, örn. toplama veya çıkarma yaparken, taşıma bayrağının değeri sonuca eklenir (çıkarılır). Taşıma bayrağını ayarlamak için iki özel komut vardır - bunlar "SCF" ve "CCF" dir. "SCF" - taşıma bayrağını bir olarak 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ı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 ********* * ********************** "CCF" ve "SBC A, B" olmak üzere iki komut yerine sadece "SUB B" koyabilirsiniz, sonuç aynı ol ****************************** 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 görülebileceği gibi, taşıma bayrağı işlemin sonucunu önemli ölçüde etkiler. Çıkarma yapılırken sonuçtan çıkarılır, toplanırken sonuca eklenir. Toplama ve çıkarma işlemleri hakkında neredeyse her şey anlatıldı, şimdi bölme ve çarpma işlemlerine değineceğiz. Ne yazık ki SPECCY'nin bölme ve çarpma takımları yoktur, ancak bu takımlar birkaç başka takımdan 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ı sıfırlar ve "DJNZ LOOP" komutu, bir etiketle işaretlenmiş komuttan (örneğin, "LOOP") "DJNZ" komutuna (ardından şu gelmeli) kadar tüm komutları tekrarlar: aynı etiket) ka, döngünün başında olduğu gibi); tekrar sayısı "B" kaydında ayarlanır. M'yi N ile çarpmanın, M'yi kendisine N kez eklemek olduğu gerçeğini kullanarak, yukarıdaki örneği ele alabilirsiniz. Bu özelliği bölme işlemi için de kullanabilirsiniz. Kendin yapmaya çalış. Bir dahaki sefere karşılaştırma ve bit işleme komutları hakkında konuşacağız.________________________________

Sayının diğer makaleleri:





Tepe