Assembly - Phân đoạn bộ nhớ
Chúng ta đã thảo luận về ba phần của một chương trình lắp ráp. Các phần này cũng đại diện cho các phân đoạn bộ nhớ khác nhau.
Điều thú vị là nếu bạn thay thế từ khóa phần bằng phân đoạn, bạn sẽ nhận được kết quả tương tự. Hãy thử đoạn mã sau -
segment .text ;code segment
global _start ;must be declared for linker
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;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
segment .data ;data segment
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Hello, world!
Phân đoạn bộ nhớ
Mô hình bộ nhớ phân đoạn chia bộ nhớ hệ thống thành các nhóm gồm các phân đoạn độc lập được tham chiếu bởi các con trỏ nằm trong các thanh ghi phân đoạn. Mỗi phân đoạn được sử dụng để chứa một loại dữ liệu cụ thể. Một phân đoạn được sử dụng để chứa mã lệnh, một phân đoạn khác lưu trữ các phần tử dữ liệu và phân đoạn thứ ba giữ ngăn xếp chương trình.
Theo thảo luận ở trên, chúng ta có thể chỉ định các phân đoạn bộ nhớ khác nhau như:
Data segment - Nó được đại diện bởi .data phần và .bss. Phần .data dùng để khai báo vùng nhớ, nơi lưu trữ các phần tử dữ liệu cho chương trình. Phần này không thể được mở rộng sau khi các phần tử dữ liệu được khai báo và nó vẫn giữ nguyên trong suốt chương trình.
Phần .bss cũng là phần bộ nhớ tĩnh chứa các bộ đệm để dữ liệu được khai báo sau này trong chương trình. Bộ nhớ đệm này không được lấp đầy.
Code segment - Nó được đại diện bởi .textphần. Điều này xác định một khu vực trong bộ nhớ lưu các mã lệnh. Đây cũng là một khu vực cố định.
Stack - Đoạn này chứa các giá trị dữ liệu được truyền cho các hàm và thủ tục trong chương trình.