ASSEMBLER 3
Chia sẻ bởi Đỗ Quang Huy |
Ngày 19/03/2024 |
8
Chia sẻ tài liệu: ASSEMBLER 3 thuộc Công nghệ thông tin
Nội dung tài liệu:
Assembler 3
GV: Ths. Phạm Nguyên Văn
2
I. Mô hình bộ nhớ
Lệnh .model lựa chọn mô hình bộ nhớ.
Tiny: Mã và DL phối hợp < 64K.
Small: Mã <=64K, DL <= 64K. Một phân đoạn mã, 1 phân đoạn dữ liệu.
Medium: Dữ liệu <= 64K, mã có kích cỡ bất kỳ. Nhiều phân đoạn mã, 1 phân đoạn dữ liệu.
Compact: Mã <= 64K, dữ liệu kích cỡ bất kỳ. Một đoạn mã, nhiều phân đoạn dữ liệu.
Large: Mã > 64K, dữ liệu > 64K. Nhiều phân đoạn mã và dữ liệu.
Huge: giống như Large, ngoại trừ các biến riêng lẻ như các mảng có thể > 64K.
Flat: Không có phân đoạn nào. Các địa chỉ 32bit được dùng cho cả mã và DL. Chỉ dùng chế độ bảo vệ.
3
II. Toán tử và biểu thức
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ẻ.
4
1. Toán tử số học
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)
5
Mức ưu tiên
6
2. offset, seg, ptr, label và even
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:
7
.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
8
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ó
9
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
10
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
11
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.
12
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
13
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
14
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
15
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)
16
3. Các toán tử TYPE và SIZE
Toán tử SHORT:
thường sử dụng với JMP khi thực hiện nhảy ngắn khoảng <= 127 byte từ vị trí hiện thời. Điều này giúp trình biên dịch thực hiện 1 lệnh nhảy ngắn 1 byte thay vì 1 lệnh nhảy gần 2 byte.
Toán tử TYPE: trả về kích cỡ của 1 thành phần đơn lẻ trong 1 biến, tính theo byte.
VD: biến 8bit trả về kiểu 1, biến 32bit trả về kiểu 4, mảng byte trả về 1, mảng 16bit trả về 2. Kiểu 1 nhãn gần là FFFFh, kiểu 1 nhãn xa là FFFEh.
17
.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
18
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.
19
.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
20
Toán tử SIZE: = length * type của 1 biến.
intArray dw 32 dup(0) ; SIZE = 64
21
4. Lệnh ENUM của Borland TASM
Định nghĩa 1 dãy các hằng và gán giá trị nguyên cho từng hằng. Tất cả các ký hiệu đều được định nghĩa trên một dòng:
name enum [, symbol1[, symbol2,…[, symbol-n] ] ]
VD:
driveStatus enum ready, busy, offline
Ngầm định: ready = 0, busy = 1, offline = 2
22
Có thể sử dụng {} để định nghĩa enum trong nhiều dòng:
ColorType enum {
black, blue
green, cyan
red, magenta
brown, white }
Trình hợp dịch sẽ lựa chọn kiểu DL nhỏ nhất để lưau các hằng. VD: ColorType được gán thuộc tính byte:
.code
mov al, blue ; ok
mov ax, blue ; lỗi
23
Cách dùng: giả sử đã định nghĩa ColorType trong chương trình ngay trước lệnh .data:
.data
winColor db cyan
.code
mov al,winColor ; al = 2
hoặc:
.data
winColor ColorType cyan
24
Giá trị tường minh: mỗi hằng có thể tuỳ ý được gán một giá trị giữa 0 và 0FFFFh (nếu giá trị 0, 1, 2 không thích hợp).
VD:
StatusVals enum normal = 1, overheat = 5, highSpeed
.code
mov bl, overheat ; bl = 5
mov al, highSpeed ; al = 6
25
Nếu giá trị tường minh đã gán cho các hằng vượt quá bộ nhớ 1 byte, kiểu enum sẽ tự chuyển sang word:
StatusVals enum {
normal = 1000h, overheat = 2000h, highSpeed = 3000h }
.code
mov ax, highSpeed ;ok
mov al, overheat ; lỗi
III. So sánh
ASM so sánh 2 số bằng cách thực hiện 1 phép toán số học hoặc logic trên 2 số đó và căn cứ vào thanh ghi cờ để đưa ra kết luận. Để làm việc này có thể dùng lệnh CMP và TEST.
CMP <đích>,
TEST <đích>,
Bản chất của cmp là lệnh SUB <đích>, (đích – nguồn) nhưng kết quả của phép tính không được lưu vào toán tử đích.
VD: so sánh 2 số nguyên dương
mov ah,1
mov al, 2
cmp ah, al
Sau khi thực hiện, cờ carry (cf) bật, báo hiệu ah < al.
26
Bản chất của lệnh TEST là lệnh AND <đích>,.
VD: kiểm tra 2 bit cuối cùng của AL
TEST AL, 3; 3h = 11b
Nếu cờ Zero (ZF) bật nghĩa là 2 bit cuối của AL đều là 0.
27
28
IV. Lệnh JMP và LOOP
Được sử dụng trong các trường hợp chuyển giao điều khiển hoặc rẽ nhánh.
Chuyển giao không điều kiện: chương trình rẽ nhánh đến 1 vị trí trong tất cả các trường hợp.
Chuyển giao có điều kiện: chương trình rẽ nhánh nếu 1 đk nhất định = true.
29
1. JMP
Là lệnh nhảy không điều kiện:
JMP <đích>
Gồm các trường hợp:
JMP SHORT <đích>: khi đó mã lệnh lưu 1 byte khoảng cách (offset) giữa vị trí hiện tại và vị trí cần nhảy. Kiểu này chỉ nhảy trong phạm vi -128~+127 byte so với vị trí hiện tại.
VD:
JMP SHORT Calculate
JMP <đích>: khi đó trong mã lệnh lưu 2 byte khoảng cách giữa vị trí cần nhảy và vị trí hiện tại. Kiểu này nhảy đến bất kỳ chỗ nào.
VD:
JMP Thoat
JMP FAR PTR <đích>: nhảy tùy ý trong phạm vi segment.
VD:
JMP FAR PTR Calculate
JMP: mã lệnh lưu địa chỉ của 1 ô nhớ. Khi thực hiện, IP sẽ được gán bằng giá trị lưu tại địa chỉ này. Có thể kết hợp để định vị chỉ số.
VD:
myPointer DW Prepare, Calculate, Check, Output
..
mov bx,2 ; chỉ số trong mảng con trỏ
shl bx,1 ; nhân đôi
jmp myPointer[bx]
..
Prepare: ;công việc 1
..
Calculate: ; công việc 2…
30
31
JMP: tương tự trường hợp trên nhưng con trỏ gồm cả segment và offset. Chỉ khác ở khai báo con trỏ.
VD:
myPointer DD Prepare, Cal, Output
..
mov bx,1 ; chỉ số trong mảng con trỏ
mov cl,2
shl bx,cl ; nhân 4
jmp myPointer[bx]
..
Prepare: ;công việc 1
..
Cal: ; công việc 2
..
JMP: nhảy đến địa chỉ lưu trong thanh ghi AX.
VD:
mov ax, offset Cal
jmp ax ; (IP AX)
32
Nhảy có điều kiện
Các lệnh nhảy có điều kiện bắt đầu bằng chữ J, sau đó là chữ cái hiển thị điều kiện.
Vd:
JGE ah,5: Jump if greater or equal, nhảy đến ah nếu >=5, tiếp sau là tên nhãn.
Khi sử dụng lệnh nhảy có điều kiện sau khi thực hiện so sánh phải lưu ý toán hạng trong phép so sánh là có dấu hay không dấu để chọn lệnh cho phù hợp.
Vd:
mov ah, al ; al hiện = 128
cmp ah, 1
jge Greater ; ah > 1 nhưng không nhảy ???
…
Greater:
33
Một số lệnh nhảy thường dùng:
JE, JZ: nhảy nếu bằng.
JA (nhảy nếu lớn hơn, không dấu), JG (nhảy nếu lớn hơn, có dấu), JB (nhảy nếu nhỏ hơn, không dấu), JL (nhảy nếu nhỏ hơn, có dấu)
JAE (nhảy nếu lớn hơn hoặc bằng, không dấu), JGE (nhảy nếu lớn hơn hoặc bằng, có dấu), JBE (nhảy nếu <=, không dấu), JLE (nhảy nếu <=, có dấu)
JNE, JNZ (nhảy nếu không bằng)
VD: nếu al là số nguyên không dấu thì đoạn chương trình trên như sau:
mov ah, al
cmp ah, 1
jae Greater
2. Loop
Lặp một khối lệnh cụ thể. Thanh CX được sử dụng làm bộ đếm.
Cú pháp:
Loop: tự động giảm CX 1 đơn vị, sau đó kiểm tra xem CX có = 0 hay không, nếu không bằng thì nhảy đến .
Loopz: tự động giảm CX 1 đơn vị, kiểm tra xem CX = 0 hoặc cờ ZF có bật không, nếu cả 2 điều này không xảy ra thì nhảy đến nhãn.
34
VD: nhập mảng A gồm 10 ký tự
mov si, 0 ; chỉ số mảng
mov cx, 10 ; số lần lặp
LAP:
mov ah,1 ; nhập ký tự
int 21h
mov a[si], al
inc si
mov ah,2 ; xuất ký tự
int 21h
LOOP LAP
Lưu ý:
Không để bộ đếm bắt đầu bằng 0. Nếu điều này xảy ra, lệnh LOOP sẽ giảm CX thanh FFFFb, và vòng lặp sẽ lặp 65.535 lần.
Thay đổi bộ đếm trong vòng lặp.
35
BÀI TẬP
36
GV: Ths. Phạm Nguyên Văn
2
I. Mô hình bộ nhớ
Lệnh .model lựa chọn mô hình bộ nhớ.
Tiny: Mã và DL phối hợp < 64K.
Small: Mã <=64K, DL <= 64K. Một phân đoạn mã, 1 phân đoạn dữ liệu.
Medium: Dữ liệu <= 64K, mã có kích cỡ bất kỳ. Nhiều phân đoạn mã, 1 phân đoạn dữ liệu.
Compact: Mã <= 64K, dữ liệu kích cỡ bất kỳ. Một đoạn mã, nhiều phân đoạn dữ liệu.
Large: Mã > 64K, dữ liệu > 64K. Nhiều phân đoạn mã và dữ liệu.
Huge: giống như Large, ngoại trừ các biến riêng lẻ như các mảng có thể > 64K.
Flat: Không có phân đoạn nào. Các địa chỉ 32bit được dùng cho cả mã và DL. Chỉ dùng chế độ bảo vệ.
3
II. Toán tử và biểu thức
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ẻ.
4
1. Toán tử số học
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)
5
Mức ưu tiên
6
2. offset, seg, ptr, label và even
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:
7
.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
8
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ó
9
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
10
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
11
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.
12
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
13
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
14
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
15
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)
16
3. Các toán tử TYPE và SIZE
Toán tử SHORT:
thường sử dụng với JMP khi thực hiện nhảy ngắn khoảng <= 127 byte từ vị trí hiện thời. Điều này giúp trình biên dịch thực hiện 1 lệnh nhảy ngắn 1 byte thay vì 1 lệnh nhảy gần 2 byte.
Toán tử TYPE: trả về kích cỡ của 1 thành phần đơn lẻ trong 1 biến, tính theo byte.
VD: biến 8bit trả về kiểu 1, biến 32bit trả về kiểu 4, mảng byte trả về 1, mảng 16bit trả về 2. Kiểu 1 nhãn gần là FFFFh, kiểu 1 nhãn xa là FFFEh.
17
.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
18
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.
19
.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
20
Toán tử SIZE: = length * type của 1 biến.
intArray dw 32 dup(0) ; SIZE = 64
21
4. Lệnh ENUM của Borland TASM
Định nghĩa 1 dãy các hằng và gán giá trị nguyên cho từng hằng. Tất cả các ký hiệu đều được định nghĩa trên một dòng:
name enum [, symbol1[, symbol2,…[, symbol-n] ] ]
VD:
driveStatus enum ready, busy, offline
Ngầm định: ready = 0, busy = 1, offline = 2
22
Có thể sử dụng {} để định nghĩa enum trong nhiều dòng:
ColorType enum {
black, blue
green, cyan
red, magenta
brown, white }
Trình hợp dịch sẽ lựa chọn kiểu DL nhỏ nhất để lưau các hằng. VD: ColorType được gán thuộc tính byte:
.code
mov al, blue ; ok
mov ax, blue ; lỗi
23
Cách dùng: giả sử đã định nghĩa ColorType trong chương trình ngay trước lệnh .data:
.data
winColor db cyan
.code
mov al,winColor ; al = 2
hoặc:
.data
winColor ColorType cyan
24
Giá trị tường minh: mỗi hằng có thể tuỳ ý được gán một giá trị giữa 0 và 0FFFFh (nếu giá trị 0, 1, 2 không thích hợp).
VD:
StatusVals enum normal = 1, overheat = 5, highSpeed
.code
mov bl, overheat ; bl = 5
mov al, highSpeed ; al = 6
25
Nếu giá trị tường minh đã gán cho các hằng vượt quá bộ nhớ 1 byte, kiểu enum sẽ tự chuyển sang word:
StatusVals enum {
normal = 1000h, overheat = 2000h, highSpeed = 3000h }
.code
mov ax, highSpeed ;ok
mov al, overheat ; lỗi
III. So sánh
ASM so sánh 2 số bằng cách thực hiện 1 phép toán số học hoặc logic trên 2 số đó và căn cứ vào thanh ghi cờ để đưa ra kết luận. Để làm việc này có thể dùng lệnh CMP và TEST.
CMP <đích>,
TEST <đích>,
Bản chất của cmp là lệnh SUB <đích>,
VD: so sánh 2 số nguyên dương
mov ah,1
mov al, 2
cmp ah, al
Sau khi thực hiện, cờ carry (cf) bật, báo hiệu ah < al.
26
Bản chất của lệnh TEST là lệnh AND <đích>,
VD: kiểm tra 2 bit cuối cùng của AL
TEST AL, 3; 3h = 11b
Nếu cờ Zero (ZF) bật nghĩa là 2 bit cuối của AL đều là 0.
27
28
IV. Lệnh JMP và LOOP
Được sử dụng trong các trường hợp chuyển giao điều khiển hoặc rẽ nhánh.
Chuyển giao không điều kiện: chương trình rẽ nhánh đến 1 vị trí trong tất cả các trường hợp.
Chuyển giao có điều kiện: chương trình rẽ nhánh nếu 1 đk nhất định = true.
29
1. JMP
Là lệnh nhảy không điều kiện:
JMP <đích>
Gồm các trường hợp:
JMP SHORT <đích>: khi đó mã lệnh lưu 1 byte khoảng cách (offset) giữa vị trí hiện tại và vị trí cần nhảy. Kiểu này chỉ nhảy trong phạm vi -128~+127 byte so với vị trí hiện tại.
VD:
JMP SHORT Calculate
JMP <đích>: khi đó trong mã lệnh lưu 2 byte khoảng cách giữa vị trí cần nhảy và vị trí hiện tại. Kiểu này nhảy đến bất kỳ chỗ nào.
VD:
JMP Thoat
JMP FAR PTR <đích>: nhảy tùy ý trong phạm vi segment.
VD:
JMP FAR PTR Calculate
JMP
VD:
myPointer DW Prepare, Calculate, Check, Output
..
mov bx,2 ; chỉ số trong mảng con trỏ
shl bx,1 ; nhân đôi
jmp myPointer[bx]
..
Prepare: ;công việc 1
..
Calculate: ; công việc 2…
30
31
JMP
VD:
myPointer DD Prepare, Cal, Output
..
mov bx,1 ; chỉ số trong mảng con trỏ
mov cl,2
shl bx,cl ; nhân 4
jmp myPointer[bx]
..
Prepare: ;công việc 1
..
Cal: ; công việc 2
..
JMP
VD:
mov ax, offset Cal
jmp ax ; (IP AX)
32
Nhảy có điều kiện
Các lệnh nhảy có điều kiện bắt đầu bằng chữ J, sau đó là chữ cái hiển thị điều kiện.
Vd:
JGE ah,5: Jump if greater or equal, nhảy đến ah nếu >=5, tiếp sau là tên nhãn.
Khi sử dụng lệnh nhảy có điều kiện sau khi thực hiện so sánh phải lưu ý toán hạng trong phép so sánh là có dấu hay không dấu để chọn lệnh cho phù hợp.
Vd:
mov ah, al ; al hiện = 128
cmp ah, 1
jge Greater ; ah > 1 nhưng không nhảy ???
…
Greater:
33
Một số lệnh nhảy thường dùng:
JE, JZ: nhảy nếu bằng.
JA (nhảy nếu lớn hơn, không dấu), JG (nhảy nếu lớn hơn, có dấu), JB (nhảy nếu nhỏ hơn, không dấu), JL (nhảy nếu nhỏ hơn, có dấu)
JAE (nhảy nếu lớn hơn hoặc bằng, không dấu), JGE (nhảy nếu lớn hơn hoặc bằng, có dấu), JBE (nhảy nếu <=, không dấu), JLE (nhảy nếu <=, có dấu)
JNE, JNZ (nhảy nếu không bằng)
VD: nếu al là số nguyên không dấu thì đoạn chương trình trên như sau:
mov ah, al
cmp ah, 1
jae Greater
2. Loop
Lặp một khối lệnh cụ thể. Thanh CX được sử dụng làm bộ đếm.
Cú pháp:
Loop
Loopz
34
VD: nhập mảng A gồm 10 ký tự
mov si, 0 ; chỉ số mảng
mov cx, 10 ; số lần lặp
LAP:
mov ah,1 ; nhập ký tự
int 21h
mov a[si], al
inc si
mov ah,2 ; xuất ký tự
int 21h
LOOP LAP
Lưu ý:
Không để bộ đếm bắt đầu bằng 0. Nếu điều này xảy ra, lệnh LOOP sẽ giảm CX thanh FFFFb, và vòng lặp sẽ lặp 65.535 lần.
Thay đổi bộ đếm trong vòng lặp.
35
BÀI TẬP
36
* 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ẻ: Đỗ Quang Huy
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)