Menu
Coddy logo textTech

LEA - Adres Yükleme

Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası — ders 19 / 45.

Şu ana kadar, bellekten yazmaçlara değerleri yüklemek için mov komutunu kullandınız. Ancak bazen değeri değil, adresin kendisini istersiniz.

LEA, Load Effective Address anlamına gelir. Belleğe gitmeden bir bellek adresi hesaplar ve bu adresi bir kaydediciye (register) yerleştirir.

Sözdizimi:

lea register, [address]

MOV vs LEA:

KomutNe yapar
mov al, [number]Belleğe gider, içindeki değeri alır, al içine koyar
lea rsi, [number]Belleğe GİTMEZ. number değişkeninin adresini hesaplar ve rsi içine koyar

Bunu şu şekilde düşünebilirsiniz:

  • mov = kutuyu açın ve içindekini alın
  • lea = kutu numarasını (adresi) bir kağıda yazın

Örnek:

number db 42        ; 42 değeri bir adreste saklanır

mov al, [number]    ; al = 42 (değer)
lea rsi, [number]   ; rsi = number'ın adresi (örneğin, 0x402000)

Neden LEA'ya ihtiyacınız var?

Assembly'de, bir dizgiyi yazdırmak veya bir fonksiyona bir bellek konumu iletmek istediğinizde, değere değil, adrese ihtiyacınız olur. write sistem çağrısı (Bölüm 5'te öğreneceksiniz), rsi içinde bir adres bekler.

LEA'nın yapabilecekleri (basit adreslerin ötesinde):

LEA ayrıca adreslerle temel matematik işlemleri de yapabilir. Örneğin:

lea rsi, [number + 5]   ; rsi = number adresi + 5 bayt

Bu, diziler ve veri yapıları ile çalışmak için yararlıdır.

challenge icon

Görev

message adresini rsi yazmacına yüklemek için bir satır assembly kodu yazın.

Kendin dene

section .data
    msg_prefix db 'message = '
    prefix_len equ $ - msg_prefix

section .text
    global _start

_start:
    ; Öğrencinin lea talimatı önce çalışır
    ; rsi artık mesajın adresini içermelidir
    
    ; Öneki yazdır
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_prefix
    mov rdx, prefix_len
    syscall
    
    %include "solution.asm"
    
    ; Öğrencinin yüklediği adresi kullanarak dizeyi yazdır
    mov rax, 1
    mov rdi, 1
    ; rsi zaten adrese sahip (öğrencinin kodundan)
    mov rdx, 6                    ; "Hello" + yeni satır = 6 bayt
    syscall
    
    ; Çıkış
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Temeller bölümündeki tüm dersler