ASSEMBLER 4

Chia sẻ bởi Đỗ Quang Huy | Ngày 19/03/2024 | 6

Chia sẻ tài liệu: ASSEMBLER 4 thuộc Công nghệ thông tin

Nội dung tài liệu:

Assembler 4
Giảng viên: Phạm Nguyên Văn
I. Định địa chỉ gián tiếp
1. Toán hạng gián tiếp: là thanh ghi chứa địa chỉ của dữ liệu trong bộ nhớ, còn gọi là biến trỏ.
Với biến DL chỉ chứa 1 thành phần, biến trỏ ít có giá trị.
với một mảng, biens trỏ có thể được gia số để trỏ đến từng thành phần tiếp theo.
Trong các thanh ghi 16bit, SI, DI, BX và BP có thể được dùng trong các toán hạng gián tiếp.
2
VD:
.data
aString db “ABCDEFG”
.code
mov bx,offset aString ; bx = 0200
add bx,5 ; bx = 0205
mov dl,[bx] ; dl = F
3
Giá trị ngầm định phân đoạn: địa chỉ được tạo bởi 1 toán hạng gián tiếp sẽ được mặc định là từ DS, ngoại trừ BP hoặc EBP là 1 phần của toán hạng gián tiếp.
VD: giả sử phân đoạn ngăn xếp và phân đoạn dữ liệu nằm tại các vị trí khác nhau:
mov si, bp ; si và bp bằng nhau
mov dl,[si] ; tìm trong phân đoạn dữ liệu
mov dl,[bp] ; tìm trong phân đoạn ngăn xếp
4
Chạy đè phân đoạn ngầm định: khi phải sử dụng tính năng định địa chỉ gián tiếp để truy cập dữ liệu trong 1 phân đoạn khác ngoài DS:
mov al,cs:[si] ; do dich vi tu CS
mov eax,es:[edi] ; do dich vi tu ES
mov bx,fs:[edx] ; do dich vi tu FS
mov dl,ss:[di] ; do dich vi tu SS
mov ax,gs:[ecx] ; do dich vi tu GS
5
Tương tự, nếu sử dụng BP hoặc EBP để truy cập dữ liệu do DS, CS, hoặc ES trỏ đến, ta cần phải chạy đè phân đoạn:
mov dl,ds:[bp] ; do dich vi tu DS
mov al,es:[ebp]; do dich vi tu ES
mov dl,cs[bp] ; do dich vi tu CS
mov al,fs:[ebp]; do dich vi tu FS
6
VD: cộng các số nguyên 8bit
7
Cộng số nguyên 16bit:
8
Hiển thị một chuỗi:
9
Tính tổng 1 mảng nguyên:
.data
intarray dw 100h,200h,300h,400h
COUNT = ($ - intarray)/2
.code
mov ax,0
mov di,offset intarray
mov cx,COUNT
L1:
add ax,[di] ; cong 1 so nguyen
add di,2 ; tro den so nguyen ke tiep
loop L1 ; lap cho den khi cx = 0
10
2. Toán hạng cơ sở-chỉ mục
Toán hạng cơ sở và chỉ mục chủ yếu như nhau. Sự khác biệt là: bx và bp là thanh ghi cơ sở, si và di là thanh ghi chỉ mục.
11
Có thể cộng giá trị của thanh ghi chỉ mục và thanh ghi cơ sở để tạo ra địa chỉ offset của bộ nhớ.
Không thể tổ hợp 2 thanh ghi cơ sở hoặc 2 thanh ghi chỉ mục
12
II. Dùng thư viện kết nối
Thư viện kết nối thông thường có dạng .lib, chứa nhiều hàm nhập xuất chuẩn.
Sử dụng EXTRN để định danh các tên tồn tại bên ngoài tập tin hiện hành:
extrn name:type
trong đó:
name: tên của thủ tục hoặc nhãn
type: thuộc tính kích cỡ
VD:
extrn Writeint:proc
extrn true:abs, false:abs
Để kết nối đến file thư viện, dùng lệnh liên kết:
ml /Fl irvine.lib filename.asm
hoặc includelib irvine.lib
hoặc include irvine.inc
13
III. Các thủ tục và ngắt
Ngắt: các chương trình trong BIOS và DOS hỗ trợ các ứng dụng liên quan đến I/O console, đĩa, máy in cũng như điều khiển bộ tính giờ, phân bổ bộ nhớ.
14
1. Thao tác với ngăn xếp
PUSH: giảm số SP và chép giá trị vào ngăn xếp tại vị trí SP trỏ đến.
VD:
push ax ; day vao thanh ghi 16bit
push eax ; day vao thanh ghi 32bit
push memval ; day vao toan hang bo nho 16bit
push 1000h ; day vao 1 gia tri, chi co tac dung trong 80286 tro len
15
POP: chép nội dung của stack vào thanh ghi hoặc biến và tăng SP. Không dùng CS và IP làm toán hạng.
VD:
pop cx
pop memval
pop edx
16
Sử dụng stack: nhiều khi phải sử dụng lại 1 thanh ghi. VD: một lệnh gọi DOS (int 21h) hiển thị 1 chuỗi. DX, và AX được mặc định các giá trị quan trong phải được phục hồi sau khi thông báo.
.data
message db “This is a message.$”
.code
push ax ; luu ax
push dx ; luu dx
mov ah,9 ; hien thi chuoi
mov dx,offset message ; dx tro den chuoi
int 21h
pop dx ; phuc hoi dx
pop ax ; phuc hoi ax
17
PUSHF: đẩy thanh ghi Flags vào ngăn xếp để bảo toàn nó trong trường hợp nó bị thay đổi.
POPF: phục hồi trạng thái ban đầu của các Flag.
VD:
pushf ; luu các cờ
call display_sub ; goi 1 chuong trinh con
popf ; phuc hoi các cờ
18
2. Thủ tục
PROC và ENDP đánh dấu đầu và cuối 1 thủ tục con.
Để gọi 1 thủ tục, sử dụng lệnh CALL.
vd:
.code
main proc
mov ax,@data
mov ds,ax
call MySub
mov ax,4c00h
int 21h
main endp
MySub proc

ret
MySub endp
19
Gọi thủ tục lồng: chương trình con có thể gọi các chương trình con khác.
Thủ tục NEAR: khi lệnh call và chương trình con nó gọi nằm trong cùng đoạn mã, ta gọi đó là lệnh gọi gần (near). Khi gọi, lệnh call lưu giá trị IP vào ngăn xếp, load offset của chương trình con vào IP.
Thủ tục FARR: khi chương trình gọi và chương trình con nằm trong các phân đoạn khác nhau. Lệnh call lưu IP và CS vào ngăn xếp, load offset phân đoạn của chương trình con vào CS và offset của nó vào IP.
20
IV. Tham số thủ tục
1. Truyền đối số vào các thanh ghi: đây là 1 cách thông dùng khi truyền đối số cho chương trình con.
VD: thủ tục Writeint trong thư viện kết nối yêu cầu AX chứa 1 số nguyên và BX chứa cơ số hiển thị
.data
aNum dw ?
.code
mov ax,aNum
mov bx,10
call Writeint
21
Bảo toàn các thanh ghi: thông thường, chương trình con chịu trách nhiệm bảo toàn các giá trị của mọi thanh ghi mà nó có thể phải sửa đổi.
VD: gọi Writeint trong vòng lặp
.data
dec_radix = 10
list_count = 20
aList dw list_count dup(?)
.code
mov cx,list_count
mov bx,dec_radix
mov si,offset aList
L1:
mov ax,[si]
call Writeint
add si size aList (size = 2)
loop L1
22
V. Ngắt
Chương trình ngắt gồm ngắt phần cứng và ngắt phần mềm.
Ngắt phần cứng: là tín hiệu phát sinh từ 1 bộ phận phần cứng bất kỳ, yêu cầu CPU phải chú ý ngay.
Ngắt phần cứng được phát sỉnh bởi 1 chip đặc biệt, 8259 Interrupt Controller, phát tín hiệu cho CPU đình chỉ hoạt động hiện thời và xử lý ngắt.
Vd: bàn phím. Thao tác nhấn phím sẽ làm CPU tạm dừng chương trình và thi hành 1 chương trình cấp BIOS đọc ký tự từ cổng nhập liệu bàn phím và lưu trong vùng đệm.
Để vô hiệu các ngắt phần cứng, lệnh CLI (clear interrupt flag) vô hiệu các ngắt, STI (set interrupt flag) kích hoạt các ngắt.
23
Ngắt phần mềm: là công cụ điều hành chi tiết các tiến trình nhập-xuất.
Lệnh int yêu cầu hoạt động từ hệ điều hành, thường để nhập/xuất.
24
1. Lệnh INT
Lệnh INT gọi 1 chương trình con của hệ điều hành, được định danh bởi 1 con số trong miền 0FFh.
Trước khi INT thi hành, AH thường chứa 1 số hiều định danh chương trình con muốn dùng.
Cú pháp:
INT number
25
Các ngắt phần mềm chung:
int 10h: video services. Các chương trình hiển thị video điều khiển vị trí con trỏ, cuộn màn hình và hiển thị đồ họa video.
int 16h: keyboard. Các chương trình đọc bàn phím và kiểm tra tình trạng của nó.
int 17h: Printer. Các chương trình khởi tạo, in và trả về tình trạng máy in.
int 1Ah: Time of Day. Tính số lượng nhịp đồng hồ từ khi bật máy hoặc ấn định bộ đếm theo giá trị mới.
int 1Ch: User Timer Interrupt. Một chương trình rỗng được thi hành 18.2 lần/giây
int 21h: DOS. Các chương trình DOS dùng cho tiến trình nhập/xuất, điều quản tập tin, quản lý bộ nhớ, còn gọi là các lệnh gọi hàm DOS.
26
2. Điều hướng lại tiến trình nhập/xuất
Thiết bị nhập liệu chuẩn + thiết bị kết xuất chuẩn = console.
Việc điều hướng sử dụng ký hiệu > và <.
> : chuyển hướng đầu ra (xuất dl)
< : chuyển hướng đầu vào (nhập dl)
VD:
prog1 > prn ; Kết xuất ra máy in
prog1 < infile.txt ; nhập liệu từ tập tin infile.txt
prog1 < infile.txt > prn ; Nhập liệu từ tập tin, kết xuất ra máy in.
27
Các tên thiết bị DOS chuẩn
28
VI – Các lệnh ngắt của DOS
INT 21h được sử dụng để gọi các lệnh DOS.
Nó hỗ trợ khoảng 90 hàm, được định danh bởi 1 số đặt trong AH.
Gồm 2 nhóm: xuất và nhập.
29
1. Các hàm kết xuất
02h: Kết xuất ký tự. Đưa 1 ký tự ra màn hình và đẩy con trỏ lên 1 vị trí.
Nhập liệu: ah = 2, dl chứa ký tự.
Kết xuất: al được dos sửa đổi
VD:
mov ah,2 ; chọn hàm dos 2
mov dl, ‘*’ ; ký tự sẽ xuất hiện
int 21h ; gọi DOS để thực hiện
30
05h: Kết xuất máy in. Gửi 1 ký tự ra máy in.
Nhập liệu: ah = 5, dl chứa ký tự. DOS đợi cho máy in sẵn sàng tiếp nhận ký tự.
Có thể kết thúc bằng lệnh Ctrl+break.
Kết xuất ngầm định: cổng LPT1.
Có thể phải gửi 1 ký tự cuối dòng (0Dh) hoặc ký tự cuối trang (0Ch) để buộc phải in ngay.
VD:
mov ah,5
mov dl, ‘$’
int 21h
mov dl 0Dh
int 21h
31
06h: Kết xuất trực tiếp. Đọc từ nhập liệu chuẩn hoặc viết ra kết xuất chuẩn.
Nhập liệu: ah = 6, dl chứa ký tự.
VD:
mov ah,6
mov dl,’%’
int 21h
32
09h: Kết xuất chuỗi. Hàm 9 ghi một chuỗi ra kết xuất chuẩn.
Nhập liệu: ah = 9, dx = địa chỉ offset của chuỗi. Chuỗi phải được kết thúc bởi ký tự $.
DOS có thể nhận ra các ký tự điều khiển: tab, về đầu dòng,…
VD:
.data
string db ‘This is a byte string.’,0Dh, 0Ah,’$’
mov ah,9
mov dx,offset string
int 21h
33
Nếu bỏ dấu $, DOS sẽ in tất cả các ký tự tiếp theo trong bộ nhớ cho đến khi tìm thấy giá trị ASCII của dấu $ (24h).
34
2. Các hàm nhập liệu
01h: Nhập liệu được lọc, có Echo
06h: Nhập liệu trực tiếp, không đợi
07h: Nhập liệu trực tiếp, không có Ctrl+break
08h: Nhập trực tiếp, có Ctrl+break
0Ah: Nhập liệu có vùng đệm.
0Bh: Tìm trạng thái nhập liệu.
0Ch: Xóa vùng đệm nhập liệu, gọi hàm nhập liệu.
3Fh: Đọc từ tập tin hoặc thiết bị.
35
01h
mov ah,1
int 21h
mov char,al ; ký tự lưu tại al
36
06h Nhập trực tiếp không đợi
Không đợi nhập liệu, nó truy tìm ký tự sẵn có kế tiếp (nếu có) trong bộ đệm nhập liệu.
Nếu không có, ZF = 1.
VD:
mov ah,6 ; kiểm tra vùng đệm nhập liệu
mov dl,0FFh
int 21h.
37
clear_keyboard proc
push ax
push dx
L1:
mov ah,6
mov dl,0FFh
int 21h
jnz L1 ; nhảy đến L1 nếu ZF = 0
pop dx
pop ax
ret
clear_keyboard endp
38
0Ah Nhập có vùng đệm
Đọc 1 chuỗi lên tới 255 ký tự.
Khai báo vùng đệm trước, gồm cả phím Enter
.data
keyboardArea label byte
maxkeys db 32 ; các ký tự tối đa được phép
charsInput db ? ; các ký tự nhập liệu thực tế
buffer db 32 dup(0)
.code
mov ah,0Ah
mov dx,offset keyboardArea ; DX-> vùng tham số
int 21h
39
* 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)