Montaj - Adresleme Modları

Çoğu montaj dili talimatı, işlenenlerin işlenmesini gerektirir. Bir işlenen adresi, işlenecek verilerin depolandığı konumu sağlar. Bazı komutlar bir işlenen gerektirmezken, diğer bazı komutlar bir, iki veya üç işlenen gerektirebilir.

Bir talimat iki işlenen gerektirdiğinde, ilk işlenen genellikle bir kayıt veya bellek konumunda veri içeren hedeftir ve ikinci işlenen kaynaktır. Kaynak, ya teslim edilecek verileri (anında adresleme) ya da verilerin adresini (kayıt veya hafızada) içerir. Genellikle kaynak veriler işlemden sonra değişmeden kalır.

Üç temel adresleme modu şunlardır:

  • Adreslemeyi kaydet
  • Anında adresleme
  • Bellek adresleme

Kayıt Adresleme

Bu adresleme modunda, bir kayıt işleneni içerir. Talimata bağlı olarak, kayıt ilk işlenen, ikinci işlenen veya her ikisi olabilir.

Örneğin,

MOV DX, TAX_RATE   ; Register in first operand
MOV COUNT, CX	   ; Register in second operand
MOV EAX, EBX	   ; Both the operands are in registers

Kayıtlar arasında veri işlemek bellek içermediğinden, verilerin en hızlı şekilde işlenmesini sağlar.

Anında Adresleme

Bir anlık işlenenin sabit bir değeri veya bir ifadesi vardır. İki işlenenli bir talimat anında adresleme kullandığında, birinci işlenen bir kayıt veya bellek konumu olabilir ve ikinci işlenen bir anlık sabittir. İlk işlenen, verilerin uzunluğunu tanımlar.

Örneğin,

BYTE_VALUE  DB  150    ; A byte value is defined
WORD_VALUE  DW  300    ; A word value is defined
ADD  BYTE_VALUE, 65    ; An immediate operand 65 is added
MOV  AX, 45H           ; Immediate constant 45H is transferred to AX

Doğrudan Bellek Adresleme

Hafıza adresleme modunda işlenenler belirtildiğinde, ana hafızaya, genellikle veri segmentine doğrudan erişim gereklidir. Bu adresleme yöntemi, verilerin daha yavaş işlenmesine neden olur. Hafızadaki verinin tam yerini bulmak için, tipik olarak DS kaydında bulunan segment başlangıç ​​adresine ve bir ofset değerine ihtiyacımız var. Bu ofset değeri aynı zamandaeffective address.

Doğrudan adresleme modunda, ofset değeri doğrudan talimatın bir parçası olarak belirtilir ve genellikle değişken adı ile gösterilir. Assembler, ofset değerini hesaplar ve programda kullanılan tüm değişkenlerin ofset değerlerini saklayan bir sembol tablosu tutar.

Doğrudan bellek adreslemede, işlenenlerden biri bir bellek konumuna ve diğer işlenen bir yazmacıya başvurur.

Örneğin,

ADD	BYTE_VALUE, DL	; Adds the register in the memory location
MOV	BX, WORD_VALUE	; Operand from the memory is added to register

Doğrudan Ofset Adresleme

Bu adresleme modu, bir adresi değiştirmek için aritmetik operatörleri kullanır. Örneğin, veri tablolarını tanımlayan aşağıdaki tanımlara bakın -

BYTE_TABLE DB  14, 15, 22, 45      ; Tables of bytes
WORD_TABLE DW  134, 345, 564, 123  ; Tables of words

Aşağıdaki işlemler hafızadaki tablolardan kayıtlara verilere erişir -

MOV CL, BYTE_TABLE[2]	; Gets the 3rd element of the BYTE_TABLE
MOV CL, BYTE_TABLE + 2	; Gets the 3rd element of the BYTE_TABLE
MOV CX, WORD_TABLE[3]	; Gets the 4th element of the WORD_TABLE
MOV CX, WORD_TABLE + 3	; Gets the 4th element of the WORD_TABLE

Dolaylı Bellek Adresleme

Bu adresleme modu, bilgisayarın Segment: Ofset adresleme yeteneğini kullanır . Genel olarak, bu amaç için bellek referansları için köşeli parantez içinde kodlanmış olan EBX, EBP (veya BX, BP) temel kayıtları ve dizin kayıtları (DI, SI) kullanılır.

Dolaylı adresleme genellikle diziler gibi birkaç öğe içeren değişkenler için kullanılır. Dizinin başlangıç ​​adresi, örneğin EBX yazmacında saklanır.

Aşağıdaki kod parçacığı, değişkenin farklı öğelerine nasıl erişileceğini gösterir.

MY_TABLE TIMES 10 DW 0  ; Allocates 10 words (2 bytes) each initialized to 0
MOV EBX, [MY_TABLE]     ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110          ; MY_TABLE[0] = 110
ADD EBX, 2              ; EBX = EBX +2
MOV [EBX], 123          ; MY_TABLE[1] = 123

MOV Talimatı

Verileri bir depolama alanından diğerine taşımak için kullanılan MOV komutunu zaten kullandık. MOV komutu iki işlenen alır.

Sözdizimi

MOV komutunun sözdizimi -

MOV  destination, source

MOV talimatı aşağıdaki beş formdan birine sahip olabilir -

MOV  register, register
MOV  register, immediate
MOV  memory, immediate
MOV  register, memory
MOV  memory, register

Lütfen unutmayın -

  • MOV işlemindeki her iki işlenen de aynı boyutta olmalıdır
  • Kaynak işlenenin değeri değişmeden kalır

MOV talimatı bazen belirsizliğe neden olur. Örneğin, ifadelere bakın -

MOV  EBX, [MY_TABLE]  ; Effective Address of MY_TABLE in EBX
MOV  [EBX], 110	      ; MY_TABLE[0] = 110

110 sayısının bir bayt eşdeğerini veya kelime eşdeğerini taşımak isteyip istemediğiniz açık değildir. Bu gibi durumlarda, kullanmak akıllıca olacaktır. type specifier.

Aşağıdaki tablo, yaygın tür belirticilerinden bazılarını göstermektedir -

Tür Belirteci Baytlar adreslendi
BAYT 1
WORD 2
DWORD 4
QWORD 8
TBYTE 10

Misal

Aşağıdaki program, yukarıda tartışılan kavramlardan bazılarını göstermektedir. Belleğin veri bölümünde bir 'Zara Ali' adı depolar, ardından değerini programlı olarak başka bir 'Nuha Ali' ismine değiştirir ve her iki adı da görüntüler.

section	.text
   global _start     ;must be declared for linker (ld)
_start:             ;tell linker entry point
	
   ;writing the name 'Zara Ali'
   mov	edx,9       ;message length
   mov	ecx, name   ;message to write
   mov	ebx,1       ;file descriptor (stdout)
   mov	eax,4       ;system call number (sys_write)
   int	0x80        ;call kernel
	
   mov	[name],  dword 'Nuha'    ; Changed the name to Nuha Ali
	
   ;writing the name 'Nuha Ali'
   mov	edx,8       ;message length
   mov	ecx,name    ;message to write
   mov	ebx,1       ;file descriptor (stdout)
   mov	eax,4       ;system call number (sys_write)
   int	0x80        ;call kernel
	
   mov	eax,1       ;system call number (sys_exit)
   int	0x80        ;call kernel

section	.data
name db 'Zara Ali '

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Zara Ali Nuha Ali