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 ươ ƯƠ