Int b=1; main(){int x = 2; printf("%d %d", x, b);}. In this program, what ASM opcode places x where printf can find it?

5 phương ánCó giải thích

Các phương án trả lời

Chọn một phương án
Lời giảiChọn phương án để mở
Đáp án đúng: "push". Trên x86 32 bit theo quy ước gọi cdecl, đối số được đặt lên ngăn xếp từ phải sang trái trước lệnh gọi: chương trình push giá trị b, rồi nạp x (bằng 2) vào thanh ghi và push nó, tiếp đó push địa chỉ chuỗi định dạng, sau cùng call printf; bên trong printf đọc các đối số từ ngăn xếp ngay trên địa chỉ trả về, còn bên gọi tự cộng lại esp để dọn. Vì vậy push là lệnh đặt x vào chỗ printf tìm thấy; cần biết trình biên dịch hiện đại có thể cấp sẵn khung ngăn xếp rồi dùng mov vào [esp+…] thay cho push, và trên x64 đối số đầu nằm trong thanh ghi, nhưng câu hỏi theo mô hình cổ điển. "jz" là nhảy có điều kiện khi cờ ZF bằng 1. "amp" in sẵn như vậy và không phải lệnh x86 nào. "pop" lấy giá trị khỏi đỉnh ngăn xếp, ngược chiều cần thiết. "call" đẩy địa chỉ trả về rồi chuyển điều khiển tới printf, không đặt x.

Cùng phần 4

Xuất hiện trong 1 bộ đề