CHƯƠNG TRÌNH CON Chương 9 STACK & CHƯƠNG TRÌNH CON Giới thiệu STACK Một số ứng dụng của STACK Cấu trúc của 1 CTC Cơ chế làm việc của 1 CTC Vấn đề truyền tham số Chương trình gồm nhiều MODULE Chương 10[.]
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 D A,B,C Word MOV BP,SP MOV AX,[BP] ;AX = D MOV AX,[BP+2] ;AX = C C SP B 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 Chương 10: CHƯƠNG TRÌNH CON 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 PrintNum10Chương 10: CHƯƠNG TRÌNH CON 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 ... thời gian lập trình Chương 10: CHƯƠNG TRÌNH CON 11 CẤU TRÚC CỦA CTCON TÊNCTC PROC [NEAR|FAR] CÁC LỆNH CỦA CTC RET TÊNCTC ENDP Chương 10: CHƯƠNG TRÌNH CON 12 MINH HỌA Viết chương trình nhập số... PrintNum1 0Chương 10: CHƯƠNG TRÌNH CON 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: ... Lấy kí tự từ STACK Hiển thị END_FOR Chương 10: CHƯƠNG TRÌNH CON 10 GiỚI THIỆU CHƯƠNG TRÌNH CON CTC nhóm lệnh gộp lại tên mà ta gọi từ nhiều nơi khác chương trình thay phải viết lại nhóm lệnh