cs
là đoạn mã. cs:ip
, có nghĩa là cs
cùng với ip
(con trỏ chỉ dẫn) trỏ đến vị trí của lệnh tiếp theo. Vì vậy, bất kỳ thay đổi nào đối với cs
hoặc ip
hoặc cả hai thay đổi địa chỉ từ nơi lệnh tiếp theo sẽ được tìm nạp và thực thi.
Thông thường, bạn thay đổi cs
với một jmp
(nhảy xa), call
(cuộc gọi dài), retf
, int3
, int
hay iret
. Trong 8088 và 8086 pop cs
cũng có sẵn (opcode 0x0F). pop cs
sẽ không hoạt động ở 186+, trong đó opcode 0x0F được dành riêng cho các hướng dẫn nhiều byte. http://en.wikipedia.org/wiki/X86_instruction_listings
Không có gì nguy hiểm khi nhảy dài hoặc cuộc gọi dài. Bạn chỉ cần biết nơi bạn nhảy hoặc gọi và trong chế độ bảo vệ, bạn cần phải có đủ quyền để làm điều đó. Trong chế độ thực 16 bit (ví dụ: DOS), bạn có thể nhảy và gọi đến địa chỉ nào bạn muốn, ví dụ: jmp 0xF000:0xFFF0
bộ cs
đến 0xF000
và ip
đến 0xFFF0
, là địa chỉ bắt đầu của mã BIOS và do đó khởi động lại máy tính. Các địa chỉ bộ nhớ khác nhau có mã khác nhau và do đó có thể gây ra các loại kết quả khác nhau, trong lý thuyết mọi thứ có thể xảy ra (nếu bạn nhảy vào mã BIOS được sử dụng để định dạng ổ đĩa cứng, với giá trị đăng ký và/hoặc ngăn xếp hợp lệ thì ổ cứng sẽ được định dạng 'như yêu cầu'). Trong thực tế, jmp
's và call
' s để hầu hết các địa chỉ có thể dẫn đến opcode không hợp lệ hoặc một số ngoại lệ khác (chia cho số không, chia tràn, vv) khá sớm.
'CS' = phân đoạn mã. Tôi cho rằng việc thay đổi nó tương đương (theo một nghĩa nào đó) với một 'jmp' sai đường. – valdo
Tài liệu đó có vẻ không đáng tin cậy: "ĐỪNG thay đổi' CS' !!, nhưng bạn có thể đọc 'CS' như sau:' mov ds, cs'; đặt giá trị 'CS' vào' D'S. " Vâng, trong x86 không có lệnh nào như 'mov ds, cs' hay bất kỳ' mov segreg, segreg' khác. Để đọc giá trị của 'cs', bạn có thể sử dụng' mov reg, cs; mov ds, reg' (trong đó 'reg' có thể là' ax', 'bx',' cx' vv ...) hoặc 'đẩy cs; pop ds'. Hơn nữa, nếu bạn quyết định không * thay đổi * thay đổi 'cs', tất cả các cuộc gọi ngắt sẽ hết câu hỏi (ví dụ: các dịch vụ BIOS, DOS và Linux). http://web.itu.edu.tr/kesgin/mul06/intel/instr/mov.html – nrz
@nrz: Không có những thứ như "dịch vụ Linux" có thể truy cập thông qua các cuộc gọi 'far' (ngắt/syscalls hoạt động khác nhau, mặc dù chúng dẫn đến thay đổi trong' cs ', _caller_ không thể kiểm soát mục tiêu đó' cs' sẽ là gì, được quyết định bởi hệ điều hành khi thiết lập các mục IDT/syscall msrs). Ack với mọi thứ khác, rõ ràng 'cs' _can_ được thay đổi, chỉ trừ khi đoạn mã đích tồn tại và được thiết lập theo cách mà mục tiêu' eip' có thể truy cập được, mọi cuộc gọi như vậy sẽ gây ra lỗi '# GP' và ứng dụng sẽ hủy. –