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