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:
| Komut | Ne 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ınlea= 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 baytBu, diziler ve veri yapıları ile çalışmak için yararlıdır.
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
syscallBu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.