Bài giảng Assembler: Bài 3 do GV. ThS. Phạm Nguyên Văn trình bày, gồm các nội dung về mô hình bộ nhớ, toán tử và biểu thức, các toán tử type và size, lệnh enum của borland tasm và lệnh jmp và loop. Chúc bạn học tốt.
AMBIENT/
Chủ đề:
Nội dung Text: Bài giảng Assembler: Bài 3 - GV.ThS. Phạm Nguyên Văn
- GV: Ths. Phạm Nguyên Văn
- Lệnh .model lựa chọn mô hình bộ nhớ.
Tiny: Mã và DL phối hợp < 64K.
Small: Mã
- Biểu thức là tổ hợp các toán tử và toán hạng được
trình biên dịch chuyển thành một giá trị đơn lẻ.
3
- 1000h * 50h ; = 50000h
-4 + 2 ; = -6
count + 2 ; số đếm là 1 hằng
31 MOD 6 ; = 1
6 / 4 ;=1
‘2’ – 30h ; = 2(do giá trị của ‘2’ = 32h)
4
- Toán tử Cấp Mô tả
() 1 Dấu ngoặc đơn
+,- 2 Dương và Âm (đơn tử)
*, /, mod 3 nhân, chia, lấy phần dư
+,- 4 Cộng, trừ
5
- OFFSET trả về vị trí của 1 nhãn và biến từ đầu
phân đoạn của nó. Toán hạng đích phải là 1 thanh
ghi 16bit:
VD: mov bx, offset count ; BX trỏ đến count
offset có thể được chuyển đến 1 thanh ghi chỉ mục
hoặc cơ số. Trong ví dụ sau, bList mặc định nằm
tại offset 0000:
6
- .data
bList db 10h, 20h, 30h, 40h
wList dw 1000h, 2000h, 3000h
.code
mov di, offset bList ; dl = 0000
mov bx, offset bList + 1 ; bx = 0001
mov si, offset wList+2 ; si = 0006
7
- Toán tử SEG trả về phần phân đoạn của 1 nhãn
hoặc địa chỉ của biến. Thường được dùng khi biến
nằm trong 1 phân đoạn khác với phân đoạn hiện do
DS trỏ đến
VD: đẩy [push] giá trị hiện thời của DS lên stack,
ấn định DS theo phân đoạn chứa array, và sau đó
phục hồi DS theo giá trị ban đầu của nó
8
- push ds ; lưu DS
mov ax,seg array ; ấn định ds theo phân đoạn của
mảng
mov ds, ax
mov bx, offset array ; tìm độ dịch vị mảng
… ;xử lý mảng
pop ds ; phục hồi ds
9
- PTR: chạy đè lên kích cỡ ngầm định của một
toán hạng.
Phát biểu rõ kích cỡ của toán hạng.
Phải được kết hợp với các kiểu dữ liệu chuẩn:
BYTE, SBYTE, WORD, DWORD,
SDWORD, FWORD, QWORD, TBYTE.
VD:
mov al,byte ptr count
mov ax, word ptr newVal
mov eax,dword ptr listPointer
10
- Do kích cỡ của toán hạng không được rõ ràng xét
theo ngữ cảnh 1 lệnh. VD:
inc [bx] ; toán hạng gián tiếp
báo lỗi do không biết bx chứa byte hay word
inc byte ptr [bx]: xác định rõ kích cỡ của toán hạng
là byte
Có thể chạy đè kích cỡ ngầm định của toán hạng.
11
- Vd: ta có từ kép 32bit, muốn nạp từ cao vào
DX, từ thấp vào AX:
.data
val32 dd ?
.code
mov ax, val32 ; có từ thấp (error)
mov dx, val32+2 ; có từ cao (error)
Sửa lại:
mov ax, word ptr val32 ; AX = 1234h
mov dx, word ptr val32+2 ; DX = 5678h
12
- LABEL: chèn 1 nhãn và gán cho nó 1 thuộc
tính kích cỡ, mà không phân bổ bộ nhớ.
VD: khai báo 1 nhãn trước khi val32 gọi val16,
và gán thuộc tính word:
.data
val16 label word
val32 dd 12345678h
.code
mov ax,val16
mov dx,val32
13
- EVEN và EVENDATA: căn thẳng hàng lệnh
kế tiếp trong đoạn mã theo offset 16bit đều.
Vd: 1 lệnh NOP 1-byte (90h) được chèn vào
mã đã biên dịch nơi even xuất hiện. Lệnh tiếp
theo nằm tại 0006:
0000 mov ax,@data
0003 mov ds, ax
0005 even ; byte chứa 90h được chèn ở
đây
0006 mov bx, offset array
14
- Tương tự với evendata, chèn 1 byte rỗng (0) vào
trước array:
0000 .data
0000 str1 db 3 dup(‘X’)
0003 evendata
0004 array dw 10 dup(0FFFFh)
15
- Toán tử SHORT:
thường sử dụng với JMP khi thực hiện nhảy ngắn
khoảng
- .data
var1 db 20h
var2 dw 1000h
var3 dd ?
var4 db 10,20,30,40,50
msg db ‘File not found’,0
.code
L1: mov ax,type var1 ;ax = 0001
mov ax,type var2 ;ax = 0002
mov ax,type var3 ;ax = 0004
mov ax,type var4 ;ax = 0001
mov ax,type msg ;ax = 0001
mov ax,type L1 ;ax = FFFF
17
- Toán tử length: đếm số lượng các thành phần riêng
lẻ trong 1 biến được định nghĩa bằng dup.
Nếu không dùng dup, length = 1.
Nếu dùng dup lồng ghép, chỉ toán tử phía ngoài
mới được đếm.
18
- .data
val1 dw 1000h
val2 db 10,20,30
array dw 32 dup(0)
array2 dw 5 dup(3 dup(0))
message db ‘File not found’,0
.code
mov ax,length val1 ; = 1
mov ax,length val2 ; = 1
mov ax,length array; = 32
mov ax,length array2 ;=5
mov ax,length message ;=1
19
- Toán tử SIZE: = length * type của 1 biến.
intArray dw 32 dup(0) ; SIZE = 64
20