Bài giảng hợp ngữ - Chương 6 - Pdf 19

Bài ging hp ng Chng VI: Ngn xp và th tc
42
CHNG VI: NGN XP VÀ TH TC
6.1 Các thành phn ca chng trình
Ngn xp là vùng nhc bit ca chng trình. Có th s dng vùng nh này  lu
tr d liu và gii phóng nó khi không dùng n. Nh vy, vic s dng ngn xp mt
cách hp lý s giúp tit kim b nh. Trong hp ng, kích thc ngn xp ca chng
trình c khai báo sau t khoá .Stack:
TITLE <Tên chng trình>
.MODEL <Kiu b nh>
.STACK <Kích thc ngn xp>
.DATA
<Khai báo d liu>
.CODE
<Phn mã lnh>
Mt chng trình bao gm ba phn c bn: Mã lnh, D liu, Ngn xp. Khi chng
trình c np vào b nh thì ba phn trên c np vào các n nh khác nhau:
+ n nh cha phn mã lnh c gi là n mã (Code Segment), a ch ca nó
c lu gi trong thanh ghi n CS.
+ n nh cha phn d liu c gi là n d liu (Data Segment), a ch ca nó
c lu gi trong thanh ghi n DS.
+ n nh cha phn ngn xp c gi là n ngn xp (Stack Segment), a ch ca
nó c lu gi trong thanh ghi n SS.
Ni dung ca chng này ch yu nghiên cu vn ngn xp.
6.2 Cách s dng ngn xp
6.2.1 Ct d liu vào ngn xp
 ct d liu vào ngn xp ta s dng lnh Push, cách vit lnh nh sau:
PUSH <Ngun>
<Ngun>: là mt thanh ghi hay mt bin có kích thc 16 bít (1 word).
Sau lnh Push thì giá tr ca toán hng Ngun vn gi nguyên.
Ví d 1:

Gii:
TITLE Vi du 2
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AH, 1 ;Chc nng s 1: Nhp mt kí t
INT 21h
PUSH AX ;Ct kí t vào ngn xp
MOV AH, 2 ;a con tr vu dòng tip theo
MOV DL, 0Dh
INT 21h
MOV DL, 0Ah
INT 21h
POP DX ;Ly kí t t ngn xp t vào DL
INT 21h ;Hin th kí t
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
Bài ging hp ng Chng VI: Ngn xp và th tc
44
Gii thích:
Kí t nhp vào c ct  thanh ghi AL. a con tr xung u dòng tip theo thì
phi hin th hai kí t có mã ASCII là 0Dh (CR: vu dòng) và 0Ah (LF: xung dòng).
Quá trình hin th hai kí t này s làm thanh ghi AL b thay i (xem li chc nng s 2
a ngt 21h). Do ó cn phi lu kí t ban u vào ngn xp trc khi xung dòng, khi
nào mun hin th kí t này thì li ly nó ra t ngn xp.
c) Ví d 3:
Vit lnh thc hin các công vic sau:

ch cao xung a ch thp). Gi s khai báo ngn xp là .Stack 100h thì ngn xp s bt
u ti a ch offset = 0100h và kt thúc ti offset = 0000h. Di ây là mô hình ca
ngn xp khi cha có d liu:
Bài ging hp ng Chng VI: Ngn xp và th tc
45

0000h t thúc stack

00FAh
00FCh
00FEh
offset = 0100h
← SP = 0100h

Khi ngn xp cha có d liu thì SP tr ti ô nh có a ch cao nht trong ngn xp.
Sau mi lnh Push thì SP s gim i 2  tr ti ô tip theo ca ngn xp, d liu sc
t vào ô nh do SP tr ti.
Ví d:
• t ba thanh ghi AX, BX, CX vào ngn xp:
PUSH AX
PUSH BX
PUSH CX
- Sau lnh PUSH AX:

00FAh
00FCh
00FEh AX
← SP = 00FEh
0100h ng


00FEh AX
0100h ng

D liu ti ô nh do SP tr ti (offset = 00FAh) sc np vào thanh ghi CX, sau ó
SP tng lên 2  tr ti ô cao hn. Ô nh cha CX ã c gii phóng nên ta không cn
quan tâm ti ni dung bên trong nó na.
- Sau lnh POP BX:

00FAh -
00FCh BX
00FEh AX
← SP = 00FEh
0100h ng

D liu ti ô nh có offset = 00FCh c np vào thanh ghi BX.
- Sau lnh POP AX:

00FAh -
00FCh BX
00FEh AX
0100h ng
← SP = 00FEh

D liu ti ô nh có offset = 00FEh c np vào thanh ghi AX.
6.3 Th tc
6.3.1 Cu trúc th tc
 chng II ã trình bày v cu trúc ca mt th tc và v trí ca nó trong chng
trình hp ng. Trong phn này ta s  cp ti cu trúc ca các th tc thông thng
(không c chn làm chng trình chính):
<Tên th tc> PROC ;Bt u th tc

.DATA
<Khai báo d liu>
.CODE
<Chng trình chính> PROC
Lnh 1
Lnh 2
Lnh 3

CALL <Tên th tc> ;Gi th tc

<Chng trình chính> ENDP
<Tên th tc> PROC
Lnh 1
Lnh 2
Lnh 3

RET ;Tr v chng trình chính
Bài ging hp ng Chng VI: Ngn xp và th tc
48
<Tên th tc> ENDP
Các th tc khác
END <Chng trình chính>
• Ví d:
Vit chng trình nhp mt kí t t bàn phím ri hin nó u dòng tip theo (có s
ng th tc).
Gii:
TITLE Vi du
.MODEL SMALL
.STACK 100H
.CODE

+ Ct a ch ca lnh ng sau lnh Call (trong chng trình chính) vào ngn xp.
+ Np a ch lnh u tiên ca th tc vào cp thanh ghi CS:IP (tc là thi hành lnh
này).
Ln lt các lnh trong th tc sc thi hành cho ti khi gp lnh RET. Lnh RET
 ly a ch lnh t ngn xp (do lnh Call ct trc ó) ri np vào các thanh ghi
CS:IP. Nh vy quyn u khin ã c tr v chng trình chính (xem s  bên
i).
Call <Th tc>
nh tip theo


nh u tiên



RET
Chng trình chính
Th tc


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status