Tôi đã viết một chương trình lắp ráp đơn giản:Tại sao giá trị của EDX bị ghi đè khi thực hiện cuộc gọi đến printf?
section .data
str_out db "%d ",10,0
section .text
extern printf
extern exit
global main
main:
MOV EDX, ESP
MOV EAX, EDX
PUSH EAX
PUSH str_out
CALL printf
SUB ESP, 8 ; cleanup stack
MOV EAX, EDX
PUSH EAX
PUSH str_out
CALL printf
SUB ESP, 8 ; cleanup stack
CALL exit
Tôi là lắp ráp NASM và GCC để liên kết các tập tin đối tượng đến một thực thi trên Linux.
Về cơ bản, chương trình này trước tiên đặt giá trị của con trỏ ngăn xếp vào thanh ghi EDX, sau đó in nội dung của thanh ghi này hai lần. Tuy nhiên, sau cuộc gọi printf thứ hai, giá trị được in ra cho giá trị xuất chuẩn không khớp với giá trị đầu tiên.
Hành vi này có vẻ lạ. Khi tôi thay thế mọi cách sử dụng EDX trong chương trình này bằng EBX, các số nguyên được xuất ra giống hệt như mong đợi. Tôi chỉ có thể phỏng đoán rằng EDX được ghi đè tại một số điểm trong suốt cuộc gọi hàm printf.
Tại sao lại xảy ra trường hợp này? Và làm thế nào tôi có thể đảm bảo rằng các thanh ghi tôi sử dụng trong tương lai không xung đột với các chức năng lib của C?
Điều đó đã giúp tôi lần đầu tiên nhiều năm trước. Câu trả lời bạn chấp nhận là chính xác nhưng bỏ qua 'ebp' và' esp' làm callee lưu. Hai người đó dường như không nói gì, nhưng bạn có thể lộn xộn về mặt kỹ thuật. Chào mừng bạn đến với hội đồng! – sqykly
@sqykly Cảm ơn bạn. Nó chắc chắn là ít hơn rất nhiều tha thứ hơn so với các ngôn ngữ cấp cao hơn mà tôi đang sử dụng để. Nhưng tôi sẽ không bị đánh bại bởi nó! :) – Jake
Trả lời như nhiều câu hỏi javascript như tôi làm và bạn sẽ bắt đầu tự hỏi về điều đó. – sqykly