Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 44 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
44
Dung lượng
183,7 KB
Nội dung
CHƯƠNG SINH MÃ ĐỐI TƯNG Chương Biên dịch trình nguồn phía trước Mã trung gian Bộ tối ưu mã Mã trung gian Chương Bộ sinh mã đối tượng trình dịch Bảng danh biểu Hình 9.1 Vị trí sinh mã đối tượng 9.1 Các vấn đề thiết kế sinh mã Đầu vào sinh mã Chương trình đích Sự lựa chọn thị Giả sử phát biểu ba địa có dạng x := y + z với x, y, z tượng trưng cho vị trí nhớ Chúng ta dịch sang chuỗi mã đối tượng: MOV y, Ro /* cất y vào ghi Ro */ ADD z, Ro /* cộng z vào nội dung Ro, kết chứa Ro */ MOV Ro, x /* cất nội dung Ro vào x */ Tuy nhiên việc sinh mã cho chuỗi phát biểu dẫn đến dư thừa mã Như thí dụ sau: a := b + c; d := a + e Chúng ta chuyển sang mã đối tượng: (1) MOV b, R0 (2) ADD c R0 (3) MOV R0, a (4) MOV a, R0 (5) ADD e, R0 (6) MOV R0, d Chỉ thị thứ tư thừa Chất lượng mã tạo ra, xác định tốc độ mã kích thước tập mã Thí duï: MOV a, R0 ADD # 1, R0 MOV R0, a Cấp phát ghi Sự lựa chọn cho việc đánh giá thứ tự 9.2 Máy đích Chúng ta dùng máy đích máy ghi (register machine) Máy đích có từ gồm bốn byte có n ghi: R0, R1 … Rn-1, có thị hai địa chỉ, với dạng tổng quát: op source, destination Thí dụ số thị: MOV: chuyển trị source đến destination ADD: cộng nội dung source destination SUB: trừ nội dung source cho destination Mode địa Thí dụ: Mode Absolute Register indexed Dạng M R c (R) Địa M R c + contents (R) Giaù 1 indirect register inderect indexed literal *R contents (R) *c (R) contents (c + contents (R)) #C haèng C Giá thị (instruction cost) Giá thị tính công giá kết hợp bảng mode địa nguồn đích Qua thí dụ thấy muốn sinh mã tốt phải hạ giá thị Sinh mã để quản lý ghi hoạt động thời gian thực thi Các mã quản lý phải đáp ứng hai kỹ thuật quản lý nhớ tónh cấp phát nhớ theo chế stack Việc cấp phát giải tỏa vị trí nhớ cho ghi hoạt động phần chuỗi hành vi gọi trở chương trình */ call return halt action /* tượng trưng cho phát biểu khác Thí dụ: /*mã cho c*/ action call p action halt /*maõ cho p*/ action return Bảng mã 0: địa 0: địa 8: arr 4: buf 56 i 60 j 84: n Bảng ghi hoạt động cho c Bảng ghi hoạt động cho p Cấp phát tónh Phát biểu call thực hai mã đối tượng MOV GOTO MOV # here + 20, callee.static - area GOTO callee code – rea Thí dụ 9.1 Mô 9.1 Mã đối tượng cho chương trình c p /* mã cho c */ 100: action 120: MOV 140, 364 132: GOTO 200 140: action2 160: halt … /* cất địa 140 */ /* gọi p */ /* mã cho p */ 200: action3 220: GOTO * 364 300: 304: 364: 368: /* trở địa cất vị trí 364 */ /* 300 - 364 cất ghi hoạt động c */ /* chứa địa */ /* liệu cục c */ /* 364 - 451 chứa ghi hoạt động p*/ /* chứa địa */ /* liệu cục p */ Cấp phát theo chế stack Mã cho chương trình mã khởi động stack, cất địa bắt đầu stack vào sp thị MOV # stackstart, SP Như mã đối tượng cho chương trình bao gồm: MOV # stackstart, SP /* khởi động stack */ đoạn mã cho chương trình HALT /* kết thức thực thi */ ADD # caller.recordsize, SP MOV # here + 16, * SP /* lưu địa */ GOTO callee.code-area Chuỗi trở gồm hai thị: GOTO *0 (SP) /* trở chương trình gọi */ SUB # callee.recordsize, SP Chỉ thị GOTO *0 (SP) Thí dụ 9.2 /* mã cho s */ /* mã cho q */ action1 action4 callq callp action2 action5 halt callq action6 /* maõ cho p */ action3 callq return return Hình 9.3 Mã trung gian chương trình mô 9.1 Mô 9.2 Mã đối tượng cho mã trung gian (H.9.3) /* mã cho s */ 100: MOV # 600, SP /* khởi động stack */ 108: action1 128: ADD # ssize, SP /* chuỗi gọi bắt đầu */ 136: MOV 152, * SP /* cất địa */ 144: GOTO 300 /* gọi q */ 152: SUB # ssize, SP /* giảm trị SP khoảng ssize */ 160: action2 180: HALT /* maõ cho p */ 200: action3 220: GOTO * 0(SP) /* trở chương trình gọi */ /* mã cho q */ /* nhảy có điều kiện 456 */ 300: action4 320: ADD # qsize, SP 328: MOV 344, * SP /* cất địa */ 336: GOTO 200 /* gọi P */ Ứng dụng dag Ở thí dụ 9.5 xây dựng dag, giúp cho việc tự động loại bỏ biểu thức giống Nó xác định biến mà trị chúng sử dụng khối Dag giúp ta xác định phát biểu mà trị chúng sử dụng phạm vi khối Thí dụ 9.6 Chúng ta xây dựng lại khối từ dag (H.9.7e) Dãy, trỏ lệnh gọi chương trình Chúng ta khảo sát khối sau đây: x := a[i] a[j] := y z := a[i] Giải thuật 9.2 a[i] trở thành biểu thức chung Từ dag tạo lại khối tối ưu có dạng: x := a[i] z := x a[j] := y Nhưng khối (9.1) (9.2) tính trị z khác j = I y ≠ a[i] Đối với trỏ xảy vấn đề ta có phát biểu gán * p := w Nếu ta p đến đối tượng nào, phải loại tất nút có dạng Việc gọi chương trình giết tất nút ta chưa biết chương trình bị gọi, nên ta buộc phải giả sử biến bị thay đổi trị hiệu ứng lề 9.6 Tạo mã đối tượng từ dag Sắp xếp lại thứ tự t1 := a + c t2 := c + d t3 := e – t2 t4 := t1 – t3 Ta xếp lại chuỗi mã trung gian cho việc tính toán t1 xảy trước t4 t2 := c + d t1 := a + b t3 := e – t2 t4 := t1 – t3 Mô 9.6 Mã đối tượng cho chuỗi phát biểu (H.9.8) MOV a, R0 ADD b, R0 MOV c, R1 ADD d, R1 MOV R0 , t1 MOV e, R0 SUB R1, R0 MOV t1, R1 SUB R0 , R1 MOV R1 , t4 Mô 9.7 Chuỗi mã sau xếp lại mã trung gian MOV c, R0 ADD d, R0 MOV e, R1 SUB R0 , R1 MOV a, R0 ADD b, R0 SUB R1 , R0 MOV R0 , t4 Heuristics dùng để xếp dag Mô 9.8 Giải thuật xếp nút dag (1) While nút trung gian chưa liệt kê begin (2) Chọn nút chưa liệt kê n; tất nút cha mẹ liệt kê (3) liệt kê n; (4) While m tận bên trái n, có cha mẹ liệt kê nút begin (5) liệt kê m; (6) n := m; end; end Thí dụ 9.7 Giải thuật mô 9.8 để tạo xếp mã trung gian (H.9.9) ∗ + − ∗ + − + a c b d 10 Hình 9.9 Dag cho thí dụ 11 e 12 t8 := d + e t6 := a + b t5 := t6 - c t4 := t5 * t8 t3 := t4 - e t2 := t6 + t4 t1:= t2 * t3 Sắp xếp tối ưu cho Giải thuật có hai phần: phần đầu đánh tên cho nút cây, phần thứ hai giải thuật miêu tả lộ trình Mã đối tượng sinh trình thực lộ trình Giải thuật xác định nhãn nút Mô 9.9 Giải thuật tính tên nút label (n) = max (l1 , l2) neáu l1 ≠ l2 l1 + neáu l1 = l2 (1) if n then (2) if n tận bên trái nút cha then (3) label (n) := (4) else label (n) := else begin /* n nút trung gian */ (5) giả sử n1 , n2 , …, nk nút n, theo thứ tự tên, cho label (n1) > label (n2) ≥ … ≥ label (nk ) (6) label (n) := max (label (ni ) + i – 1) 1