Bài 3 – Cu trúc r nhánh – Vòng lp
Ths. Nguyn Ha Duy Khang, Ks. Trn Hu Danh 10
• JMP <nhãn> ; (near jump). Kiu này nhy tùy ý trong phm vi segment.
Ví d: JMP Calculate
• JMP FAR PTR <nhãn> ; (far jump). Kiu này nhy đến bt kì cho.
Ví d: JMP FAR PTR Calculate
• JMP <con tr 2 byte> ; (near indirect jump). Khi thc hin, thanh ghi PC s
được gán bng giá tr lưu ti địa ch này. Có th kết hp
dùng vi định v ch s.
Ví d:
myPointer DW Prepare, Calculate, Check, Output
...
MOV BX, 2 ; ch s trong mng con tr
SHL BX, 1 ; nhân đôi
JMP myPointer[BX]
...
Prepare: ; công vic 0
...
Calculate: ; công vic 1
...
Check: ; công vic 2 – nơi cn nhy đến
...
Output: ; công vic 3
...
• JMP <con tr 4 byte> ; (far indirect jump). Tương t trường hp trên, nhưng
con tr gm c segment và offset. Ch khác khai báo
con tr
• JMP <thanh ghi 2 byte> ; (indirect jump via regs). Nhy đến địa ch lưu trong
thanh ghi AX.
Ví d: MOV AX, offset Calculate
...
JMP AX ; PC AX
2.4. Lnh nhy có điu kin
Cú pháp: J<điukin> <Label>
Các lnh nhy có điu kin bt đầu bng ch J sau đó là các ch cái biu th
điu kin (ví d JGE: Jump if Greater than or Equal, nhy nếu ln hơn hay bng), tiếp
sau là mt tên nhãn.
Điu kin để lnh nhy xem xét khi thi hành là giá tr các c được to ra t lnh
CMP hay TEST. Khi s dng lnh nhy có điu kin sau khi thc hin phép so sánh,
Bài 3 – Cu trúc r nhánh – Vòng lp
Ths. Nguyn Ha Duy Khang, Ks. Trn Hu Danh 11
phi đặc bit lưu ý toán hng trong phép so sánh là s có du (signed) hay không có
du (unsigned) để la chn lnh cho phù hp.
Ví d: MOV AH,AL ; AL hin bng 128
CMP AH,1
JGE Greater ; AH > 1 nhưng không nhy ????
. . .
Greater:
Ví d: nếu AL là s nguyên không du thì đon chương trình trên phi sa li như
sau:
MOV AH,AL
CMP AH,1
JAE Greater
. . .
Greater:
Mt s lnh nhy có điu kin thường dùng:
Lnh Ý Nghĩa Điu Kin
JB
JNAE
Nhy nếu nh hơn (Jump if Below)
Nhy nếu không ln hơn hoc bng CF = 1
JAE
JNB
Nhy nếu ln hơn hoc bng (Jump if Above or Equal)
Nhy nếu không nh hơn CF = 0
JBE
JNA
Nhy nếu nh hơn hoc bng (Jump if Below or Equal)
Nhy nếu không ln hơn
CF = 1 và ZF =
1
JA
JNBE
Nhy nếu ln hơn (Jump if Above)
Nhy nếu không nh hơn hoc bng
CF = 0 và ZF =
0
JE
JZ
Nhy nếu bng (Jump if Equal)
Nhy nếu bng (Jump if Zero) ZF = 1
JNE
JNZ
Nhy nếu không bng (Jump if Not Equal)
Nhy nếu không bng (Jump if Not Zero) ZF = 0
2.5. Lnh lp
Bng cách dùng các lnh nhy có th to ra vòng lp. Tuy nhiên, để viết chương
trình tin li và ngn gn, có th dùng thêm các lnh lp như LOOP, LOOPZ,…
Cú pháp: LOOP <Label>
t động gim CX mt đơn v, sau đó kim tra xem CX có bng 0, nếu không
bng thì nhy đến nhãn <Label>
Cú pháp: LOOPZ <Label>
t động gim CX mt đơn v, sau đó kim tra xem CX có bng 0 hoc c ZF có
bt không (ZF=1), nếu c hai điu này không xy ra thì nhy đến nhãn <Label>
Bài 3 – Cu trúc r nhánh – Vòng lp
Ths. Nguyn Ha Duy Khang, Ks. Trn Hu Danh 12
Ví d: Nhp mng A gm 10 ký t
MOV SI, 0 ; ch s mng
MOV CX, 10 ; s ln lp
LAP: MOV AH, 1 ; nhp ký t
INT 21H
MOV A[SI], AL
INC SI
3. NI DUNG THC HÀNH
3.1. Cu trúc R nhánh
- Chương trình sau đây nhn 1 ký t. Nếu là ký t HOA thì in ra màn hình "Ky tu
HOA". Ngược li in ra câu "Ky tu thuong". (Mã ASCII ca ký t HOA <= 'Z').
Son tho và lưu vi tên BAI_3A.ASM
- Dch và chy CT nhng trường hp khác nhau để xem kết qu trên màn hình.
- V lưu đồ điu khin ca chương trình.
DSEG SEGMENT
tbao1 DB "Ky tu HOA.$"
tbao2 DB "Ky tu thuong.$"
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
start:mov ax, DSEG
mov ds, ax
mov ah, 01h
int 21h
cmp al, 'Z' ; so sánh vi 'Z'
ja nhan ; Nếu ln hơn => ký t thường
mov ah, 09 ; Nếu không ln hơn => ký t HOA
lea dx, tbao1 ; in "Ky tu HOA"
int 21h
jmp exit
nhan: mov ah, 09 ; in "Ky tu thuong"
lea dx, tbao2
int 21h
exit:mov ah, 7
int 21h
mov ah, 4Ch ; tr v h điu hành
int 21h
CSEG ENDS
END start
Bài 3 – Cu trúc r nhánh – Vòng lp
Ths. Nguyn Ha Duy Khang, Ks. Trn Hu Danh 13
- Ti sao cn phi có lnh JMP EXIT? Nếu không có lnh y thì chương trình
thc hin như thế nào? Chy chương trình để kim chng.
- Thay lnh JA NHAN bng lnh JNA NHAN. Sa chương trình sao cho kết
qu không thay đổi.
- Khi ký t nhp vào không phi là ch cái thì kết qu in ra màn hình là gì? Ti
sao?
3.2 Cu trúc vòng lp
- Xem chương trình in ra màn hình ln lượt các ký t t A đến Z được viết như
sau. Hãy son tho và đặt tên tp tin là BAI_3B.ASM.
- Dch và chy chương trình để xem kết qu trên màn hình.
- Vòng lp trong chương trình bao gm đon lnh nào? Viết theo kiu while do
hay repeat ... until hay for? V lưu đồ chương trình.
- Sa chương trình để in ra màn hình ln lượt các ký t t 'Z' đến 'A'.
- Tiếp tc sa chương trình sao cho gia các ký t có 1 khong trng (Z Y ....B
A)
- Dùng lnh LOOP để viết li chương trình BAI_3B.ASM theo cu trúc vòng lp
for.
4. BÀI TP KIM TRA:
4.1 Viết chương trình cho nhp 1 ký t t màn hình và xut câu thông báo tương ng
sau:
- Nếu ký t nhp là ‘S’ hay ‘s’ thì in ra “Good morning!”
- Nếu ký t nhp là ‘T’ hay ‘t’ thì in ra “Good Afternoon!”
- Nếu ký t nhp là ‘C’ hay ‘c’ thì in ra “Good everning!”
4.2 Viết li chương trình BAI_3A.ASM sao cho chương trình có th phân bit được 3
loi ký t nhp t bàn phím: "Ký t HOA", "ký t thường" và "ký t khác".
CSEG SEGMENT
ASSUME CS: CSEG
start:mov dl, 'A' ; DL cha ký t đầu tiên 'A'
nhan:mov ah, 02h ; in ký t trong DL ra màn hình
int 21h
inc dl ; DL cha ký t kế cn in
cmp dl, 'Z' ; So sánh DL vi 'Z'
jna nhan ; Nếu <= 'Z' thì tiếp tc in
mov ah, 08h ; Nếu > 'Z' thì thoát (không in tiếp)
int 21h
mov ah, 4Ch
int 21h
CSEG ENDS
END start
Bài 3 – Cu trúc r nhánh – Vòng lp
Ths. Nguyn Ha Duy Khang, Ks. Trn Hu Danh 14
4.3 Viết chương trình nhp t bàn phím 1 ký t thường. Sau đó in ra màn hình ln lượt
các ký t t ký t nhn được đến 'z' sao cho gia các ký t có 1 khong trng.
4.4 Không dùng hàm 0Ah/21h, hãy dùng lnh lp để viết chương trình nhp vào 1
chui ký t. Sau khi nhp xong đếm xem chui có bao nhiêu ký t. In ra màn hình
chui nhn được và s ký t có trong chui.
Ví d: S = "Hello world !" ==> S kí t trong chui là 13.
4.5 Viết chương trình cho phép nhp vào mt chui bt k. Sau đó:
- Đổi tt c ký t thường thành ký t hoa và in ra màn hình.
- Đổi tt c ký t hoa thành ký t thường và in ra màn hình.
Ví d: S = ‘weLcOme To AssEmblY’
In ra: welcome to assembly - WELCOME TO ASSEMBLY
4.6 Nhp vào 2 chui s, đổi 2 chui thành s, sau đó cng hai s, đổi ra chui và xut
chui tng.
Ví d: S1 = "123" => N1 = 123
S2 = "456" => N2 = 456
N = N1 + N2 = 123 + 456 = 579 => S = "579" (xut S ra màn hình)
4.7 Nhp 2 s nguyên dương A, B. Tính A/B, A*B (không dùng lnh DIV, MUL) và
in ra màn hình kết qu.
Ví d: A=18, B=3
Tính A/B: 18 - 3 - 3 - 3 - 3 - 3 - 3 = 0, vy A/B = 6 (tng tr B cho đến khi A = 0).
Tính A*B = 18 + 18 + 18 = 54