Professional Documents
Culture Documents
Nhóm 10:
- Lưu Văn Đông
- Đỗ Trần Chí
STACK, PROCEDURE, PASSING
ARGUMENT FROM PROCEDURE
- PUSHF
Chuyển phần tử từ thanh ghi cờ vào STACK
*POP và POPF : dùng để lấy một phần tử ra khỏi STACK.
- POP đích
(đích là một thanh ghi 16 bit (trừ thanh ghi IP) hay một từ nhớ)
Lấy dữ liệu 16 bit trong ngăn xếp để vào Đích.
- POPF
Lấy thanh ghi cờ từ STACK ra.
Các lệnh PUSH, PUSHF, POP và POPF không ảnh hưởng tới các cờ
… … … … … … … … … …
SS
SP=28
Địa chỉ segment của stack đỉnh của stack
7. PUSH AX: giảm bớt SP đi 2(còn 26h) và cất nội dung của AX (015Ah) vào stack.
Việc cất thực hiện theo trình tự đảo thứ tự byte nên 015Ah trở thành 5A01h.
5A01
… … … … … … … … …
SS SP=26
Địa chỉ segment của stack đỉnh của stack
1. PUSH BX: giảm SP đi 2 (còn 24h) và cất nội dung của BX (03D2h) vào stack.
D203 5A01
… … … … … … … …
SS SP=24
Địa chỉ segment của stack đỉnh của stack
6. POP BX: khôi phục từ ở nơi con trỏ stack SP trỏ đến trong vùng stack vào thanh ghi
BX và tăng nội dung của SP lên 2 ( 26h). Thanh ghi BX bây giờ chứa 03D2h với
các byte được đảo thứ tự.
D203 5A01
… … … … … … … …
SS SP=26
Địa chỉ segment của stack đỉnh của stack
11. POP AX: khôi phục từ ở nơi con trỏ stack SP trỏ đến trong vùng stack vào thanh
ghi AX và tăng nội dung của SP lên 2 (28h). Thanh ghi AX bây giờ chứa 015Ah
với các byte được đảo thứ tự.
D203 5A01
… … … … … … … …
SS
SP=28
Địa chỉ segment của stack đỉnh của stack
MỘT SỐ ỨNG DỤNG CỦA STACK
- Lưu tạm thời giá trị thanh ghi hay biến.
- 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
Ví dụ:
Nhập một chuỗi, sau đó in chuỗi đảo ngược.
Ví dụ: Nhập:“bao cao”
In là:”oac oab”
Thuật toán đảo ngược thứ tự sử dụng STACK:
mov cx, 0
lap: mov ah, 1
int 21h
push ax
inc cx
cmp al, ' '
jnz lap
nt: pop [bx]
mov ah,2
mov dl, [bx]
int 21h
loop nt
mov ah, 4ch
int 21h
PROCEDURE
Procedure là 1 đơn vị độc lập bao gồm các lệnh được
gộp lại dưới 1 cái tên mà ta có thể gọi từ nhiều nơi
khác nhau trong chương trình thay vì phải viết lại các
nhóm lệnh này tại nơi cần đến chúng. Procedure
giống như các hàm trong C
Lợi ích:
Procedure làm cho cấu trúc logic của của chương
trình dễ kiểm soát hơn, dễ tìm sai sót hơn và có thể tái
sử dụng mã tiết kiệm được công sức và thời gian
lập trình.
CẤU TRÚC CỦA PROCEDURE
• TênProcedure PROC
• Các lệnh của Procedure
• RET
• TênProcedure ENDP
Ex: Ctr con in ra một ký tự
• PRINT_PROC PROC
• ;PUSH GIA TRI TRONG CAC REG VAO STACK
• PUSH AX
• PUSH DX
• MOV AH,2
• INT 21H
• ;POP CAC GIA TRI TRONG STACK
• POP DX
• POP AX
• RET
• PRINT_PROC ENDP
CƠ CHẾ LÀM VIỆC CỦA PROCEDURE
CALL label ; Gọi chương trình con tại vị trí xác định bởi nhãn label
CALL reg/mem ; Gọi chương trình con tại vị trí xác định trong reg/mem
2. Lệnh RET:
Lệnh RET dùng để kết thúc chương trình con, điều khiển sẽ được đưa về
- MOV AL, 1
- MOV BL, 2
- CALL m2
- CALL m2
- CALL m2
- CALL m2
- RET ; return to operating system.
- m2 PROC
- MUL BL ; AX = AL * BL.
- RET ; return to caller.
- m2 ENDP
- END
TRUYỀN THAM SỐ THÔNG QUA
BIẾN GLOBAL
- JE stop
- INT 10h
- ADD SI, 1
- JMP next_char
- stop:
- RET
- print_me ENDP
- msg DB ‘Bai tap', 0
- END
TRUYỀN THAM SỐ QUA STACK
- Phức tạp hơn.
- Được dùng nhiều khi viết chương trình hỗn hợp sử
dụng ASM và ngôn ngữ cấp cao.
- Trong phương pháp truyền tham số này, ta dùng stack
làm nơi chứa các tham số cần truyền thông qua các
tác vụ PUSH và POP.
.MODEL SMALL
.STACK 100h
.DATA
m1 dw ?
m2 dw ?
m3 dw ?
m4 dw ?
.CODE
main PROC
MOV AX,@data
MOV DS,AX
LEA SI,m1
LEA DI,m2
MOV [SI],1234h ; Đưa giá trị vào
MOV [DI],0FEDCh ; các ô nhớ
PUSH m1 ; Đưa vào stack
PUSH m2
CALL Sum
POP m3 ; Lấy kết quả đưa vào stack
POP m4
MOV AH,4Ch
INT 21h
main ENDP
Sum PROC
• POP DX ; Lưu lại địa chỉ trả về của lệnh CALL
• POP AX ; Lấy dữ liệu từ stack
• POP BX
• ADD AX,BX
• JNC next
• PUSH 1
• next: PUSH AX
• PUSH DX ; Trả lại địa chỉ trở về của lệnh CALL
• RET
Sum ENDP
END main
CHUYỂN GIÁ TRỊ TỪ PROCEDURE LÊN
CHƯƠNG TRÌNH CHÍNH.
Có thể thông qua thanh ghi, bộ nhớ và STACK.
- 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 được đặt
trong thanh ghi AX của hàm trước khi quay
về chương trình chính.
- Nếu giá trị trả về là 32 bit (cho khai báo long và
con trỏ xa) thì giá trị đó phải được đặt trong thanh
ghi DX, AX của hàm trước khi quay về chương
trình chính.
Hình như hết rùi thì phải