Chương trình con trỏ
Chương STACK & CHƯƠNG TRÌNH CON Giới thiệu STACK Một số ứng dụng STACK Cấu trúc CTC Cơ chế làm việc CTC Vấn đề truyền tham số Chương trình gồm nhiều MODULE Chương 10: CHƯƠNG TRÌNH CON GiỚI THIỆU STACK STACK : cấu trúc liệu chiều Các phần tử cất vào lấy theo phương thức LIFO (Last In First Out) Mỗi chương trình phải dành khối nhớ để làm stack khai báo STACK Ví dụ : STACK 100H ; Xin cấp phát 256 bytes làm stack Là phần nhớ, tổ chức lưu trữ liệu theo chế vào sau trước (LIFO) Chương 10: CHƯƠNG TRÌNH CON LẬP TRÌNH VỚI STACK Trong lập trình có cần truy xuất đến phần tử STACK không thay đổi trật tự STACK Để thực điều ta dùng thêm ghi trỏ BP : trỏ BP đỉnh Stack : MOV BP,SP thay đổi giá trị BP để truy xuất đến phần tử Stack : [BP+2] Chương 10: CHƯƠNG TRÌNH CON Phần tử đưa vào STACK lần gọi đáy STACK, phần tử cuối đưa vào STACK gọi đỉnh STACK Khi thêm phần tử vào STACK ta thêm từ đỉnh, lấy phần tử khỏi STACK ta lấy từ đỉnh địa ô nhớ đỉnh STCAK luôn bị thay đổi SS dùng để lưu địa segemnt đoạn nhớ dùng làm STACK SP để lưu địa ô nhớ đỉnh STACK (trỏ tới đỉnh STACK) Chương 10: CHƯƠNG TRÌNH CON THÍ DỤ STACK A,B,C Word MOV BP,SP D C MOV AX,[BP] ;AX = D B MOV AX,[BP+2] ;AX = C SP A MOV AX,[BP+6] ;AX = A Chương 10: CHƯƠNG TRÌNH CON Để lưu phần tử vào Stack ta dùng lệnh PUSH Để lấy phần tử từ Stack ta dùng lệnh POP PUSH nguồn : đưa nguồn vào đỉnh STACK PUSHF : cất nội dung ghi cờ vào STACK • nguồn ghi 16 bit hay từ nhớ Chương 10: CHƯƠNG TRÌNH CON POP POPF : dùng để lấy phần tử khỏi STACK Cú pháp : POP đích : đưa nguồn vào đỉnh STACK POPF : cất nội dung đỉnh STACK vào ghi cờ Chú ý : - Ở đích ghi 16 bit (trừ ghi IP) hay từ nhớ Các lệnh PUSH, PUSHF, POP POPF không ảnh hưởng tới cờ Chương 10: CHƯƠNG TRÌNH CON MỘT SỐ ỨNG DỤNG CỦA STACK Khắc phục hạn chế lệnh MOV Ex : MOV CS,DS ; sai PUSH DS POP CS ; •Truyền tham số cho chương trình • Lưu tạm thời giá trị ghi hay biến Chương 10: CHƯƠNG TRÌNH CON THÍ DỤ Nhập vào chuổi, in chuổi đảo ngược Ex : nhập : Cong nghe thong tin xuất : int gnoht ehgn gnoC Chương 10: CHƯƠNG TRÌNH CON Ví dụ minh họa : dùng STACK thuật toán đảo ngược thứ tự sau : ; Nhập chuỗi kí tự Khởi động đếm Đọc kí tự WHILE kí tự 13 DO Cất kí tự vào STACK Tăng biến đếm Đọc kí tự END_WHILE ; Hiển thị đảo ngược FOR biến đếm lần DO Lấy kí tự từ STACK Hiển thị END_FOR 10: CHƯƠNG TRÌNH CON Chương 10 GLOBAL THAY THẾ PUBLIC VÀ EXTRN Viết chương trình nằm file (2 module) với phân công sau : Module chương trình (Main.ASM) có nhiệm vụ xác định Offset chuổi ký tự gọi CTC nối chuổi cho kết hình Module CTC (Sub.ASM) làm nhiệm vụ nối chuổi đưa vào nhớ Chương 10: CHƯƠNG TRÌNH CON 18 Ví dụ minh hoạ STACK, CALL/RET : chương trình in số nguyên (16 bit) hình PrintNum10 PROC ; số nguyên N nằm AX PUSH BX CX DX MOV CX, ; so lan push (so ky tu) laysodu: XOR DX, DX ; cho DX = trước chia MOV BX, 10 DIV BX ; số dư DX, phần nguyên AX PUSH DX ; lưu phần dư vào stack INC CX CMP AX, ; hết chưa? JNZ laysodu ; chưa hết, lấy số dư tiếp MOV AH, INSO: POP DX ADD DL, '0' INT 21H LOOP inso POP DX CX BX RET ENDP PrintNum10 10: CHƯƠNG TRÌNH CON Chương 19 CHƯƠNG TRÌNH ĐA FILE Cho phép nhiều user tham gia giải chương trình lớn Sửa module cần dịch lại module Mỗi module giải vấn đề dễ tìm sai sót Chương 10: CHƯƠNG TRÌNH CON 20 VẤN ĐỀ TRUYỀN THAM SỐ CHUYỂN GIÁ TRỊ CỦA THAM SỐ TỪ CT GỌI CT ĐƯỢC GỌI Có cách truyền tham số Thông qua ghi Thông qua biến tồn cục Thơng qua STACK Chương 10: CHƯƠNG TRÌNH CON 21 TRUYỀN THAM SỐ THƠNG QUA THANH GHI • DỄ • ĐƠN GiẢN • THƯỜNG ĐƯỢC SỬ DỤNG ĐỐI VỚI NHỮNG CT THUẦN TÚY ASM ĐẶT GIÁ TRỊ NÀO ĐĨ VÀO THANH GHI Ở CTCHÍNH VÀ SAU ĐĨ CTC SẼ SỬ DỤNG GIÁ TRỊ NÀY TRONG THANH GHI Chương 10: CHƯƠNG TRÌNH CON 22 TRUYỀN THAM SỐ THƠNG QUA BiẾN GLOBAL KHAI BÁO BiẾN TOÀN CỤC DÙNG NÓ ĐỂ CHUYỂN CÁC GIÁ TRỊ GiỮA CT GỌI VÀ CT ĐƯỢC GỌI CÁCH NÀY THƯỜNG ĐƯỢC DÙNG : TRONG CT ViẾT THUẦN TÚY BẰNG ASM ViẾT HỖN HỢP GiỮA ASM VÀ NGÔN NGỮ CẤP CAO Chương 10: CHƯƠNG TRÌNH CON 23 TRUYỀN THAM SỐ QUA STACK PHỨC TẠP HƠN DÙNG RẤT NHIỀU KHI ViẾT CHƯƠNG TRÌNH HỖN HỢP GiỮA ASM VÀ NGƠN NGỮ CẤP CAO Chương 10: CHƯƠNG TRÌNH CON 24 CHUYỂN GIÁ TRỊ TỪ CTCON LÊN CT CHÍNH CŨNG THƠNG QUA CÁC THANH GHI,BỘ NHỚ VÀ STACK NẾU GIÁ TRỊ TRẢ VỀ LÀ BIT HOẶC 16 BIT (CHO KHAI BÁO CHAR, INT, CON TRỎ GẦN) THÌ GIÁ TRỊ ĐĨ PHẢI ĐƯỢC ĐẶT TRONG THANH GHI AX CỦA HÀM TRƯỚC KHI QUAY VỀ CTCHÍNH Chương 10: CHƯƠNG TRÌNH CON 25 CHUYỂN GIÁ TRỊ TỪ CTCON LÊN CT CHÍNH NẾU GIÁ TRỊ QUAY LẠI LÀ 32 BIT (CHO KHAI BÁO LONG, CON TRỎ XA) THÌ GIÁ TRỊ ĐĨ PHẢI ĐƯỢC ĐẶT TRONG THANH GHI DX,AX CỦA HÀM TRƯỚC KHI QUAY VỀ CT CHÍNH Chương 10: CHƯƠNG TRÌNH CON 26 NEAR | FAR báo cho lệnh RET lấy địa quay chương trình gọi STACK NEAR : lấy địa OFFSET (16BIT) STACK gán vào ghi IP FAR : lấy địa OFFSET SEGMENT STACK nạp vào ghi CS:IP Chương 10: CHƯƠNG TRÌNH CON 27 VẤN ĐỀ BẢO VỆ CÁC THANH GHI CẦN ĐƯỢC QUAN TÂM TRONG QUÁ TRÌNH LẬP TRÌNH ASM RẤT DỄ XẢY RA CÁC TRƯỜNG HỢP LÀM MẤT GIÁ TRỊ CỦA MÀ CT CHÍNH ĐÃ ĐẶT VÀO THANH GHI ĐỂ SỬ DỤNG SAU NAY KHI TA GỌI CTCON Chương 10: CHƯƠNG TRÌNH CON 28 CÁC VÍ DỤ MINH HỌA NHẬP VÀO SỐ HỆ HEX IN RA SỐ ĐÃ NHẬP VỚI YÊU CẦU SAU : ViẾT CTCON NHẬP SỐ ViẾT CTCON XUẤT SỐ CTCHÍNH GỌI CTCON TRÊN Chương 10: CHƯƠNG TRÌNH CON 29 LUYỆN TẬP LẬP TRÌNH C10 Bài : Viết chương trình nhập số nguyên n (n