Đã mã được xóa BSS phần byte theo byte movw $_end, %cx
sẽ có đủ điều kiện. Tuy nhiên, mã này không bằng số BSS với STOSB chúng sử dụng STOSL. Nói chung hiệu quả hơn để lưu trữ 32 bit tại một thời điểm thay vì 8 bit.
STOSL sẽ lưu trữ EAX (được thiết lập để không với xorl %eax, %eax
) đủ thời gian để xóa toàn bộ phạm vi của BSS 0. 3 đảm bảo rằng nếu chiều dài của BSS phần ($ _end - $ __ bss_start) không chia hết cho 4, tính toán số lượng DWORD cần xóa sẽ được làm tròn lên. Nếu việc làm tròn này không xảy ra thì trong trường hợp kích thước không chia hết cho 4, các byte cuối cùng có thể không bị xóa.
Việc tính toán được thực hiện ở đây giả định __bss_start
là một con trỏ đến đầu của phân khúc BSS và _end
là một con trỏ đến cuối BSS. Phương trình để tính toán số lượng 32-bit DWORD s để xóa là một cách hiệu quả:
NUMDWORDS=(_end+3-__bss_start) >> 2
các shrw $2, %cx
(>>2
trong tính toán) là phân chia số nguyên 4 hiển thị kết quả luôn được làm tròn xuống. Chúng tôi thêm +3 vào số byte để khi chia cho 4 được thực hiện, nó có hiệu quả làm tròn lên số gần nhất là DWORD s. Giá trị này sau đó được sử dụng làm số lượng DWORD s STOSL sẽ được đặt thành 0.
Nguồn
2016-04-26 04:41:01