Thursday, June 16, 2011

HW: Adresne mody ISA

Konecne nejaka zaujimavejsia tema, co sa tyka ISA :).

Ide nam o to, ze potrebujeme nejakym sposobom adresovat operandy, ktore sa nachadzaju v registroch a pamatiach. Pri adresovani potrebujeme zaistit

  • adresu urcenu s minimalnym poctom bitov v adresnej casti instrukcie 
  • moznost urcenia adresy relativne k adrese prave vykonavanej instrukcie 
  • jednoducho adresovat prvky roznych datovych struktur 
Registrova adresacia 
Operand sa nachadza v registroch. 

MOV AL, BH
MOV AX, BX 

kde operandy su registre rovnakeho typu (!). Napriklad by bolo chybou presuvat zo 16b registra do 8b ... 

Priama adresacia
Tu sa vyskytuju 8b, 16b alebo 32b (64b) konstanty v operande. Pristup je rychly, ale nejde modifikovat v priebehu vypoctu a takisto sa tento sposob neda vyuzit pre obsadenie segmentoveho registra. Pouziva sa vacsinou na inicializaciu registrov a premennych, masky pre logicke operacie a ako hranicne hodnoty. 

MOV CL, 10
MOV AX, 0ABCDH  # v hexa
CMP BL, 40H  # v hexa
ADD EAX, 12346789

Absolutny sposob adresacie 
Tento sposob je najjednoduchsim sposobom adresacie. Adresa je priamo sucastou instrukcie. Pouziva sa pri praci s premennymi, ktorych hodnoty su ulozene v pamati. 

MOV AX, ALFA    #do registra sa ulozi obsah slova na adrese alfa 
ADD CITAC, BL   #pripocitajte k premennej CITAC obsah BL
MOV ALFA, BETA # toto je chyba, presun pamat - pamat nie je mozny

Nepriama cez register
Tu je hodnota adresy ulozena v niektorom z registrov. 

ADD AX, [ESI]     #k AX sa pripocita obsah na adrese ESI 
MOV EDI, [EDI]  #do EDI sa presunie obsah na adrese EDI
MOX [EAX], AL  #AL sa ulozi na adresu v EAX

Bazova
Hodnota adresy je urcena ako sucet obsahu registra a konstanty, ktora je sucastou instrukcie. Pouziva sa pri pristupe k stejnolahlym prvkom roznych datovych struktur (napr. pole ;)). EPB sa pouziva ako bazovy register pre zasobnik. Tuto skutocnost vyuzivame v podrpogramoch, kde prenasame parametre cez zasobnik 

MOV AX, [EBP]10       #obe instrukcie pracuju so 6(???)-tym 16b slovom v poli s pociatocnou MOV AX., [EBP + 10]           #adresou v EBP
ADD [EBX]TEMP, CX   #obsah CX + obsah slova v poli s pociatocnou adresou v EBX a offset je urceny hodnotou TEMP (EBX + TEMP)
ADD AL, [EBX]       #k AL sa pricita hodnota slabiky urcena adresou z EBX

Indexova
Hodnota adresy je urcena ako sucet obsahu registra (indexoveho) a konstanty udaja tvoriaceho sucast instrukcie. Tento udaj je poloha pociatky pola. K urceniu poloh prvkov v poli sluzi obsah registrov. 

MOV AX, ARRAY[ESI]   #k AX pricitame obsah ARRAY[ESI], kde ESI je index
ADD ECX, ROW[EDI]   #do EDI sa presunie obsah slova na adrese EDI
MOC [EAX], AL             #obsah AL ulozi na adresu EAX 

Bazova Indexova 
ADD EBX ALFA [ESI], DI #pripocitaj k prvku pola ALFA[i,j] obsah DI