Chương 9 STACK & CHƯƠNG TRÌNH CON
ộ ố ứ
ấ
ơ
V n đ truy n tham s
ế ấ
ề
Ch
i thi u STACK Gi ệ ớ 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 ệ ủ ố ề ng trình g m nhi u MODULE ề
ồ
ươ
Ch
ng 10: CH
NG TRÌNH CON
1
ươ
ƯƠ
Gi I THI U STACK Ớ Ệ
ộ
ữ ệ ươ
ộ ấ c t vào và l y ra theo ph ấ
ỗ
ươ
ầ ề ng th c LIFO (Last In ả
ộ
ớ ể
ứ ng trình ph i dành ra m t kh i b ố ộ ằ
ụ
ấ
ủ
ộ
ầ
ch c l u tr d ữ ữ ứ ư c (LIFO).
STACK : là m t c u trúc d li u m t chi u. Các ph n t ử ấ First Out). M i ch nh đ làm stack b ng khai báo STACK. Ví d : .STACK 100H ; Xin c p phát 256 bytes làm stack Là 1 ph n c a b nh , đ ơ
c t li u theo c ch vào sau ra tr ế
ớ ượ ổ ướ
ệ
Ch ng 10: CH NG TRÌNH CON 2 ươ ƯƠ
Ậ
Ớ
L P TRÌNH V I STACK Trong l p trình có khi c n truy xu t đ n các
ầ
ấ ế
c thay
c a STACK. Đ th c hi n đi u này ta
ổ ậ ự ủ
ượ ề
ệ
ư ể ự ỏ
ề ỉ
ỏ
ấ ế
ị ủ
ể
ậ ph n t trong STACK nh ng không đ ầ ử đ i tr t t dùng thêm thanh ghi con tr BP : tr BP v đ nh Stack : MOV BP,SP thay đ i giá tr c a BP đ truy xu t đ n các ph n t
trong Stack : [BP+2]
ổ ầ ử
Ch ng 10: CH NG TRÌNH CON 3 ươ ƯƠ
c đ a vào STACK l n đ u tiên g i ọ ầ c đ a vào
ầ cu i cùng đ
ượ
ư
ố
đ Ph n t ư ầ ử ượ là đáy STACK, ph n t ầ ử c g i là đ nh STACK. STACK đ ỉ ượ
ọ
vào STACK ta thêm t
ộ
ừ
ra kh i STACK ta cũng
ộ
ầ ử
ỏ
ừ ỉ đ a ch c a ô nh đ nh STCAK
ớ ỉ
ỉ ủ
Khi thêm m t ph n t ầ ử đ nh, khi l y m t ph n t ấ ỉ đ nh l y ra t ấ luôn luôn b thay đ i. ị
ị ổ
ạ
SS dùng đ l u đ a ch segemnt c a đo n b nh dùng làm STACK ộ ớ ủ ỉ i đ nh STACK) SP đ l u đ a ch c a ô nh đ nh STACK (tr t ỏ ớ ỉ
ể ư ị
ị ỉ ủ
ể ư
ớ ỉ
Ch ng 10: CH NG TRÌNH CON 4 ươ ƯƠ
THÍ DỤ
STACK
D
SP A,B,C là các Word MOV BP,SP
C
;AX = D
MOV AX,[BP]
B
;AX = C
MOV AX,[BP+2]
A
;AX = A
MOV AX,[BP+6]
Ch ng 10: CH NG TRÌNH CON 5 ươ ƯƠ
Đ l u 1 ph n t Đ l y 1 ph n t
vào Stack ta dùng l nh PUSH Stack ta dùng l nh POP ra t
ầ ử ầ ử
ể ư ể ấ
ệ ệ
ừ
ồ
ồ
ỉ
PUSH ngu n : đ a ngu n vào đ nh STACK PUSHF : c t n i dung thanh ghi c vào STACK
ư ấ ộ
ờ
• ngu n là m t thanh ghi 16 bit hay m t t
nh
ộ ừ
ồ
ộ
ớ
Ch ng 10: CH NG TRÌNH CON 6 ươ ƯƠ
ra kh i
ộ
ỏ
ể ấ
ầ ử
ồ
ư
ỉ
đ nh STACK
ấ ộ
ở ỉ
ờ
đây đích là m t thanh ghi 16 bit (tr thanh
ừ
ộ
nh
ộ ừ
ớ
ng
ưở
ả
ệ i các c
POP và POPF : dùng đ l y m t ph n t STACK. Cú pháp : POP đích : đ a ngu n vào đ nh STACK POPF : c t n i dung vào thanh ghi c Chú ý : - Ở ghi IP) hay m t t Các l nh PUSH, PUSHF, POP và POPF không nh h t ớ
ờ
Ch ng 10: CH NG TRÌNH CON 7 ươ ƯƠ
M T S NG D NG C A STACK Ụ
Ộ Ố Ứ
Ủ
Kh c ph c các h n ch c a l nh MOV ạ
ế ủ ệ
ụ
ắ
Ex : MOV CS,DS ; sai PUSH DS POP CS ; đúng
•Truy n tham s cho các ch
ng trình con
ố
ề
ươ
• L u t m th i giá tr thanh ghi hay bi n. ị
ư ạ
ờ
ế
Ch ng 10: CH NG TRÌNH CON 8 ươ ƯƠ
THÍ D 2Ụ
ậ
ổ ả
c ượ
Nh p vào 1 chu i, in chu i đ o ng ổ Ex : nh p : Cong nghe thong tin xu t : int gnoht ehgn gnoC
ậ ấ
Ch ng 10: CH NG TRÌNH CON 9 ươ ƯƠ
ậ
Ví d minh h a : dùng STACK trong thu t toán ụ nh sau : đ o ng
ọ c th t ứ ự
ượ
ư
ả
ậ ở ộ ộ
ấ
ế ự
ọ
c
ế
STACK
ấ ể
; Nh p chu i kí t ự ỗ Kh i đ ng b đ m ộ ế Đ c m t kí t ự ọ <> 13 DO WHILE kí t ự vào STACK C t kí t ự Tăng bi n đ m ế Đ c m t kí t ộ END_WHILE ; Hi n th đ o ng ị ả ượ ể FOR bi n đ m l n DO ầ ế L y m t kí t t ộ ự ừ Hi n th nó ị END_FOR
ng 10: CH Ch 10 NG TRÌNH CON ƯƠ ươ
Gi NG TRÌNH CON Ớ I THI U CH Ệ ƯƠ
i d
i 1
ệ
ề
ng trình thay vì ph i vi
i
ươ
c g p l CTC là 1 nhóm các l nh đ ộ ạ ướ ượ nhi u n i khác cái tên mà ta có th g i t ơ ể ọ ừ nhau trong ch t l ả ế ạ các nhóm l nh này t i n i c n đ n chúng.
ạ ơ ầ
ệ
ế
L i ích
ợ
ấ
ể
ơ
ễ ti
ủ ủ ơ ượ
t ki m đ ệ
ứ
CTC làm cho c u trúc logic c a c a CT d ễ ki m soát h n, d tìm sai sót h n và có th ể c công s c tái s d ng mã ế và th i gian l p trình.
ử ụ ờ
ậ
Ch ng 10: CH 11 NG TRÌNH CON ươ ƯƠ
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 12 NG TRÌNH CON ươ ƯƠ
MINH HỌA
ươ
ậ
ế ươ
ng trình nh p 1 s n (n nguyên t ch ố ng và <9). Tính giai th a c a n và xu t ra ấ ừ i h n k t qu ả ế
ủ i d ng s hex (gi ớ ạ ố
ướ ạ
Vi
i h n
ng trình tìm s hoàn thi n (gi ố
ệ
ớ ạ
2 ch s ) và in nó ra màn hình.
Vi d màn hình d 16 bit). t ch ươ ế ữ ố
Ch ng 10: CH 13 NG TRÌNH CON ươ ƯƠ
THÍ DỤ
.DATA
EXTRN MemVar : WORD, Array1 : BYTE , ArrLength :ABS … .CODE EXTRN NearProc : NEAR , FarProc : FAR …. MOV AX,MemVar MOV BX, OFFSET Array1 MOV CX, ArrLength … CALL NearProc ….
CALL FarProc …..
Ch ng 10: CH 14 NG TRÌNH CON ươ ƯƠ
C CH LÀM VI C C A CTC
Ơ Ế
Ủ
Ệ
C ch g i và th c hi n CTC trong ASM
ơ
ệ
ự cũng gi ng nh ngôn ng c p cao.
ế ọ ố
ữ ấ
ư
ọ
c đ a vào
ệ
ọ
ặ ệ ỉ ủ ệ
ẽ ượ
ư
ạ
ượ ủ
ề
ể
ệ
ặ
i thanh ghi IP đ th c
ạ ạ
Khi g p l nh g i CTC thì : . Đ a ch c a l nh ngay sau l nh g i CTC s đ ị STACK. c n p vào thanh ghi IP. . Đ a ch c a CTC đ c g i s đ ọ ẽ ượ ỉ ủ ị . Quy n đi u khi n c a CT s đ c chuy n giao cho CTC. ẽ ượ ể ề . CTC s th c hi n các l nh c a nó và khi g p RET, nó s ẽ ủ ệ ẽ ự l y đ a ch c t trên STACK ra và n p l ể ự ấ thi l nh k ti p.
ỉ ấ ế ế
ị ệ
Ch ng 10: CH 15 NG TRÌNH CON ươ ƯƠ
PUBLIC EXTRN GLOBAL
ể
ậ ợ
ươ
ệ
ế
i trong vi c d ch, liên k t ch ị ể
ề
ấ
Đ thu n l ng trình đa file, Assembler cung c p các đi u khi n Public, Extrn và Global.
PUBLIC
t nhãn (label) nào n m trong ằ ỉ ế
c phép s d ng các module TÊN CTC ử ụ ở ượ
TÊN Bi NẾ
Ch cho Assembler bi module này đ khác. Cú pháp : PUBLIC tên nhãn khai báo nhãn TÊN ĐI TR C NHÃN ƯỚ
Ch ng 10: CH 16 NG TRÌNH CON ươ ƯƠ
EXTRN
Báo cho Assembler bi ế
đ khác đ ượ ượ ử ụ
t nh ng nhãn đã ữ c khai báo PUBLIC các module ở c s d ng trong module này mà i. không c n ph i khai báo l ầ ả ạ
Cú pháp : EXTRN Tên nhãn : Ki uể
BYTE DATAPTR
WORD NEAR
DWORD FAR
PROC
Ch ng 10: CH 17 NG TRÌNH CON ươ ƯƠ
GLOBAL
THAY TH PUBLIC VÀ EXTRN. THAY TH PUBLIC VÀ EXTRN. Ế Ế
t ch ằ ươ ng trình n m trên 2 file (2 module) v i s phân công nh ư ớ ự
ng trình chính (Main.ASM) có nhi m v xác đ nh ủ ụ ệ
và g i CTC n i 2 chu i này và cho hi n ươ ổ ị ệ ự ủ ố ọ ổ
ế ả
ụ ố ư ổ
Vi ế sau : Module c a ch Offset c a 2 chu i ký t k t qu ra màn hình. Module CTC (Sub.ASM) làm nhi m v n i 2 chu i và đ a vào b ộ ệ nh . ớ
Ch ng 10: CH 18 NG TRÌNH CON ươ ƯƠ
Ví d minh ho v STACK, CALL/RET : ch
ụ
ươ
ng trình in m t s nguyên (16 bit) ra màn hình
ạ ề ộ ố
ố
XOR DX, DX ; cho DX = 0 tr
c khi chia
ướ
PrintNum10 PROC ; s nguyên N n m trong AX ằ PUSH BX CX DX MOV CX, 0 ; so lan push (so ky tu) laysodu: MOV BX, 10 DIV BX ; s d trong DX, ph n nguyên
ố ư
ầ
trong AX
ư
ư
ầ
ố ư ế
ế ư
PUSH DX ; l u ph n d vào stack INC CX CMP AX, 0 ; đã h t ch a? ư JNZ laysodu ; ch a h t, l y s d ti p ế ấ MOV AH, 2 INSO:
POP DX
INT 21H
POP DX CX BX
ng 10: CH Ch 19 NG TRÌNH CON
ADD DL, '0' LOOP inso RET ENDP PrintNum10 ươ
ƯƠ
CH
NG TRÌNH ĐA FILE
ƯƠ
Cho phép nhi u user cùng tham gia gi
i ả
quy t 1 ch ế
ươ
S a module nào thì ch c n d ch l
i module
ề ng trình l n. ớ ỉ ầ
ị
ạ
M i module ch gi
i quy t 1 v n đ
ỉ ả
ề d tìm ễ
ế
ấ
ử đó. ỗ sai sót.
Ch ng 10: CH 20 NG TRÌNH CON ươ ƯƠ
V N Đ TRUY N THAM S Ố Ề
Ấ
Ề
CHUYỂN GIÁ TRỊ CỦA THAM SỐ TỪ CT
GỌI CT ĐƯỢC GỌI
Có 3 cách truy n tham s
ề
ố
Thông qua thanh ghi
Thông qua bi n toàn c c
ụ
ế
Thông qua STACK
Ch ng 10: CH 21 NG TRÌNH CON ươ ƯƠ
Ề
Ố
TRUY N THAM S THÔNG QUA THANH GHI
• DỄ
• Đ N Gi N
Ơ
Ả
NG Đ
ƯỜ
ƯỢ Ử Ụ
Ố Ớ
• TH NH NG CT THU N TÚY ASM Ữ
C S D NG Đ I V I Ầ
Ị
Ở
CTCHÍNH VÀ SAU ĐÓ CTC S S Ẽ Ử
Ị
Đ T 1 GIÁ TR NÀO ĐÓ VÀO THANH Ặ GHI D NG GIÁ TR NÀY TRONG THANH Ụ GHI.
22 NG TRÌNH CON ng 10: CH Ch ƯƠ ươ
Ề
TRUY N THAM S THÔNG Ố QUA Bi N GLOBAL
Ế
Ụ
C G I.
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ÁCH NÀY TH
NG Đ
C DÙNG :
ƯỜ
ƯỢ
TRONG 1 CT Vi T THU N TÚY B NG ASM
Ầ
Ằ
Ế
Ữ
Vi T H N H P Gi A ASM VÀ 1 NGÔN NG Ữ C P CAO
Ế Ỗ Ợ Ấ
Ch ng 10: CH 23 NG TRÌNH CON ươ ƯƠ
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 24 NG TRÌNH CON ươ ƯƠ
Ị Ừ
CHUY N GIÁ TR T CTCON Ể LÊN CT CHÍNH.
CŨNG THÔNG QUA CÁC THANH GHI,B Ộ
NH VÀ STACK.
Ớ
Ị
Ế
Ả Ề
Ặ
Ỏ Ầ C Đ T TRONG
C KHI QUAY
Ả ƯỢ Ặ ƯỚ
Ủ
N U GIÁ TR TR V LÀ 8 BIT HO C 16 BIT (CHO KHAI BÁO CHAR, INT, CON TR G N) THÌ GIÁ TR ĐÓ PH I Đ Ị THANH GHI AX C A HÀM TR V CTCHÍNH.
Ề
Ch ng 10: CH 25 NG TRÌNH CON ươ ƯƠ
Ị Ừ
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Á C Đ T TRONG THANH TR ĐÓ PH I Đ Ả ƯỢ Ặ C KHI QUAY GHI DX,AX C A HÀM TR Ủ V CT CHÍNH.
Ề
Ch ng 10: CH 26 NG TRÌNH CON ươ ƯƠ
ệ
ấ
ị
NEAR | FAR báo cho l nh RET l y đ a ch ỉ ng trình g i nó trong STACK. quay v ch
ề ươ
ọ
NEAR : l y đ a ch OFFSET (16BIT) trong
ấ
ị
ỉ
ấ
ị
FAR : l y đ a ch OFFSET và SEGMENT trong STACK n p vào thanh ghi CS:IP.
STACK và gán vào thanh ghi IP. ỉ ạ
Ch ng 10: CH 27 NG TRÌNH CON ươ ƯƠ
V N Đ B O V CÁC THANH GHI Ệ
Ề Ả
Ấ
C QUAN TÂM TRONG QUÁ
C N Đ Ầ
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 28 NG TRÌNH CON ươ ƯƠ
CÁC VÍ D MINH H A
Ọ
Ụ
NHẬP VÀO 1 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 2 CTCON TRÊN.
Ch ng 10: CH 29 NG TRÌNH CON ươ ƯƠ
LUY N T P L P TRÌNH C10 Ậ
Ậ
Ệ
t ch ng trình nh p 1 s nguyên n (n<9). Tính giai th a c a n ừ ủ
i h n 16 bits). Bài 1 : Vi ậ ươ và xu t k t qu ra màn hình d ả ế ấ ế ố i d ng s Hex (gi ố ướ ạ ớ ạ
t ch ế
ng trình nhap vao 1 chu i ky tu. Hay in ra man hinh ). ổ đ o (trong m i t đ o t ng ký t Bài 2 :Vi ươ chu i ky tu vua nhap theo th t ổ ỗ ừ ả ừ ứ ự ả ự
ng trình ki m tra m t bi u th c đ i s có ch a các d u ế ứ ộ ấ
ể hay không h p l ạ ố . t ch ư ể ợ ệ
ứ ợ ệ nh ng (a + [b – { c * ( d – e )] } ư ợ ệ
Bài 3 :Vi ươ ngo c (nh (), [] và {}) là h p l ặ Ví d : (a + [b – { c * ( d – e ) } ] + f) là h p l ụ + f) không h p l HD : dùng ngăn x p đ PUSH các d u ngo c trái ( ‘(‘, ’{‘, ‘[‘ ) vào Stack ấ . ợ ệ ế ể ặ
Ch ng 10: CH 30 NG TRÌNH CON ươ ƯƠ
ươ
ự ự
toán h c hay ký t
, cho , ký ự
Bài 4 : Vi bi t ký t ế s ,toán t ố là phím Escape thì thoát ch
khác. N u ký t ế ng trình.
ng trình nh p vào 1 ký t t ch ậ ế v a nh p thu c lo i gi ? – ký t ạ ậ ộ ự ừ ự ọ ử ươ
Ch ng 10: CH 31 NG TRÌNH CON ươ ƯƠ
ậ
. ự ổ đ u c a t ng t ủ ừ ự ầ
, ừ
ng trình nh p 1 chu i ký t t hoa ký t ng
Bài 6 :Vi t ch ươ ế Xu t ký t d ự ướ ạ ấ còn l các ký t ự
i d ng vi ế i là ch th ữ ườ ạ
Ex : Nh p : ngo phuoc nguyen ậ Xu t : Ngo Phuoc Nguyen ấ Nh p : VU tHanh hIEn ậ Xu t : Vu Thanh Hien ấ
t ch
i h n 2 ch ữ
ế
Bài 7 : Vi ươ s ). Xu t các s hoàn thi n t ố ấ
ng trình tìm s hoàn thi n (gi ố ệ s l n nh t đ n s nh . ỏ ấ ế ệ ừ ố ớ
ớ ạ ố
ố
Ch ng 10: CH 32 NG TRÌNH CON ươ ƯƠ