1 phan mo đầu assemler

Chia sẻ bởi Nguyễn Tuấn | Ngày 26/04/2019 | 50

Chia sẻ tài liệu: 1 phan mo đầu assemler thuộc Công nghệ thông tin

Nội dung tài liệu:

Bài giảng ASM
1
Chương 7 : Nhập môn Assembly
Hiểu ngôn ngữ máy và ngôn ngữ Assembly.
Trình hợp dịch Assembler.
Lý do nghiên cứu Assembly.
Hiểu các thành phần cơ bản của Assembly
Nắm được cấu trúc của 1 CT Assembly.
Biết viết 1 chương trình Assembly.
Biết cách dịch, liên kết và thực thi 1 chương trình Assembly.

Mục tiêu
Bài giảng ASM
2
Giới thiệu ngôn ngữ Assembly
Giúp khám phá bí mật phần cứng cũng như phần mềm máy tính.
Nắm được cách phần cứng MT làm việc với hệ điều hành và hiểu được bằng cách nào 1 trình ứng dụng giao tiếp với hệ điều hành.
Một MT hay một họ MT sử dụng 1 tập lệnh mã máy riêng cũng như 1 ngôn ngữ Assembly riêng.
Bài giảng ASM
3
Assembler
Một chương trình viết bằng ngôn ngữ Assembly muốn MT thực hiện được ta phải chuyển thành ngôn ngữ máy.
Chương trình dùng để dịch 1 file viết bằng Assembly ? ngôn ngữ máy , gọi là Assembler.
Có 2 chương trình dịch:
MASM và TASM
Bài giảng ASM
4
Lý do nghiên cứu Assembly
Đó là cách tốt nhất để học phần cứng MT và hệ điều hành.
Vì các tiện ích của nó .
Có thể nhúng các chương trình con viết bằng ASM vào trong cácchương trình viết bằng ngôn ngữ cấp cao .
Bài giảng ASM
5
Lệnh máy
Là 1 chuổi nhị phân có ý nghĩa đặc biệt - nó ra lệnh cho CPU thực hiện tác vụ.
Tác vụ đó có thể là :
di chuyển 1 số từ vị trí nhớ này sang vị trí nhớ khác.
Cộng 2 số hay so sánh 2 số.
0 0 0 0 0 1 0 0 Add a number to the AL register
1 0 0 0 0 1 0 1 Add a number to a variable
1 0 1 0 0 0 1 1 Move the AX reg to another reg
Bài giảng ASM
6
Lệnh máy (cont)
Tập lệnh máy được định nghĩa trước, khi CPU được sản xuất và nó đặc trưng cho kiểu CPU .
Ex : B5 05 là 1 lệnh máy viết dạng số hex, dài 2 byte.
Byte đầu B5 gọi là Opcode
Byte sau 05 gọi là toán hạng Operand
Ý� nghĩa của lệnh B5 05 : chép giá trị 5 vào reg AL
Bài giảng ASM
7
Cách viết 1 chương trình Assembly
Soạn CT
TenCT.ASM
Dịch CT
Liên kết CT
Chạy CT
Dùng 1 phần mềm soạn thảo VB bất kỳ để soan CT Assembly như : NotePad, NC, màn hình C, Pascal ...
CT có phần mở rộng là .ASM
dùng MASM để dịch chương trình nguồn .ASM ? File Object.
dùng LINK để liên kết Object tạo tập tin thực hiện .EXE
Gỏ tên tập tin thực hiện .EXE từ dấu nhắc DOS để chạy
Bài giảng ASM
8
Dịch và nối kết chương trình
TenCT .ASM
TenCT .OBJ
MASM.EXE
TenCT .EXE
TenCT .MAP
TenCT .LIST
TenCT .CRF
LINK.EXE
Bài giảng ASM
9
Một chương trình minh hoạ
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
MES DB “HELLO WORD”,’$’
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV DX, OFFSET MES
MOV AH, 9
INT 21
MOV AH,4CH
INT 21
MAIN ENDP
END MAIN
Bài giảng ASM
10
Các file được tạo
Sau khi dịch thành công file nguồn.ASM, ta có các file :
File listing : file VB , các dòng có đánh số thứ tự mã.
File Cross reference
File Map
File Obj
File EXE
Bài giảng ASM
11
File Listing

Microsoft (R) Macro Assembler Version 5.10 10/11/4
Page 1-1


1 DOSSEG
2 .MODEL SMALL
3 .STACK 100H
4 .DATA
5 0000 48 45 4C 4C 4F 20 MES DB "HELLO WORD$"
6 57 4F 52 44 24
7 .CODE
8 0000 MAIN PROC
9 0000 B8 ---- R MOV AX,@DATA
10 0003 8E D8 MOV DS, AX
11 0005 B4 09 MOV AH,9
12 0007 BA 0000 R MOV DX, OFFSET MES
13 000A CD 21 INT 21H
14 000C B4 4C MOV AH,4CH
15 000E CD 21 INT 21H
16 0010 MAIN ENDP
17 END MAIN
♀◘Microsoft (R) Macro Assembler Version 5.10 10/11/4
Bài giảng ASM
12
Map File
Start Stop Length Name Class
00000H 0001FH 00020H _TEXT CODE
00020H 0002AH 0000BH _DATA DATA
00030H 0012FH 00100H STACK STACK

Origin Group
0002:0 DGROUP

Program entry point at 0000:0010
Bài giảng ASM
13
Giải thích
.model small : dùng kiểu cấu trúc <= 64 K bộ nhớ cho mã , 64K cho dữ liệu.
.Stack 100h : dành 256 bytes cho stack của chương trình .
.Data : đánh dấu phân đoạn dữ liệu ở đó các biến được lưu trữ.
.Code : đánh dấu phân đoạn mã chứa các lệnh phải thi hành.
Proc : khai báo đầu 1 thủ tục, trong Ex này ta chỉ có 1 thủ tục Main.
Bài giảng ASM
14
Giải thích (cont)
Chép địa chỉ đoạn dữ liệu vào thanh ghi AX.
Sau đó chép vào thanh ghi DS
Gọi hàm số 9 của Int 21h của Dos để xuất chuổi ký tự ra màn hình.
Thoát khỏi CT .
Main endp : đánh dấu kết thúc thủ tục
End main : chấm dứt chương trình
Bài giảng ASM
15
Cấu trúc của 1 CT ASM
DOSSEG
.MODEL kieåu boä nhôù
.STACK kích thöôùc
.DATA
khai baùo bieán, haèng
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS,AX
caùc leänh cuûa chöông trình chính
MOV AH,4CH ; Thoaùt khoûi chöông trình
INT 21H
MAIN ENDP
caùc chöông trình con khaùc neáu coù
END MAIN
Bài giảng ASM
16
Các chế độ bộ nhớ
Bài giảng ASM
17
Dạng lệnh
[name] [operator] [ operand] [comment]
Nhãn, tên biến
Tên thủ tục
Mã lệnh dạng
gợi nhớ
Register, ô nhớ
Trị, hằng
Chú thích
Ex : MOV CX , 0
LAP : MOV CX, 4
LIST DB 1,2,3,4
Mỗi dòng chỉ chứa 1 lệnh và mỗi lệnh phải nằm trên 1 dòng
Bài giảng ASM
18
INT 21H
Lệnh INT số hiệu ngắt được dùng để gọi chương trình ngắt của DOS và BIOS.
Ngắt 21h
Muốn sử dụng hàm nào của INT 21h ta đặt
function_number vào thanh ghi AH, sau đó gọi INT 21h
Function_number chức năng
nhập 1 ký tự từ bàn phím
Xuất 1 ký tự ra mà hình.
9 Xuất 1 chuổi ký tự ra màn hình
Bài giảng ASM
19
INT 21h (cont)
Hàm 1 : Nhập 1 ký tự

Input : AH =1
Output : AL = mã ASCCI của phím ấn
= 0 nếu 1 phím điều khiể�n được ấn


Hàm 2 : Hiển thị 1 ký tự ra màn hình

Input : AH =2
DL = Mã ASCII của ký tự hiển thị hay ký tự điều khiển

Bài giảng ASM
20
Thí dụ minh họa
DOSSEG
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AH , 2
MOV DL , `?`
INT 21H
MOV AH ,1
INT 21H
MOV BL,AL
MOV AH,2
MOV DL, 0DH
INT 21H
MOV DL , 0AH
INT 21H
MOV DL , BL
INT 21H
MOV AX , 4C00H
INT 21H
MAIN ENDP
END MAIN
? N
N
KẾT QUẢ
Bài giảng ASM
21
Thí dụ minh họa các hàm của INT 21
In dấu ? ra màn hình :
MOV AH, 2
MOV DL, `?`
INT 21H
Nhập 1 ký tự từ bàn phím :
MOV AH, 1
INT 21H
Bài giảng ASM
22
Biến
Cú pháp : [tên biến] DB | DW |.... [trị khởi tạo]
Là một tên ký hiệu dành riêng cho 1 vị trí trong bộ nhớ nơi lưu trữ dữ liệu.
Offset của biến là khoảng cách từ đầu phân đoạn đến biến đó.
Ex : khai báo 1 danh sách aList ở địa chỉ 100 với nội dung sau :
.data
aList db "ABCD"
Bài giảng ASM
23
Biến (cont)
Lúc đó :
Offset Biến
0000 A
0001 B
0002 C
0003 D
Bài giảng ASM
24
Khai báo biến
Bài giảng ASM
25
Minh họa khai báo biến
Char db `A`
Num db 41h
Mes db "Hello Word",`$`
Array_1 db 10, 32, 41h, 00100101b
Array_2 db 2,3,4,6,9
Myvar db ? ; biến không khởi tạo
Btable db 1,2,3,4,5
db 6,7,8,9,10
KIỂU BYTE
Bài giảng ASM
26
Minh họa khai báo biến
DW 3 DUP (?)
DW 1000h, `AB`, 1024
DW ?
DW 5 DUP (1000h)
DW 256*2
KIỂU WORD
DẠNG LƯU TRỮ DỮ LIỆU KIỂU WORD :
Trình hợp dịch đảo ngược các byte trong 1 giá trị kiểu WORD khi lưu trữ trong bộ nhớ :
Byte thấp lưu ở địa chỉ thấp Byte cao lưu ở địa chỉ cao
Bài giảng ASM
27
Minh họa khai báo biến
KIỂU WORD
Ex : 1234h được lưu trữ trong bộ nhớ như sau :

34
12
1000h
1001h
BỘ
NHỚ
ĐỊA CHỈ
DỮ LIỆU
1234H
Bài giảng ASM
28
Toán tử DUP
Lặp lại 1 hay nhiều giá trị khởi tạo.
Ex :
Bmem DB 50 Dup(?)
; khai báo vùng nhớ gồm 50 bytes.
db 4 dup ("ABC")
;12 bytes "ABCABCABCABC"
db 4096 dup (0)
; Vùng đệm 4096 bytes tất cả bằng 0
Bài giảng ASM
29
Khởi tạo biến
Lưu ý :
Khi khởi tạo trị là 1 số hex thì giá trị số luôn luôn bắt đầu bằng 1 ký số từ 0 đến 9. Nếu ký số bắt đầu là A.. F thì phải thêm số 0 ở đầu.
Ex :
Db A6H ; sai
Db 0A6h ; đúng
Bài giảng ASM
30
Toán tử DUP (cont)
Amtrix dw 3 dup (4 dup (0) )
Tạo 1 ma trận 3x4
Atable db 4 dup (3 dup (0), 2 dup (`X`))
Tạo 1 vùng nhớ chứa 000XX 000XX 000XX 000XX
Bài giảng ASM
31
Toán tử DUP
Chỉ xuất hiện sau 1 chỉ thị DB hay DW
Với DUP ta có thể lặp lại 1 hay nhiều trị cho vùng nhớ.
Rất có ích khi làm việc với mảng hay chuổi.
Bài giảng ASM
32
Toán tử ?
Muốn khai báo 1 biến hay 1 mảng mà không cần khởi tạo trị ta dùng toán tử ?
Ex : MEM8 DB ? ; khai báo 1 byte trống trong bộ nhớ
MEM16 DW ? ; khai báo 2 byte trống trong bộ nhớ
BMEM DB 50 DUP(?)
; khai báo 50 byte trống trong bộ nhớ
Bài giảng ASM
33
Chương trình dạng .COM
CODE SEGMENT
ASSUME CS:CODE , DS:CODE, SS:CODE
; toàn bộ chương trình chỉ nằm trong 1 segment
Org 100h ;; chỉ thị nạp thanh ghi lệnh IP=100h khi CT được nạp
Main proc
mov ax,bx
......
Main endp
Count db 10
.........
Code ends
End main
Bài giảng ASM
34
SUMMARY
chương trình Assembly gồm nhiều dòng lệnh.
Mỗi lệnh phải viết trên 1 dòng
Lệnh có thể gồm [tên] [toán tử] [toán hạng]
Các ký tự phải đặt trong dấu ` ` hay " "
DB dùng để định nghĩa biến kiểu BYTE
DW dùng để định nghĩa biến kiểu WORD.
Có 2 cách xuất nhập dữ liệu : liên lạc trực tiếp qua cổng hay dùng các phục vụ ngắt của DOS và BIOS.
Bài giảng ASM
35
Câu hỏi ôn tập
Trong mã máy dưới đây được lấy từ tập tin liệt kê, hãy nêu ý nghĩa của R
5B 0021 R ADD BX, VAL1
Nêu ý nghĩa của ký hiệu địa chỉ của biến dưới đây trong 1 tập tin liệt kê.
5B 0021 R ADD BX, VAL1
Bài giảng ASM
36
Câu hỏi ôn tập
Chương trình sau có lỗi. Hãy tìm câu lệnh nào gây ra lỗi, giải thích và sửa lại cho đúng.
.MODEL SMALL
.STACK 100H
.DATA
MOV AX, VALUE1
MOV BX, VALUE2
INC BX, 1
INT 21H
MOV 4C00H, AX
MAIN ENDP
VALUE1 0AH
VALUE2 1000H
END MAIN
Bài giảng ASM
37
Câu hỏi ôn tập
Chương trình sau có lỗi. Hãy tìm câu lệnh nào gây ra lỗi, giải thích và sửa lại cho đúng.
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS , AX
MOV AX, VALUE1
MOV AX, VALUE2
MOV AX, 4C00H
INT 21H
MAIN ENDP
VALUE1 DB 0AH
VALUE2 DB 1000H
END MAIN
Bài giảng ASM
38
Bài tập lập trình
Bài 1 : Viết chương trình nhập 1 ký tự thường , in ra ký tự hoa tương ứng.
Bài 2 : Viết chương trình hoán vị 2 biến kiểu byte được gán sẵn trị.
Bài 3 : Viết chương trình tạo 1 array có các phần tử 31h,32h,33h,34h.
Nạp từng phần tử vào thanh ghi DL và xuất nó ra màn hình. Giải thích tại sao kết xuất trên màn hình là 1234.
Bài giảng ASM
39
Chương 8: Toán tử - Toán hạng -
các phép định địa chỉ - Tập lệnh
Hiểu cách dùng toán tử trong ASM.
Nắm được tập lệnh của CPU 8086/8088.
Biết cách định địa chỉ thông qua toán hạng.
Biết vận dụng các kỹ năng trên vào vấn đề cần giải quyết và hiện thực thành chương trình.
Mục tiêu
Bài giảng ASM
40
Toán tử
Điểm quan trọng phân biệt giữa toán tử và lệnh là :

Toán tử điều khiển sự tính toán các trị hằng xác định lúc dịch.
Lệnh điều khiển sự tính toán các trị không xác định được cho đến khi CT thực hiện.
Ex : toán tử + điều khiển phép cộng khi dịch.
Lệnh cộng ADD điều khiển phép cộng khi chương trình thực hiện.
Bài giảng ASM
41
Toán tử số học
Bài giảng ASM
42
Toán tử logic
Ex : MOV AH , 8 OR 4 AND 2
MOV AL, NOT (20 XOR 0011100B)
Bài giảng ASM
43
Toán Tử Quan Hệ
So sánh 2 biểu thức và cho trị là true (-1) nếu điều kiện của toán tử thỏa, ngược lại là false.
Bài giảng ASM
44
ĐỘ ƯU TIÊN TOÁN TỬ
Độ ưu tiên
giảm dần
Bài giảng ASM
45
Toán tử SEG
Cú pháp :
SEG expression
Cho địa chỉ đoạn của biểu thức expression.
Expression có thể là biến | nhãn | tên segment hay toán hạng bộ nhớ khác.
Bài giảng ASM
46
Toán tử OFFSET
Cú pháp :
OFFSET expression
Cho địa chỉ OFFSET của biểu thức expression.
Expression có thể là biến | nhãn | tên segment hay toán hạng trực tiếp bộ nhớ khác.
Ex : nạp địa chỉ segment và offset của biến table vào DS :AX
TABLE DB ?
MOV AX, SEG TABLE
MOV DS, AX
MOV DX, OFFSET Table
Bài giảng ASM
47
TOÁN TỬ $
Cho địa chỉ của OFFSET của phát biểu chứa toán tử $.
Thường được dùng để tính chiều dài chuổi.
Bài giảng ASM
48
TOÁN TỬ PTR
Cú pháp : type PTR expression
Cho phép thay đổi dạng của expression

nếu expr là 1 biến | toán hạng bộ nhớ thì type có thể là byte , word hay dword.

Nếu expr là 1 nhãn thì type có thể là near hay far.
Ex : mov ax, word ptr var1 ; var1 laø toaùn haïng kieåu Word
mov bl , byte ptr var2 ; var2 laø toaùn haïng kieåu byte
Bài giảng ASM
49
Toán hạng (Operand)
Các toán hạng chỉ ra nơi chứa dữ liệu cho 1 lệnh , chỉ thị.
Hầu hết các lệnh Assembly đều có đối số là 1 hoặc 2 toán hạng
Có 1 số lệnh chỉ có 1 toán hạng như RET, CLC.
Với các lệnh 2 toán hạng thì toán hạng thứ 2 là toán hạng nguồn (source) - chứa dữ liệu hoặc địa chỉ của dữ liệu.
Bài giảng ASM
50
Toán hạng (Operand)
Toán hạng đích giữ kết quả (nếu có yêu cầu) sau khi
thi hành lệnh.
Toán hạng đích có thể là thanh ghi hay Bộ nhớ.
Toán hạng nguồn có thể là thanh ghi, bộ nhớ hay 1 giá trị
tức thời .
Toán hạng số tức thời có thể là số trong các hệ đếm khác nhau
và được viết theo qui định sau :
Số hệ 2 : xxxxxxxxB (x là bit nhị phân)
Số hệ 10 : xxxxxD hay xxxxx (x là 1 số hệ 10)
Số hệ 16 : xxxxH và bắt đầu bằng số (x là 1 số hệ 16)
Bài giảng ASM
51
Cách xác định dữ liệu trong lệnh được gọi là cơ chế định vị địa chỉ (addressing mode) ? chỉ ra nơi cất dữ liệu
Cơ chế định vị địa chỉ
Cơ chế này chia làm 3 loại : định vị bằng thanh ghi, bằng giá trị tức thời và bằng bộ nhớ.
MOV AL, BL ; định vị bằng thanh ghi
INC BX ; định vị bằng thanh ghi
Toán hạng là Reg
Lệnh sẽ được thực hiện
nhanh hơn
Bài giảng ASM
52
Toán hạng tức thời là dữ liệu 8 bit hay 16 bit nằm ngay trong câu lệnh.
Dữ liệu xử lý được lưu ngay trong lệnh
Ex : MOV CL, 61h ; ? toán hạng tức thời
Mã máy của lệnh trên là B161h
DỊNH VỊ T?C TH?I
Lệnh sẽ được thực hiện
nhanh vì dữ liệu được lấy cùng
với lệnh.
Bài giảng ASM
53
ĐỊNH VỊ THANH GHI
Giá trị của toán hạng được truy xuất nằm ngay trong thanh ghi của CPU.
Ex : MOV AX,BX ; chuyển nội dung của thanh ghi BX vào thanh ghi AX
Bài giảng ASM
54
Định vị gián tiếp thanh ghi :
địa chỉ toán hạng không chứa trực tiếp trong lệnh mà gián tiếp thông qua một thanh ghi.
D?NH V? B? NH?
Lấy dữ liệu từ vùng nhớ
Ex : SUB DX, [BX] ;
Khác với lệnh SUB DX, BX
Trong chế độ này, địa chỉ Offset của ô nhớ chứa nộI dung của toán hạng nằm trong các thanh ghi BX,BP,SI,DI.
Địa chỉ segment ngầm định chứa trong DS nếu dùng BX,SI,DI
Địa chỉ segment ngầm định chứa trong ES nếu dùng BP
Bài giảng ASM
55
EX1 : MOV AX, [SI]
Nạp nội dung của ô nhớ mà địa chỉ Offset lưu trong BP và địa chỉ đoạn lưu trong ES vào AX.
EX2 : MOV AX, [BP]
Nạp nội dung của ô nhớ mà địa chỉ Offset lưu trong SI và địa chỉ đoạn lưu trong DS vào AX.
Định vị gián tiếp thanh ghi :

Bài giảng ASM
56
ĐỊNH VỊ TRỰC TIẾP
Địa chỉ Offset của ô nhớ chứa dữ liệu toán hạng nằm trực tiếp trong câu lệnh còn địa chỉ segment ngầm định chứa trong DS.
Ex : MOV BX, [1234]
Nạp nộI dung ô nhớ có địa chỉ DS:1234  BX
Bài giảng ASM
57
ĐỊNH VỊ CƠ SỞ
Địa chỉ Offset của toán hạng được tính là tổng của nộI dung thanh ghi BX hoặc BP và 1 độ dịch.
Độ dịch là 1 số nguyên âm hoặc dương. Địa chỉ đọan là đoạn hiện tại.
Bài giảng ASM
58
ĐỊA CHỈ HIỆU DỤNG
Toán hạng bộ nhớ dùng trong tập lệnh vi xử lý 86 sử dụng phương pháp định địa chỉ tổng hợp được gọi là địa chỉ hiệu dụng.
Địa chỉ hiệu dụng là tổ hợp của 3 nhóm sau đặt trong dấu [ ].
Nhóm thanh ghi chỉ số : SI , DI
Nhóm thanh ghi nền : BX, BP
Địa chỉ trực tiếp : số 16 bit
Các thanh ghi trong cùng 1 nhóm không được xuất hiện trong cùng 1 địa chỉ hiệu dụng.
Bài giảng ASM
59
ĐỊA CHỈ HIỆU DỤNG
Địa chỉ hiệu dụng hợp lệ :
Một số thí dụ
[1000h] [SI], [DI] , [BX] , [BP]
[SI+BX], [SI+BP] , [DI+BX] , [DI+BP] , [SI+1000h], [DI+100h]
[SI] [BX] [1000h], [SI+BP+1000h] , [DI+BX][1000h], [DI+1000h]+[BP]
Địa chỉ hiệu dụng không hợp lệ :
[70000], [AX] , [SI+DI+1000h], [BX] [BP]
Bài giảng ASM
60
ĐỊA CHỈ HIỆU DỤNG (tt)
Địa chỉ hiệu dụng chính là phần offset của địa chỉ luận lý bộ nhớ.
Segment của địa chỉ hiệu dụng được mặc định như sau :
nếu không sử dụng BP trong địa chỉ hiệu dụng thì mặc định theo DS.
nếu có sử dụng BP trong địa chỉ hiệu dụng thì mặc định theo ES.

Bài giảng ASM
61
Địa chỉ hiệu dụng (tt)
Qui ước
Để thuận tiện trong vấn đề giải thích lệnh, ta qui ước sau :
Dữ liệu 8 bit bộ nhớ : [ địa chỉ ]
Dữ liệu 16 bit bộ nhớ : [ địa chỉ +1, địa chỉ ]
Để xác định rõ hoạt động của bộ nhớ , ta phải dùng thêm toán tử PTR như sau :
8 bit : BYTE PTR [1000H]
Tham khảo 1 byte bộ nhớ ở địa chỉ 1000h
16 bit : WORD PTR [1000H]
Tham khảo 2 byte bộ nhớ liên tiếp ở địa chỉ 1000h và 1001h
Bài giảng ASM
62
Ex : Tính tổng 1 array có 5 phần tử
MOV BX, OFFSET LIST
MOV AX, 0
MOV AL, [BX]
ADD AL , [BX+1]
ADD AL , [BX+2]
ADD AL , [BX+3]
ADD AL , [BX+4]
MOV SUM , AX
………
LIST DB 10h, 20h, 40h, 2h, 5h
SUM DW 0
Cách thực hiện :
Lấy địa chỉ của List vào BX
Dựa vào BX để xác định các phần tử của array.
Khi tính tổng xong, đưa tổng vào biến SUM.
Bài giảng ASM
63
Ex : Tính tổng 1 array có 5 phần tử
A 100
MOV BX, 0120
MOV AX, 0
MOV AL, [BX]
ADD AL , [BX+1]
ADD AL , [BX+2]
ADD AL , [BX+3]
ADD AL , [BX+4]
MOV [0125], AX
-A 120
DB 10, 20, 40, 2, 5
DW 0

CHẠY CT này bằng DEBUG
Bài giảng ASM
64
Tập lệnh
Lệnh MOV :
Ý nghĩa : copy giá trị từ toán hạng nguồn ? toán hạng đích
Cú pháp : MOV dest , source
Yêu cầu : Dest và source cùng kiểu
Dạng lệnh :
MOV reg , reg
MOV mem , reg
MOV reg, mem
MOV reg16, segreg
MOV segreg, reg16
MOV reg, immed
MOV mem, immed
MOV mem16, segreg
MOV segreg, mem16
Bài giảng ASM
65
Minh hoạ lệnh MOV
MOV AX, CX
MOV DL, BH
MOV [SI+1000h], BP ; [SI+1000h, SI+1001h] BP
MOV DX, [1000h] ; DX [1000h, 1001h]
MOV DI, 12h
MOV AL, 12h
MOV BYTE PTR [1000h], 12h
MOV WORD PTR [2000h] , 1200h
MOV [BX] , DS
MOV SS, [2000h]
Bài giảng ASM
66
Lệnh MOV không làm ảnh hưởng đến cờ.
Không thể chuyển dữ liệu trực tiếp giữa 2 toán hạng bộ nhớ với nhau, muốn chuyển phải dùng thanh ghi trung gian.
Không thể chuyển 1 giá trị tức thời vào thanh ghi đoạn, muốn chuyển phải dùng thanh ghi trung gian.
Không thể chuyển trực tiếp giữa 2 thanh ghi đoạn
Chú ý
Bài giảng ASM
67
Minh họa lệnh MOV
Ex1 : Cho table là 1 mảng gồm 10 phần tử dạng byte
Table DB 3,5,6,9,10, 29,30,46,45,90
Truy xuất phần tử đầu , phần tử thứ 2 và thứ 5 của mảng:
MOV AL, TABLE hay MOV AL, TABLE[0]
MOV AL, TABLE+1 hay MOV AL, TABLE[1]
MOV AL, TABLE+4 hay MOV AL, TABLE[4]
Bài giảng ASM
68
Minh họa lệnh MOV
Ex2 : MOV AX, DS : [100h]
Ex3 : MOV AX, [100h]
; chuyển N?I DUNG Ơ NH? 100h vào Reg AX.

; chép nội dung 16 bit tại địa chỉ
100h trong đoạn chỉ bởi DS vào Reg AX.
Bài giảng ASM
69
Áp dụng
Viết chương trình chuyển nội dung vùng nhớ bắt đầu tại địa chỉ 700h
sang vùng nhớ có địa chỉ bắt đầu là 1000h. Biết chiều mỗi vùng
nhớ là 9 bytes và dữ liệu đang khảo sát trong đoạn được chỉ bởi DS.
Cho vùng nhớ MEM có chiều dài 9 bytes gồm các ký tự `abcdefghi`
trong đoạn chỉ bởi DS.
Viết chương trình đảo ngược vùng nhớ MEM.
Bài giảng ASM
70
Lệnh LEA (Load Effective Address)
Cú pháp : LEA REG | MEM
ý nghĩa : nạp địa chỉ Offset vào thanh ghi để khởi động Reg.
Ex : MOV DX, OFFSET MES
Tương đương với LEA DX, MES
Ex : LEA BX, [1000h] ; BX 1000h
LEA SI, [DI][BX][2000h] ; SI DI + BX + 2000h
Bài giảng ASM
71
Lệnh XCHG (XCHANGE)
Cú pháp : XCHG DEST , SOURCE
ý nghĩa : hoán chuyển nội dung 2 Reg, Reg và ô nhớ
Yêu cầu :
2 toán hạng phải cùng kiểu
2 toán hạng không thể là 2 biến bộ nhớ. Muốn hoán
đổi trị của 2 biến phải dùng Reg trung gian.
Ex : XCHG AH, BL
MOV VAR1, VAR2 ; không hợp lệ, phải dùng Reg tạm
Bài giảng ASM
72
Lệnh PUSH
Cú pháp : PUSH REG16
PUSH MEM16
PUSH SEGREG
Đẩy toán hạng nguồn 16 bit vào STACK
Ex : PUSH DI ; [SS :SP+1, SS :SP] DI
Ex : PUSH CS ; [SS :SP+1, SS :SP] CS
Bài giảng ASM
73
Lệnh POP
Cú pháp : POP REG16
POP MEM16
POP SEGREG
Lấy dữ liệu từ đỉnh STACK vào toán hạng địch.
Ex : POP AX ; AX [SS :SP+1, SS :SP]
Ex : POP [BX+1] ; [BX+2, BX+1] [SS :SP+1, SS :SP]
Bài giảng ASM
74
Lệnh IN
Cú pháp : IN ACCUM, IMMED8
IN ACCUM, DX
nhập dữ liệu từ cổng xuất nhập vào thanh ghi tích luỹ AL
hay AX. Trường hợp AX sẽ nhập byte thấp trước, byte cao sau.
Ex : IN AL ,61h
IN AX, 40h
Dạng lệnh có Reg DX dùng
Để cho cổng có địa chỉ 16 bit
Ex : MOV DX, 378H
IN AL, DX
Bài giảng ASM
75
SUMMARY
Dùng DEBUG để hợp dịch và chạy chương trình sau :
Chép 3 số nguyên kiểu Word ở địa chỉ 0120h vào địa chỉ 0130h.
Cho biết giá trị của AX sau khi các lệnh sau được thực thi :

MOV AX, ARRAY1
INC AX
ADD AH, 1
SUB AX, ARRAY1
..
ARRAY1 DW 10h, 20h

Bài giảng ASM
76
SUMMARY
Gi? sử biến VAL1 ở địa chỉ offset 0120h và PTR1 ở địa chỉ 0122h. Cho biết giá trị của các thanh ghi AX, BX khi mỗi lệnh sau được thực thi :
.CODE
MOV AX, @DATA
MOV DS, AX
MOV AX, 0
MOV AL, BYTE PTR VAL1 ; AX = ?
MOV BX, PTR1 ; BX = ?
XCHG AX, BX ; BX = ?
SUB AL,2 ; AX = ?
MOV AX, PTR2 ; AX = ?
.DATA
VAL1 DW 3Ah
PTR1 DW VAL1
PTR2 DW PTR1
Bài giảng ASM
77
Cho biết giá trị của các thanh ghi ở bên phải, khi mỗi lệnh của đoạn chương trình sau được thực thi. Giả sử FIRST ở offset 0H
MOV AL, BYTE PTR FIRST+1 ; AL =
MOV BX, WORD PTR SECOND+2 ; BX =
MOV DX, OFFSET FIRST + 2 ; DX =
MOV AX, 4C00H
INT 21H
...
FIRST DW 1234h
SECOND DW 16385
THIRD DB 10,20,30,40
Bài giảng ASM
78
Bài tập Lập trình
Bài 1 : Viết chương trình nhập 1 ký tự.
Hiển thị ký tự đứng trước và ký tự đứng sau ký tự đã nhập theo
thứ tự mã ASCII.
Kết quả có dạng :
Nhập một ký tự : B
Ký tự đứng trước : A
Ký tự đứng sau : C
Bài 2 : Viết chương trình nhập 2 ký tự và hiển thị ký tự thứ 3 có
mã ASCII là tổng của mã 2 ký tự đã nhập.
Kết quả có dạng :
Bài giảng ASM
79
Chương 9 : Cấu trúc điều khiển và Vòng lặp
Mục tiêu
Biết cách mô phỏng cấu trúc điều khiển và vòng lặp như ở ngôn ngữ lập trình cấp cao.
Nắm được các lệnh nhảy trong lập trình Assembly.
Trên cơ sở đó, vận dụng để lập trình giải quyết 1 số bài toán.
Bài giảng ASM
80
Nội dung
Sự cần thiết của lệnh nhảy trong lập trình ASM.
Lệnh JMP (Jump) : nhảy không điều kiện.
Lệnh LOOP : cho phép lặp 1 công việc với 1 số lần nào đó.
Các lệnh so sánh và luận lý.
Lệnh lặp có điều kiện.
Lệnh nhảy có điều kiện.
Biểu diễn mô phỏng cấu trúc luận lý mức cao.
Chương trình con.
Một số chương trình minh họa.
Bài giảng ASM
81
Sự cần thiết của lệnh nhảy
Ở các chương trình viết bằng ngôn ngữ cấp cao thì việc nhảy (lệnh GoTo) là điều nên tránh nhưng ở lập trình hệ thống thì đây là việc cần thiết và là điểm mạnh của 1 chương trình viết bằng Assembly.
Một lệnh nhảy ? CPU phải thực thi 1 đoạn lệnh ở 1 chỗ khác với nơi mà các lệnh đang được thực thi.
Trong lập trình, có những nhóm phát biểu cần phải lặp đi lặp lại nhiều lần trong 1 điều kiện nào đó. Để đáp ứng điều kiện này ASM cung cấp 2 lệnh JMP và LOOP.
Bài giảng ASM
82
Lệnh JMP (Jump)
Công dụng :Chuyển điều khiển không điều kiện.
Nhảy gần (NEAR) : 1 tác vụ nhảy trong cùng 1 segment.
Nhảy xa (FAR) : 1 tác vụ nhảy sang segment khác.
Cú pháp : JMP đích
Bài giảng ASM
83
Cac� lệnh chuyển điều khiển
Chuyển điều khiển vô điều kiện
Chuyển điều khiển có điều kiện
JMP [ SORT | NEAR PTR |FAR PTR ] DEST
JConditional destination
Ex : JNZ nhãn đích ;
Bài giảng ASM
84
LỆNH LOOP
Công dụng : cho phép lặp 1 công việc với 1 số lần nào đó.
Mỗi lần lặp CX giảm đi 1 đơn vị. Vòng lặp chấm dứt khi CX =0.
Ex 1 : xuất ra màn hình 12 dòng gồm các ký tự A.
MOV CX, 12 * 80
MOV DL, `A`
NEXT :
MOV AH, 2
INT 21H
LOOP NEXT
Bài giảng ASM
85
LOOP (tt)
Ex : có 1 Array A gồm 6 bytes, chép A sang array B - dùng SI và DI để lấy Offset
MOV SI, OFFSET A
MOV DI, OFFSET B
MOV CX, 6
MOVE_BYTE :
MOV AL, [SI]
MOV [DI], AL
INC SI
INC DI
LOOP MOVE_BYTE
A DB 10H,20H,30H,40H,50H,60H
B DB 6 DUP (?)
Bài giảng ASM
86
CÁC LỆNH LUẬN LÝ
Lưu ý về các toán tử LOGIC :
AND 2 Bit : kết quả là 1 khi và chỉ khi 2 bit là 1
OR 2 Bit : kết quả là 1 khi 2 Bit có bit là 1
XOR 2 Bit : kết quả là 1 chỉ khi 2 bit khác nhau
NOT 1 Bit : lấy đảo của Bit này
Lưu ý về thanh ghi cờ :
Cờ ZERO được lập khi tác vụ cho kết quả là 0.
Cờ CARRY được lập khi cộng kết quả bị tràn hay trừ phải mượn.
Cờ SIGN được lập khi bit dấu của kết quả là 1, tức kết quả là số âm.
Bài giảng ASM
87
Lệnh AND
Công dụng :
Lệnh này thực hiện phép AND giữa 2 toán hạng, kết quả cuối cùng chứa trong toán hạng đích.
Dùng để xóa các bit nhất định của toán hạng đích giữ nguyên các bit còn lại.
Cú pháp : AND Destination , Source
Muốn vậy ta dùng 1 mẫu bit gọi là mặt nạ bit (MASK), các bit mặt nạ được chọn để sao cho các bit tương ứng của đích được thay đổi như mong muốn.
Bài giảng ASM
88
Lệnh AND
Ex1 : xoá bit dấu của AL, giữ nguyên các bit còn lại :
dùng AND với 01111111b làm mặt nạ
AND AL, 7FH
Ex2 :
MOV AL, `5` ; Đổi mã ASCII của số
AND AL, 0FH ; thành số tương ứng.
Ex3 :
MOV DL, `a` ; Đổi chữ thường thành chữ hoa.
AND DL, 0DFH ; thành số tương ứng.
Mask bits
Mask bits
Bài giảng ASM
89
LỆNH OR
Công dụng : dùng để bật lên 1 số bit và giữ nguyên các bit khác.
Cú pháp : OR destination, source
Ex1 :
OR AL , 10000001b ; bật bit cao nhất và bit thấp nhất trong thanh ghi AL lên 1
Ex 2:
MOV AL , 5 ; đổi 0..9 thành ký số
OR AL , 30h ; ASCII tương ứng.
Ex 3:
OR AL , AL ; kiểm tra một thanh ghi có = 0.
Nếu : cờ ZF được lập ? AL =0
cờ SIGN được lập ? AL <0
cờ ZR và cờ SIGN không được lập ? AL >0
Bài giảng ASM
90
Việc xoá 1 thanh ghi
Ta có 3 cách để xoá 1 thanh ghi :
C1: MOV AX , 0
C2 : SUB AX, AX
C3 : XOR AX, AX
Mã lệnh 2 và 3 dài 2 bytes
Mã lệnh 1 dài 3 bytes
? Lệnh 2,3 hiệu quả hơn
Tuy nhiên các thao tác giữa ô nhớ và ô nhớ là không hợp lệ nên khi cần xoá 1 ô nhớ ta phải dùng lệnh 1 .
Bài giảng ASM
91
LỆNH XOR
Công dụng : dùng để tạo đồ họa màu tốc độ cao.
Cú pháp : XOR destination, source
Ex : lật bit cao của AL 2 lần
MOV AL , 00111011b ;
XOR AL, 11111111b ; AL = 11000100b
XOR AL, 11111111b ; AL = 00111011b
Bài giảng ASM
92
LỆNH TEST
Cú pháp : TEST destination, source
Ex : kiểm tra bit 13 trong DX là 0 hay 1
TEST DX, 2000h
JZ BitIs0
BitIs1 : bit 13 is 1
BitIs0 : bit 13 is 0
Để kiểm tra 1 bit nào đó chỉ cần đặt bit 1 vào đúng vị trí bit cần kiểm tra và khảo sát cờ ZF. (nếu bit kiểm là 1 thì ZF sẽ xoá, ngược lại ZF được lập.
Công dụng : dùng để khảo sát trị của từng bit hay nhóm bit.
Test thực hiện giống lệnh AND nhưng không làm thay đổi toán hạng đích.
Bài giảng ASM
93
MINH HỌA LỆNH TEST
MOV AH, 2
INT 17h
TEST AL , 00100000b ; Test bit 5, nếu bit 5 = 1? máy in hết giấy.
Ex : kiểm tra trạng thái máy in. Interrupt 17H trong BIOS sẽ kiểm tra trạng thái máy in, sau khi kiểm tra AL sẽ chứa trạng thái máy in. Khi bit 5 của AL là 1 thì máy in hết giấy.
Lệnh TEST cho phép test nhiều bit 1 lượt.
Bài giảng ASM
94
MINH HỌA LỆNH TEST(tt)
TEST AL, 1 ; AL chứa số chẳn ?
JZ A1 ; nếu đúng nhảy đến A1.
Ex :viết đoạn lệnh thực hiện lệnh nhảy đến nhãn A1 nếu AL chứa số chẵn.
Bài giảng ASM
95
Lệnh CMP
Cú pháp : CMP destination , source
Công dụng : so sánh toán hạng đích với toán hạng nguồn bằng cách lấy toán hạng đích - toán hạng nguồn.
Hoạt động : dùng phép trừ nhưng không có toán hạng đích nào bị thay đổi.
Các toán hạng của lệnh CMP không thể cùng là các ô nhớ.
lệnh CMP giống hệt lệnh SUB trừ việc toán hạng đích không thay đổi.
Bài giảng ASM
96
LỆNH NHẢY CÓ ĐIỀU KIỆN
Cú pháp : Jconditional destination
Công dụng : nhờ các lệnh nhảy có điều kiện, ta mới mô phỏng được các phát biểu có cấu trúc của ngôn ngữ cấp cao bằng Assembly.
Phạm vi
Chỉ nhảy đến nhãn có khoảng cách từ -128 đến +127 byte so với
vị trí hiện hành.
Dùng các trạng thái cờ để quyết định có nhảy hay không?
Bài giảng ASM
97
LỆNH NHẢY CÓ ĐIỀU KIỆN
Hoạt động
để thực hiện 1 lệnh nhảy CPU nhìn vào các thanh ghi cờ.
nếu điều kiện của lệnh nhảy thỏa, CPU sẽ điều chỉnh IP trỏ đến
nhãn đích các lệnh sau nhãn này sẽ được thực hiện.
.....
MOV AH, 2
MOV CX, 26
MOV DL, 41H
PRINT_LOOP :
INT 21H
INC DL
DEC CX
JNZ PRINT_LOOP
MOV AX, 4C00H
INT 21H
Bài giảng ASM
98
LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TOÁN HẠNG KHÔNG DẤU.
Thường dùng lệnh CMP Opt1 , Opt2 để xét điều kiện nhảy hoặc dựa trên các cờ.
Bài giảng ASM
99
LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH
CÁC TOÁN HẠNG KHÔNG DẤU (ctn) .
Bài giảng ASM
100
LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH
CÁC TOÁN HẠNG CÓ DẤU .
Bài giảng ASM
101
LỆNH NHẢY DỰA TRÊN CÁC CỜ .
Bài giảng ASM
102
CÁC VỊ DỤ MINH HỌA LỆNH NHẢY CÓ ĐK
Ex1 : tìm số lớn hơn trong 2 số chứa trong thanh ghi AX và BX . Kết quả để trong DX
; giả sử AX là số lớn hơn.
; IF AX >=BX then
; nhảy đến QUIT
; ngược lại chép BX vào DX
MOV DX, AX
CMP DX, BX
JAE QUIT
MOV DX, BX
QUIT :
MOV AH,4CH
INT 21H
....
Bài giảng ASM
103
CÁC VÍ DỤ MINH HỌA LỆNH NHẢY CÓ ĐK
Ex1 : tìm số nhỏ nhất trong 3 số chứa trong thanh ghi AL� BL và CL . Kết quả để trong biến SMALL
MOV SMALL, AL
CMP SMALL, BL
JBE L1
MOV SMALL, BL
L1 :
CMP SMALL, CL
JBE L2
MOV SMALL, CL
L2 : . . .
; giả sử AL nhỏ nhất
; nếu SMALL <= BL thì
Nhảy đến L1
; nếu SMALL <= CL thì
; Nhảy đến L2
; CL là số nhỏ nhất
Bài giảng ASM
104
Các lệnh dịch và quay bit
SHL (Shift Left) : dịch các bit của toán hạng đích sang trái
Cú pháp : SHL toán hạng đích ,1
Dịch 1 vị trí.
Cú pháp : SHL toán hạng đích ,CL
Dịch n vị trí trong đó CL chứa số bit cần dịch.
Hoạt động : một giá trị 0 sẽ được đưa vào vị trí bên phải nhất của toán hạng đích, còn bit msb của nó được đưa vào cờ CF
Bài giảng ASM
105
Các lệnh dịch và quay bit
Ex : DH chứa 8Ah, CL chứa 3.
SHL DH, CL ; 01010000b
? Cho biết kết quả của :
SHL 1111b, 3
MT thực hiện phép nhân bằng
dịch trái
Bài giảng ASM
106
lệnh dịch phải SHR
Công dụng : dịch các bit của toán hạng đích sang bên phải.
Cú pháp : SHR toán hạng đích , 1
MT thực hiện phép chia bằng
dịch phải
Hoạt động : 1 giá trị 0 sẽ được đưa vào bit msb của toán hạng đích, còn bit bên phải nhất sẽ được đưa vào cờ CF.
SHR toán hạng đích , CL ; dịch phải n bit trong đó CL chứa n
Bài giảng ASM
107
lệnh dịch phải SHR
Ex : shr 0100b, 1 ; 0010b = 2
Đối với các số lẻ, dịch phải sẽ chia đôi nó và làm tròn xuống số nguyên gần nhất.
Ex : shr 0101b, 1 ; 0010b = 2
Bài giảng ASM
108
Các phép nhân và chia tổng quát
Việc nhân và chia cho các số lũy thừa của 2 có thể thực hiện bằng lệnh dịch trái và dịch phải.
Để nhân và chia cho các số bất kỳ ta có thể kết hợp lệnh dịch và cộng.
Ex : nhân 2 số nguyên dương A và B bằng lệnh cộng và dịch bit.
Giả sử A = 111b và B = 1101b. Tính A*B
Bài giảng ASM
109
Các phép nhân và chia tổng quát
Thuật toán :
Tích = 0
Repeat
If bit Lsb của B bằng 1 Then
tích = tích + A
End If
Dịch trái A
Dịch phải B
Until B =0
Bài giảng ASM
110
Các phép nhân và chia tổng quát
Vì bit lsb của B = 1
tích = tích +A = 111b
Dịch trái A : 1110b
Dịch phải B : 110b
Vì bit lsb của B = 0
Dịch trái A : 11100b
Dịch phải B : 11b
Vì bit lsb của B = 1
Tích =tích + A = 100011b
Dịch trái A : 111000b
Dịch phải B : 1b
Vì bit lsb của B =1
Tích = 100011b+111000b= 1011011b
Dịch trái A : 1110000b
Dịch phải B : 0b
Vì bit lsb của B = 0
Tích = 1011011b = 91d
Giả sử A = 111b và B = 1101b. Tính A*B
Bài giảng ASM
111
Chương trình con
Có vai trò giống như chương trình con ở ngôn ngữ cấp cao.
ASM có 2 dạng chương trình con : dạng FAR và dạng NEAR.
Lệnh gọi CTC nằm khác đoạn bộ nhớ với CTC được gọi
Lệnh gọi CTC nằm cùng đoạn bộ nhớ với CTC được gọi
Bài giảng ASM
112
BIỂU DIỄN CẤU TRÚC LOGIC MỨC CAO
Dù Assembly không có phát biểu IF, ELSE, WHILE, REPEAT, UNTIL,FOR,CASE nhưng ta vẫn có thể tổ hợp các lệnh của Assembly để hiện thực cấu trúc logic của ngôn ngữ cấp cao.
Bài giảng ASM
113
Cấu trúc IF
Đơn giản
Phát biểu IF sẽ kiểm tra 1 điều kiện và theo sau đó là 1 số các phát biểu được thực thi khi điều kiện kiểm tra có giá trị true.
Cấu trúc logic

IF (OP1=OP2)


ENDIF

HIỆN THỰC BẰNG ASM

CMP OP1,OP2
JNE CONTINUE


CONTINUE : ..
Bài giảng ASM
114
Cấu trúc IF
với OR
Phát biểu IF có kèm toán tử OR
Cấu trúc logic

IF (A1>OP1) OR
(A1>=OP2) OR
(A1=OP3) OR
(A1
ENDIF

HIỆN THỰC BẰNG ASM

CMP A1,OP1
JG EXCUTE
CMP A1,OP2
JGE EXCUTE
CMP A1,OP3
JE EXCUTE
CMP A1,OP4
JL EXCUTE
JMP CONTINUE
EXCUTE :
CONTINUE : ...
Bài giảng ASM
115
Cấu trúc IF
với AND
Phát biểu IF có kèm toán tử AND
Cấu trúc logic

IF (A1>OP1) AND
(A1>=OP2) AND
(A1=OP3) AND
(A1
ENDIF

HIỆN THỰC BẰNG ASM

CMP A1,OP1
JNG CONTINUE
CMP A1,OP2
JL CONTINUE
CMP A1,OP3
JNE CONTINUE
CMP A1,OP4
JNL CONTINUE

JMP CONTINUE
CONTINUE : ...
CHÚ Ý : khi điều kiện có toán tử AND, cách hay nhất là dùng nhảy với điều kiện ngược lại đến nhãn, bỏ qua phát biểu trong cấu trúc Logic.
Bài giảng ASM
116
Cấu trúc WHILE
VÒNG LẶP WHILE
Cấu trúc logic

DO WHILE (OP1

ENDDO

HIỆN THỰC BẰNG ASM
DO_WHILE :
CMP OP1, OP2
JNL ENDDO


JMP DO_WHILE
ENDDO : ...
Bài giảng ASM
117
Cấu trúc WHILE
có lồng IF
VÒNG LẶP WHILE CÓ LỒNG IF
Cấu trúc logic

DO WHILE (OP1
IF (OP2=OP3) THEN


ENDIF
ENDDO

HIỆN THỰC BẰNG ASM
_WHILE :
CMP OP1, OP2
JNL WHILE_EXIT

CMP OP2,OP3 ; phần If
JNE ELSE ; không thỏa If
; thỏa If

JMP ENDIF; thỏa If nên
bỏ qua Else
ELSE :
ENDIF : JMP _WHILE
WHILE_EXIT : ...
Bài giảng ASM
118
Cấu trúc REPEAT
UNTIL
VÒNG LẶP REPEAT UNTIL
Cấu trúc logic
REPEAT



UNTIL (OP1=OP2) OR
(OP1>OP3)


HIỆN THỰC BẰNG ASM
REPEAT :



TESTOP12:
CMP OP1, OP2
JE ENDREPEAT
TESTOP13 :
CMP OP1, OP3
JNG REPEAT
ENDREPEAT : ...
Bằng nhau
thoát Repeat
Bài giảng ASM
119
Cấu trúc CASE
Cấu trúc logic
CASE INPUT OF
`A` : Proc_A
`B` : Proc_B
`C` : Proc_C
`D` : Proc_D
End ;


HIỆN THỰC BẰNG ASM
CASE : MOV AL, INPUT
CMP AL, `A`
JNE TESTB
CALL PROC_A
JMP ENDCASE
TESTB :
CMP AL, `B`
JNE TESTC
CALL PROC_B
JMP ENDCASE
TESTC :
CMP AL, `C`
JNE TESTD
CALL PROC_C
JMP ENDCASE
TESTD : CMP AL, `D`
JNE ENDCASE
CALL PROC_D
ENDCASE : ....
Bài giảng ASM
120
LooKup Table
Rất hiệu quả khi xử lý phát biểu CASE là dùng bảng OFFSET chứa địa chỉ của nhãn hoặc của hàm sẽ nhảy đến tuỳ vào điều kiện.
Bảng Offset này được gọi Lookup Table rất hiệu quả khi dùng phát biểu Case có nhiều trị lựa chọn.
Bài giảng ASM
121
LooKup Table
; giá trị tìm kiếm
Địa chỉ các procedure giả sử ở địa chỉ 0120

giả sử ở địa chỉ 0130
giả sử ở địa chỉ 0140

giả sử ở địa chỉ 0150
Case_table db `A`
Dw Proc_A
Db `B`
Dw Proc_B
Db `C`
Dw Proc_C
Db `D`
Dw Proc_D
Cấu trúc lưu trữ của CaseTable như sau
Bài giảng ASM
122
LooKup Table
Case :
MOV AL, INPUT
MOV BX, OFFSET CASE_TABLE
MOV CX, 4 ; lặp 4 lần số entry của table
TEST :
CMP AL, [BX] ; kiểm tra Input
JNE TESTAGAIN ; không thỏa kiểm tra tiếp
CALL WORD PTR [BX+1] ; gọi thủ tục tương ứng
JMP ENDCASE
TESTAGAIN : ADD BX , 3 ; sang entry sau của CaseTable
LOOP TEST
ENDCASE : ......
Bài giảng ASM
123
Chương trình con
Cấu trúc CTC :
TênCTC PROC
; các lệnh
RET
TênCTC ENDP
CTC có thể gọi 1 CTC khác hoặc gọi chính nó.
CTC được gọi bằng lệnh CALL .
CTC gần (near) là chương trình con nằm chung segment với nơi gọi nó.
CTC xa (far) là chương trình con không nằm chung segment với nơi gọi nó.
Bài giảng ASM
124
Kỹ thuật lập trình
Hãy tổ chức chương trình ? các chương trình con ? đơn giản hoá cấu trúc luận lý của CT làm cho CT dễ đọc, dễ hiểu , dễ kiểm tra sai sót..
Đầu CTC hãy cất trị thanh ghi vào Stack bằng lệnh PUSH để lưu trạng thái hiện hành.
Sau khi hoàn tất công việc của CTC nên phục hồi lại trị các thanh ghi lúc trước đã Push bằng lệnh POP .
Nhớ trình tự là ngược nhau để trị của thanh ghi nào trả cho thanh ghi nấy.
Đừng tối ưu quá CT vì có thể làm cho CT kém thông minh, khó đọc.
Bài giảng ASM
125
Kỹ thuật lập trình (tt)
Cố gắng tổ chức chương trình cho tốt ? phải thiết kế được các bước chương trình sẽ phải thực hiện.
Bằng sự tổ hợp của lệnh nhảy ta hoàn toàn có thể mô phỏng cấu trúc điều khiển và vòng lặp.
Kinh nghiệm : khi vấn đề càng lớn thì càng phải tổ chức logic chương trình càng chặt chẽ.
Bài giảng ASM
126
SUMMARY
Có thể mô phỏng cấu trúc logic như ngôn ngữ cấp cao trong Assembly bằng lệnh JMP và LOOP.
các lệnh nhảy : có điều kiện và vô điều kiện.
Khi gặp lệnh nhảy, CPU sẽ quyết định nhảy hay không bằng cách dựa vào giá trị thanh ghi cờ.
các lệnh luận lý dùng để làm điều kiện nhảy là AND, OR, XOR, CMP . . .
Bất cứ khi nào có thể, hãy tổ chức chương trình thành các chương trình con ? đơn giản được cấu trúc luận lý của chương trình.
Bài giảng ASM
127
Câu hỏi
Giả sử DI = 2000H, [DS:2000] = 0200H. Cho biết địa chỉ ô nhớ toán hạng nguồn và kết quả lưu trong toán hạng đích khi thực hiện lệnh MOV DI, [DI]
Giả sử SI = 1500H, DI=2000H, [DS:2000]=0150H . Cho biết địa chỉ ô nhớ toán hạng nguồn và kết quả lưu trong toán hạng đích sau khi thực hiện lệnh ADD AX, [DI]
Có khai báo A DB 1,2,3
Cho biết trị của toán hạng đích sau khi thi hành lệnh MOV AH, BYTE PTR A.
Có khai báo B DB 4,5,6
Cho biết trị của toán hạng đích sau khi thi hành lệnh MOV AX, WORD PTR B.




Bài giảng ASM
128
Bài 1 : Có vùng nhớ VAR1 dài 200 bytes trong đoạn được chỉ bởi DS.
Viết chương trình đếm số chữ `S` trong vùng nhớ này.
Bài 2 : Có vùng nhớ VAR2 dài 1000 bytes. Viết chương trình chuyển đổi các chữ thường trong vùng nhớ này thành các ký tự hoa, các ký tự còn lại không đổi.
Bài 3 : Viết chương trình nhập 2 số nhỏ hơn 10.
In ra tổng của 2 số đó.
Bài tập LẬP TRÌNH
Bài giảng ASM
129
Bài 4 : Viết chương trình nhập 2 số bất kỳ.
In ra tổng và tích của 2 số đó. Chương trình có dạng sau :
Nhập số 1 : 12
Nhập số 2 : 28
Tổng là : 40
T
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...

Người chia sẻ: Nguyễn Tuấn
Dung lượng: | Lượt tài: 1
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)