Melbourne đa
Bước 1 để viết một chương trình C trực quan bắt đầu bằng việc viết một C đơn giản
Bước 1: viết một chương trình C trực quan trước tiên, chúng tôi viết một chương trình C đơn giản để nhân hai số nguyên và nhập kết quả. Mã ngôn ngữ C (simple_add. C) : mã kích hoạt C #include int main() cá hồi 0; } chương trình chỉ ra rằng chương trình này định nghĩa hai số nguyên a và b, mỗi số là 5 và 3. Sau đó chương trình nhân hai số nguyên với nhau và lưu trữ kết quả trong sum. Dựa trên giá trị của sum, chương trình có thể xuất ra cùng một tin nhắn. Nếu sum > 7, kết quả sẽ lớn hơn 7. Nếu không, in "kết quả là ít hơn hoặc tương đương với 7". Bước 2: chuyển đổi chương trình C thành lập trình mã GCC lập trình chương trình C thành lập mã (thay vì dễ dàng phân chia thành tập tin có thể thực hiện), và chọn cách sử dụng kiến trúc 32 chữ số (-m32). Lập trình tạo tập tin lắp ráp: mã SAO chép của bash gcc-m32-s simple_add. c-o simple_add. lệnh này phiên dịch mã ngôn ngữ c thành mã lắp ráp để tạo ra một tập tin tên simple_add.s. Tập tin này sẽ bao gồm các chỉ lệnh lắp ráp ia-32 tương ứng. Đóng tập tin simple_add.s và xem xét nội dung của nó: Asm SAO chép mã. "tập tin" "simple_add.c". Intel_syntax noprefix. 8mov DWORD PTR [ebp-4], 5 ; a = 5mov DWORD PTR [ebp-8], 3 ; b = 3mov eax, DWORD PTR [ebp-4] ; eax = aadd eax, DWORD PTR [ebp-8] ; eax = eax + bmov DWORD PTR [ebp-12], eax ; sum = eaxmov eax, DWORD PTR [ebp-12] ; eax = sumcmp eax, 7 ; compare sum with 7jg .L2 ; if sum > 7, jump to L2mov eax, 0 ; return 0jmp .L3.L2:mov eax, 1 ; Return 1 phần mệnh đề sum] nếu (7) … L3: leaveret bước 3: sự phát sinh phân tích những mã là pandectae của chúng ta từng được tạo ra những phân tích một đoạn mã là pandectae. Asm SAO chép mã push ebpmov ebp, esp hai chỉ lệnh này là mã nhập vào chức năng chuẩn, lưu giữ thông tin trong ngăn gọi để phục hồi chức năng thường xuyên khi gọi. Asm SAO chép đoạn mã sub esp, 8 cho từng phần không gian phân phối các 'biến số', trong 4 ebp -- và 8 ebp --, lưu trữ a và b. Asm SAO chép đoạn mã mov DWORD PTR [ebp --] 4, 5; a = 5mov DWORD PTR [ebp-8], 3 ; B = 3 lưu trữ 5 và 3 vào một bên a và b trong bộ nhớ. Asm copy code mov eax, DWORD PTR [ebp-4]; eax = aadd eax, DWORD PTR [ebp-8] ; Eax = eax + b sẽ có giá trị của a đọc đến eax JiCunQi, trong và sau đó sẽ còn có thể thêm giá trị của b trong eax, cuối cùng của eax lưu trữ là a + b. Asm SAO chép mã mov DWORD PTR [ebp-12], eax; Sum = eax để lưu trữ eax (kết quả của a + b) vào một biến số sum trong bộ nhớ. Asm copy code mov eax, DWORD PTR [ebp-12]; eax = sumcmp eax, 7 ; compare sum with 7jg .L2 ; Nếu sum > 7, jump to L2 nạp giá trị của sum vào eax và so sánh với 7. Nếu sum > 7, chương trình sẽ chuyển hướng sang thẻ. Asm SAO chép mã mov eax, 0; Return 0jmp, L3 nếu sum 7) nếu sum > 7, trở lại với số 1. Asm SAO chép mã. L3: lệnh leaveretleave phục hồi các byte, ret trả lại các chức năng gọi, kết thúc chương trình. Bước 4: dùng tập tin thi hành được tạo ra bởi objdump và bạn có thể biên dịch chương trình thành tập tin thi hành và dùng objdump để xem mã máy và các chỉ lệnh biên tập cho nóChương trình lập trình C bị chia thành tập tin có thể thi hành: bash kích hoạt mã gcc-m32 simple_add. c-o simple_add có tập tin có thể thi hành với objdump. Bash SAO chép mã objdump -d simple_add và bạn sẽ thấy một đầu vào tương tự ở trên, chỉ ra lệnh mã hóa và mã máy tương ứng. Asm SAO chép mã 08048060:8048060:55 - % ebp8048061:89 e5 mov %esp,% ebp8048063:83 ec 08 sub $0x8,%esp8048066: c7 45 fc 05 00 00 00 movl $0x5,-0x4(%ebp)804806d: c7 45 f8 03 00 00 00 movl $0x3,-0x8(%ebp)8048074: 8b 45 fc mov -0x4(%ebp),%eax8048077: 03 45 f8 add -0x8(%ebp),%eax804807a: 89 45 f4 mov %eax,-0xc(%ebp)804807d: 8b 45 f4 mov 0xc(%ebp),%eax8048080: 3d 07 00 00 00 CMP $0x7,%eax8048085: 7f 1b jg 804809a bước 5: chạy chương trình chạy tập tin có thể thi hành để kiểm tra đầu ra của chương trình: Mã SAO chép bash./simple_add nếu sum > 7, kết quả là "Result is greater than 7". Nếu sum <= 7, kết quả "kết quả là ít hơn hoặc tương đương với 7". Tóm lại là anh đã tự học cách chuyển chương trình C sang mã hợp tác ia-32 bằng cách viết một chương trình C trực quan. Anh đã giới thiệu các chỉ lệnh lắp ráp thông thường như mov, add, CMP, và chỉ lệnh điều chỉnh điều kiện bằng cách phân tích mã lắp ráp được tạo ra. Với công cụ objdump, bạn có thể tiến xa hơn trong việc biên tập các tập tin thi hành, truy cập vào các mối quan hệ tương ứng giữa mã máy và các lệnh biên tập