Chính xác con trỏ cơ sở và con trỏ ngăn xếp là gì? Họ chỉ ra điều gì?


225

Sử dụng ví dụ này đến từ wikipedia, trong đó DrawSapes () gọi DrawLine (),

văn bản thay thế

(Lưu ý rằng sơ đồ này có địa chỉ cao ở dưới cùng và địa chỉ thấp ở trên cùng.)

Bất cứ ai có thể giải thích cho tôi những gì ebpesptrong bối cảnh này?

Từ những gì tôi thấy, tôi muốn nói con trỏ ngăn xếp luôn luôn ở đầu ngăn xếp và con trỏ cơ sở đến đầu hàm hiện tại? Hay cái gì?


chỉnh sửa: Tôi có nghĩa là trong bối cảnh của các chương trình windows

edit2: Và nó cũng eiphoạt động như thế nào ?

edit3: Tôi có đoạn mã sau từ MSVC ++:

var_C= dword ptr -0Ch
var_8= dword ptr -8
var_4= dword ptr -4
hInstance= dword ptr  8
hPrevInstance= dword ptr  0Ch
lpCmdLine= dword ptr  10h
nShowCmd= dword ptr  14h

Tất cả chúng dường như là mật khẩu, do đó lấy 4 byte mỗi cái. Vì vậy, tôi có thể thấy có một khoảng cách từ hInstance đến var_4 là 4 byte. Họ là ai? Tôi cho rằng đó là địa chỉ trả lại, như có thể thấy trong ảnh của wikipedia?


(lưu ý của biên tập viên: đã xóa một trích dẫn dài khỏi câu trả lời của Michael, không thuộc câu hỏi, nhưng câu hỏi tiếp theo đã được chỉnh sửa trong):

Điều này là do luồng của lệnh gọi hàm là:

* Push parameters (hInstance, etc.)
* Call function, which pushes return address
* Push ebp
* Allocate space for locals

Câu hỏi của tôi (cuối cùng, tôi hy vọng!) Bây giờ là, chính xác những gì xảy ra từ lúc tôi bật các đối số của hàm tôi muốn gọi đến cuối prolog? Tôi muốn biết ebp, đặc biệt phát triển như thế nào trong những khoảnh khắc đó (tôi đã hiểu cách prolog hoạt động, tôi chỉ muốn biết những gì đang xảy ra sau khi tôi đẩy các đối số trên stack và trước prolog).


23
Một điều quan trọng cần lưu ý là ngăn xếp phát triển "xuống dưới" trong bộ nhớ. Điều này có nghĩa là để di chuyển con trỏ ngăn xếp lên trên, bạn giảm giá trị của nó.
BS

4
Một gợi ý để phân biệt EBP / ESP và EIP đang làm gì: EBP & ESP xử lý dữ liệu, trong khi EIP xử lý mã.
mmmmmmmm

2
Trong biểu đồ của bạn, ebp (thường) là "con trỏ khung", đặc biệt là "con trỏ ngăn xếp". Điều này cho phép truy cập cục bộ thông qua [ebp-x] và các tham số ngăn xếp thông qua [ebp + x] một cách nhất quán, độc lập với con trỏ ngăn xếp (thường thay đổi trong một hàm). Việc điền địa chỉ có thể được thực hiện thông qua ESP, giải phóng EBP cho các hoạt động khác - nhưng theo cách đó, trình gỡ lỗi không thể nói với ngăn xếp cuộc gọi hoặc giá trị của người dân địa phương.
peterchen

4
@Ben. Không nesacerily. Một số trình biên dịch đặt các khung stack vào heap. Khái niệm stack stack down chỉ là một khái niệm giúp bạn dễ hiểu. Việc thực hiện ngăn xếp có thể là bất cứ điều gì (sử dụng các khối ngẫu nhiên của heap làm cho việc hack ghi đè lên các phần của ngăn xếp khó hơn rất nhiều vì chúng không mang tính quyết định).
Martin York

1
trong hai từ: con trỏ ngăn xếp cho phép các hoạt động đẩy / pop hoạt động (vì vậy, đẩy và pop biết nơi để đặt / nhận dữ liệu). con trỏ cơ sở cho phép mã độc lập tham chiếu dữ liệu đã được đẩy trước đó trên ngăn xếp.
tigrou

Câu trả lời:


228

esp như bạn nói, đó là đỉnh của ngăn xếp.

ebpthường được đặt thành esplúc bắt đầu chức năng. Các tham số hàm và biến cục bộ được truy cập bằng cách cộng và trừ tương ứng, một giá trị bù không đổi từ ebp. Tất cả các quy ước gọi x86 được định nghĩa ebplà được bảo toàn trên các lệnh gọi hàm. ebpchính nó thực sự trỏ đến con trỏ cơ sở của khung trước đó, cho phép ngăn xếp đi bộ trong trình gỡ lỗi và xem các biến cục bộ của khung khác hoạt động.

Hầu hết các prolog chức năng trông giống như:

push ebp      ; Preserve current frame pointer
mov ebp, esp  ; Create new frame pointer pointing to current stack top
sub esp, 20   ; allocate 20 bytes worth of locals on stack.

Sau đó, trong hàm bạn có thể có mã như (giả sử cả hai biến cục bộ là 4 byte)

mov [ebp-4], eax    ; Store eax in first local
mov ebx, [ebp - 8]  ; Load ebx from second local

FPO hoặc tối ưu hóa bỏ qua con trỏ khung mà bạn có thể kích hoạt sẽ thực sự loại bỏ điều này và sử dụng ebpnhư một thanh ghi khác và truy cập trực tiếp vào địa phương esp, nhưng điều này làm cho việc gỡ lỗi khó khăn hơn một chút vì trình gỡ lỗi không còn có thể truy cập trực tiếp vào các khung ngăn xếp của các lệnh gọi hàm trước đó.

BIÊN TẬP:

Đối với câu hỏi cập nhật của bạn, hai mục còn thiếu trong ngăn xếp là:

var_C = dword ptr -0Ch
var_8 = dword ptr -8
var_4 = dword ptr -4
*savedFramePointer = dword ptr 0*
*return address = dword ptr 4*
hInstance = dword ptr  8h
PrevInstance = dword ptr  0C
hlpCmdLine = dword ptr  10h
nShowCmd = dword ptr  14h

Điều này là do luồng của lệnh gọi hàm là:

  • Thông số đẩy ( hInstance, v.v.)
  • Chức năng gọi, đẩy địa chỉ trả lại
  • Đẩy ebp
  • Phân bổ không gian cho người dân địa phương

1
Cảm ơn đã giải thích! Nhưng bây giờ tôi hơi bối rối. Giả sử tôi gọi một hàm và tôi đang ở dòng đầu tiên của prolog, vẫn không thực hiện một dòng nào từ nó. Tại thời điểm đó, giá trị của ebp là gì? Liệu ngăn xếp có bất cứ điều gì tại thời điểm đó ngoài các đối số đẩy? Cảm ơn!
nuốt chửng elysium

3
EBP không thay đổi một cách kỳ diệu, vì vậy cho đến khi bạn thiết lập EBP mới cho chức năng của mình, bạn vẫn sẽ có giá trị người gọi. Và bên cạnh các đối số, ngăn xếp cũng sẽ giữ EIP cũ (địa chỉ trả về)
MSalters

3
Câu trả lời tốt đẹp. Mặc dù nó không thể hoàn thành mà không đề cập đến những gì trong tập phim: hướng dẫn "rời khỏi" và "nghỉ hưu".
Calmarius

2
Tôi nghĩ rằng hình ảnh này sẽ giúp làm rõ một số điều về dòng chảy là gì. Cũng lưu ý rằng ngăn xếp phát triển xuống. ocw.cs.pub.ro/cifts/_media/so/laboratoare/call_stack.png
Andrei-Niculae Petre

Có phải tôi, hoặc tất cả các dấu trừ bị thiếu trong đoạn mã ở trên không?
BarbaraKwarc

96

ESP là con trỏ ngăn xếp hiện tại, nó sẽ thay đổi bất cứ khi nào một từ hoặc địa chỉ được đẩy hoặc bật lên / tắt khỏi ngăn xếp. EBP là một cách thuận tiện hơn cho trình biên dịch để theo dõi các tham số và biến cục bộ của hàm so với sử dụng trực tiếp ESP.

Nói chung (và điều này có thể thay đổi từ trình biên dịch sang trình biên dịch), tất cả các đối số cho hàm được gọi đều được đẩy lên ngăn xếp bởi hàm gọi (thường theo thứ tự ngược lại mà chúng được khai báo trong nguyên mẫu hàm, nhưng điều này thay đổi) . Sau đó, hàm được gọi, sẽ đẩy địa chỉ trả về (EIP) lên ngăn xếp.

Khi vào chức năng, giá trị EBP cũ được đẩy lên ngăn xếp và EBP được đặt thành giá trị của ESP. Sau đó, ESP bị giảm (vì ngăn xếp phát triển xuống trong bộ nhớ) để phân bổ không gian cho các biến cục bộ và tạm thời của hàm. Từ thời điểm đó, trong quá trình thực thi hàm, các đối số của hàm được đặt trên ngăn xếp tại các độ lệch dương từ EBP (vì chúng được đẩy trước lệnh gọi hàm) và các biến cục bộ được đặt ở vị trí lệch âm từ EBP (bởi vì chúng được phân bổ trên ngăn xếp sau khi nhập hàm). Đó là lý do tại sao EBP được gọi là con trỏ khung , vì nó trỏ đến trung tâm của khung gọi hàm .

Khi thoát ra, tất cả các chức năng phải làm là đặt ESP thành giá trị EBP (loại bỏ các biến cục bộ từ ngăn xếp và hiển thị EBP mục nhập trên đỉnh của ngăn xếp), sau đó bật giá trị EBP cũ từ ngăn xếp, và sau đó hàm trả về (đưa địa chỉ trả về vào EIP).

Khi quay trở lại chức năng gọi, nó có thể tăng ESP để loại bỏ các đối số chức năng mà nó đã đẩy lên ngăn xếp ngay trước khi gọi hàm khác. Tại thời điểm này, ngăn xếp trở lại trạng thái như trước khi gọi hàm được gọi.


15

Bạn có nó đúng. Con trỏ ngăn xếp trỏ đến mục trên cùng của ngăn xếp và con trỏ cơ sở trỏ đến đỉnh "trước" của ngăn xếp trước khi hàm được gọi.

Khi bạn gọi một hàm, bất kỳ biến cục bộ nào sẽ được lưu trữ trên ngăn xếp và con trỏ ngăn xếp sẽ được tăng lên. Khi bạn trở về từ hàm, tất cả các biến cục bộ trên ngăn xếp sẽ ra khỏi phạm vi. Bạn làm điều này bằng cách đặt con trỏ ngăn xếp trở lại con trỏ cơ sở (là đỉnh "trước" trước khi gọi hàm).

Làm phân bổ bộ nhớ theo cách này là rất , rất nhanh và hiệu quả.


14
@Robert: Khi bạn nói đỉnh "trước" của ngăn xếp trước khi hàm được gọi, bạn sẽ bỏ qua cả hai tham số, được đẩy lên ngăn xếp ngay trước khi gọi hàm và EIP của người gọi. Điều này có thể gây nhầm lẫn cho độc giả. Chúng ta chỉ cần nói rằng trong một khung ngăn xếp tiêu chuẩn, EBP trỏ đến cùng một nơi mà ESP chỉ ngay sau khi vào hàm.
tóc giả

7

EDIT: Để biết mô tả rõ hơn, hãy xem x86 Tháo gỡ / Chức năng và Ngăn xếp khung trong WikiBook về lắp ráp x86. Tôi cố gắng thêm một số thông tin mà bạn có thể quan tâm khi sử dụng Visual Studio.

Lưu EBP của người gọi làm biến cục bộ đầu tiên được gọi là khung ngăn xếp tiêu chuẩn và điều này có thể được sử dụng cho gần như tất cả các quy ước gọi trên Windows. Sự khác biệt tồn tại cho dù người gọi hoặc callee sắp xếp các tham số đã truyền và tham số nào được truyền trong các thanh ghi, nhưng chúng là trực giao cho vấn đề khung ngăn xếp tiêu chuẩn.

Nói về các chương trình Windows, có lẽ bạn có thể sử dụng Visual Studio để biên dịch mã C ++ của mình. Xin lưu ý rằng Microsoft sử dụng một tối ưu hóa có tên là Bỏ qua con trỏ khung, điều này khiến cho việc đi bộ ngăn xếp mà không sử dụng thư viện dbghlp và tệp PDB để thực thi gần như là không thể.

Bỏ qua con trỏ khung này có nghĩa là trình biên dịch không lưu trữ EBP cũ trên một vị trí tiêu chuẩn và sử dụng thanh ghi EBP cho một thứ khác, do đó bạn khó tìm được EIP của người gọi mà không biết các biến cục bộ cần bao nhiêu dung lượng cho một hàm nhất định. Tất nhiên, Microsoft cung cấp API cho phép bạn thực hiện stack-walk ngay cả trong trường hợp này, nhưng việc tìm kiếm cơ sở dữ liệu bảng biểu tượng trong các tệp PDB mất quá nhiều thời gian cho một số trường hợp sử dụng.

Để tránh FPO trong các đơn vị biên dịch của bạn, bạn cần tránh sử dụng / O2 hoặc cần thêm / Oy- vào các cờ biên dịch C ++ trong các dự án của bạn. Bạn có thể liên kết với thời gian chạy C hoặc C ++, sử dụng FPO trong cấu hình Phát hành, do đó bạn sẽ gặp khó khăn khi thực hiện stack walk mà không có dbghlp.dll.


Tôi không hiểu làm thế nào EIP được lưu trữ trên ngăn xếp. Không nên đăng ký? Làm thế nào một đăng ký có thể được trên ngăn xếp? Cảm ơn!
nuốt chửng elysium

EIP của người gọi được đẩy lên ngăn xếp bằng chính lệnh CALL. Lệnh RET chỉ cần tìm nạp phần trên cùng của ngăn xếp và đặt nó vào EIP. Nếu bạn có lỗi tràn bộ đệm, thực tế này có thể được sử dụng để nhảy vào mã người dùng từ một luồng đặc quyền.
tóc giả

@devouredelysium Nội dung (hoặc giá trị ) của thanh ghi EIP được đưa vào (hoặc sao chép vào) ngăn xếp, chứ không phải chính thanh ghi.
BarbaraKwarc

@BarbaraKwarc Cảm ơn bạn đã nhập giá trị . Tôi không thể thấy OP thiếu gì từ câu trả lời của tôi. Thật vậy, các thanh ghi vẫn giữ nguyên vị trí của chúng, chỉ có giá trị của chúng được gửi đến RAM từ CPU. Trong chế độ amd64, điều này phức tạp hơn một chút, nhưng để lại câu hỏi khác.
tóc giả

Thế còn amd64 thì sao? Tôi tò mò.
BarbaraKwarc

6

Trước hết, con trỏ ngăn xếp chỉ xuống dưới cùng của ngăn xếp vì các ngăn xếp x86 xây dựng từ các giá trị địa chỉ cao đến các giá trị địa chỉ thấp hơn. Con trỏ ngăn xếp là điểm mà cuộc gọi tiếp theo sẽ đẩy (hoặc gọi) sẽ đặt giá trị tiếp theo. Hoạt động của nó tương đương với câu lệnh C / C ++:

 // push eax
 --*esp = eax
 // pop eax
 eax = *esp++;

 // a function call, in this case, the caller must clean up the function parameters
 move eax,some value
 push eax
 call some address  // this pushes the next value of the instruction pointer onto the
                    // stack and changes the instruction pointer to "some address"
 add esp,4 // remove eax from the stack

 // a function
 push ebp // save the old stack frame
 move ebp, esp
 ... // do stuff
 pop ebp  // restore the old stack frame
 ret

Con trỏ cơ sở là đỉnh của khung hiện tại. ebp thường chỉ đến địa chỉ trả lại của bạn. ebp + 4 điểm đến tham số đầu tiên của hàm của bạn (hoặc giá trị này của phương thức lớp). ebp-4 trỏ đến biến cục bộ đầu tiên của hàm của bạn, thường là giá trị cũ của ebp để bạn có thể khôi phục con trỏ khung trước đó.


2
Không, ESP không chỉ xuống dưới cùng của ngăn xếp. Đề án địa chỉ bộ nhớ không có gì để làm với nó. Không quan trọng việc ngăn xếp phát triển đến địa chỉ thấp hơn hay cao hơn. "Đỉnh" của ngăn xếp luôn là nơi giá trị tiếp theo sẽ được đẩy (đặt trên đỉnh của ngăn xếp), hoặc, trên các kiến ​​trúc khác, nơi đặt giá trị đẩy cuối cùng và nơi nó hiện đang nằm. Do đó, ESP luôn chỉ lên đỉnh của ngăn xếp.
BarbaraKwarc

1
Mặt khác, đáy hoặc cơ sở của ngăn xếp, là nơi đặt giá trị đầu tiên (hoặc cũ nhất ), và sau đó được bao phủ bởi các giá trị gần đây hơn. Đó là nơi tên "con trỏ cơ sở" cho EBP xuất phát: nó được cho là trỏ đến cơ sở (hoặc dưới cùng) của ngăn xếp cục bộ hiện tại của chương trình con.
BarbaraKwarc

Barbara, trong Intel x86, ngăn xếp là UPSIDE DOWN. Phần trên cùng của ngăn xếp chứa mục đầu tiên được đẩy lên ngăn xếp và mỗi mục sau đó được đẩy DƯỚI mục trên cùng. Phần dưới cùng của ngăn xếp là nơi các vật phẩm mới được đặt. Các chương trình được đặt trong bộ nhớ bắt đầu từ 1k và lớn lên đến vô tận. Ngăn xếp bắt đầu ở vô cực, mem thực tế tối đa trừ ROM và tăng dần về 0. ESP chỉ đến một địa chỉ có giá trị nhỏ hơn địa chỉ đầu tiên được đẩy.
jmucchiello

1

Lâu rồi kể từ khi tôi thực hiện lập trình hội, nhưng liên kết này có thể hữu ích ...

Bộ xử lý có một bộ các thanh ghi được sử dụng để lưu trữ dữ liệu. Một số trong số này là các giá trị trực tiếp trong khi một số khác chỉ vào một khu vực trong RAM. Các thanh ghi có xu hướng được sử dụng cho các hành động cụ thể nhất định và mỗi toán hạng trong lắp ráp sẽ yêu cầu một lượng dữ liệu nhất định trong các thanh ghi cụ thể.

Con trỏ ngăn xếp chủ yếu được sử dụng khi bạn gọi các thủ tục khác. Với các trình biên dịch hiện đại, một loạt dữ liệu sẽ được đổ trước tiên trên ngăn xếp, theo sau là địa chỉ trả về để hệ thống sẽ biết nơi quay trở lại sau khi được yêu cầu trả về. Con trỏ ngăn xếp sẽ trỏ đến vị trí tiếp theo nơi dữ liệu mới có thể được đẩy vào ngăn xếp, nơi nó sẽ ở lại cho đến khi nó bật trở lại.

Các thanh ghi cơ sở hoặc các thanh ghi phân đoạn chỉ trỏ đến không gian địa chỉ của một lượng lớn dữ liệu. Kết hợp với bộ hồi quy thứ hai, con trỏ Cơ sở sẽ chia bộ nhớ thành các khối lớn trong khi thanh ghi thứ hai sẽ trỏ vào một mục trong khối này. Con trỏ cơ sở cho điểm đến cơ sở của các khối dữ liệu.

Hãy nhớ rằng hội là rất cụ thể CPU. Trang tôi đã liên kết để cung cấp thông tin về các loại CPU khác nhau.


Các thanh ghi phân đoạn được tách biệt trên x86 - chúng là gs, cs, ss và trừ khi bạn đang viết phần mềm quản lý bộ nhớ, bạn không bao giờ chạm vào chúng.
Michael

DS cũng là một thanh ghi phân đoạn và trong thời của mã MS-DOS và mã 16 bit, đôi khi bạn chắc chắn cần phải thay đổi các thanh ghi phân đoạn này, vì chúng không bao giờ có thể trỏ đến hơn 64 KB RAM. Tuy nhiên, DOS có thể truy cập bộ nhớ lên tới 1 MB vì ​​nó đã sử dụng các con trỏ địa chỉ 20 bit. Sau này chúng tôi có hệ thống 32 bit, một số có thanh ghi địa chỉ 36 bit và bây giờ là thanh ghi 64 bit. Vì vậy, ngày nay bạn sẽ không thực sự cần phải thay đổi các thanh ghi phân khúc này nữa.
Wim ten Brink

Không có hệ điều hành hiện đại nào sử dụng 386 phân đoạn
Ana Betts

@Paul: SAU! SAI LẦM! SAI LẦM! Các phân đoạn 16 bit được thay thế bằng các phân đoạn 32 bit. Trong chế độ được bảo vệ, điều này cho phép ảo hóa bộ nhớ, về cơ bản cho phép bộ xử lý ánh xạ các địa chỉ vật lý thành các địa chỉ logic. Tuy nhiên, trong ứng dụng của bạn, mọi thứ dường như vẫn không thay đổi, vì HĐH đã ảo hóa bộ nhớ cho bạn. Nhân hoạt động ở chế độ được bảo vệ, cho phép các ứng dụng chạy trong mô hình bộ nhớ phẳng. Xem thêm en.wikipedia.org/wiki/Protected_mode
Wim ten Brink

@Workshop ALex: Đó là một kỹ thuật. Tất cả các hệ điều hành hiện đại đặt tất cả các phân đoạn thành [0, FFFFFFFF]. Điều đó không thực sự được tính. Và nếu bạn sẽ đọc trang được liên kết, bạn sẽ thấy rằng tất cả nội dung ưa thích được thực hiện với các trang, đó là các phân đoạn chi tiết hơn nhiều.
MSalters

-4

Chỉnh sửa Yeah, điều này chủ yếu là sai. Nó mô tả một cái gì đó hoàn toàn khác nhau trong trường hợp bất cứ ai quan tâm :)

Có, con trỏ ngăn xếp chỉ vào đỉnh của ngăn xếp (cho dù đó là vị trí ngăn xếp trống đầu tiên hoặc vị trí đầy đủ cuối cùng mà tôi không chắc chắn). Con trỏ cơ sở trỏ đến vị trí bộ nhớ của lệnh đang được thực thi. Đây là mức độ của opcodes - hướng dẫn cơ bản nhất bạn có thể nhận được trên máy tính. Mỗi opcode và các tham số của nó được lưu trữ trong một vị trí bộ nhớ. Một dòng C hoặc C ++ hoặc C # có thể được dịch thành một opcode hoặc một chuỗi gồm hai hoặc nhiều tùy thuộc vào mức độ phức tạp của nó. Chúng được ghi vào bộ nhớ chương trình một cách tuần tự và được thực thi. Trong trường hợp bình thường, con trỏ cơ sở được tăng một lệnh. Đối với điều khiển chương trình (GOTO, IF, v.v.), nó có thể được tăng lên nhiều lần hoặc chỉ được thay thế bằng địa chỉ bộ nhớ tiếp theo.

Trong ngữ cảnh này, các chức năng được lưu trữ trong bộ nhớ chương trình tại một địa chỉ nhất định. Khi hàm được gọi, một số thông tin nhất định được đẩy lên ngăn xếp cho phép chương trình tìm thấy nó đã quay trở lại nơi hàm được gọi cũng như các tham số cho hàm, sau đó địa chỉ của hàm trong bộ nhớ chương trình được đẩy vào con trỏ cơ sở. Trong chu kỳ đồng hồ tiếp theo, máy tính bắt đầu thực hiện các hướng dẫn từ địa chỉ bộ nhớ đó. Sau đó, tại một thời điểm nào đó, nó sẽ TRẢ LẠI đến vị trí bộ nhớ SAU lệnh được gọi là hàm và tiếp tục từ đó.


Tôi có một chút rắc rối để hiểu ebp là gì. Nếu chúng ta có 10 dòng mã MASM, điều đó có nghĩa là khi chúng ta chạy các dòng đó, ebp sẽ luôn tăng?
nuốt chửng elysium

1
@Devoured - Không. Điều đó không đúng. eip sẽ ngày càng tăng.
Michael

Bạn có nghĩa là những gì tôi nói là đúng nhưng không phải cho EBP, nhưng đối với IEP, có phải vậy không?
nuốt chửng elysium

2
Đúng. EIP là con trỏ lệnh và được sửa đổi ngầm sau mỗi lệnh được thực thi.
Michael

2
Ôi trời ơi. Tôi đang nghĩ về một con trỏ khác. Tôi nghĩ tôi sẽ đi rửa não.
Stephen Friederichs

-8

đặc biệt là "Con trỏ ngăn xếp mở rộng" ..... ebp cho "Con trỏ cơ sở gì đó" .... và eip cho "Con trỏ lệnh gì đó" ...... Con trỏ ngăn xếp trỏ đến địa chỉ bù của phân đoạn ngăn xếp . Con trỏ cơ sở trỏ đến địa chỉ bù của phân đoạn phụ. Con trỏ lệnh chỉ tới địa chỉ offset của đoạn mã. Bây giờ, về các phân đoạn ... chúng là các phân chia 64KB nhỏ của vùng bộ nhớ của bộ xử lý ..... Quá trình này được gọi là Phân đoạn bộ nhớ. Tôi hy vọng bài viết này là hữu ích.


3
Đây là một câu hỏi cũ, tuy nhiên, sp là viết tắt của con trỏ ngăn xếp, bp là viết tắt của con trỏ cơ sở và ip cho con trỏ lệnh. Đầu tiên mọi người chỉ nói đó là con trỏ 32 bit.
Hyden

1
Phân khúc là không liên quan ở đây.
BarbaraKwarc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.