Giáo trình Hợp ngữ

Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
MỤC LỤC  
Chương 1. NGÔN NGỮ ASM VÀ CÁCH LẬP TRÌNH ..............................................1  
1.1. Mở đầu .................................................................................................................3  
1.2. Cài đặt chương trình dịch TASM.........................................................................3  
1.3. Các bước thực hiện một chương trình Assember trên máy PC : .........................4  
1.4. Sự hỗ trợ của hệ thống cho việc lập trình Assember ...........................................4  
1.4.1 Cấu trúc các thanh ghi ...................................................................................4  
1.4.2 Cách thể hiện địa chỉ ô nhớ (ROM hoặc RAM): dạng lôgíc và dạng vật lý .7  
1.4.3 Các ngắt hay dùng hỗ trợ cho lập trình Assembler........................................7  
1.5. Hệ lệnh Assembler ...............................................................................................7  
1.5.1. Cú pháp của một dòng lệnh ASM................................................................7  
1.5.2. Tập lệnh Mnemonic.....................................................................................8  
1.5.3 Các lệnh điều khiển khi dịch chương trình (directive) ................................21  
1.6. Chương trình con................................................................................................34  
1.6.1. Ý nghĩa của chương trình con.....................................................................34  
1.6.2. Cơ chế khi một chương trình con bị gọi....................................................34  
1.6.3. Cú pháp một chương trình con ASM.........................................................34  
1.7. MACRO .............................................................................................................37  
1.7.1. Ý nghĩa........................................................................................................37  
1.7.2. Khai báo (xác lập) MACRO .......................................................................37  
1.7.3 Cách dùng MACRO đã được xác lập ..........................................................38  
1.8. Directive INCLUDE ..........................................................................................38  
1.8.1. Ý nghĩa........................................................................................................38  
1.8.2 Cú pháp chèn................................................................................................38  
1.8.3. Cơ chế khi chương trình dịch TASM gặp directive INCLUDE.................39  
1.9. Chương trình đa tệp............................................................................................48  
1.9.1. Ý nghĩa........................................................................................................48  
1.9.2. Directive PUBLIC ......................................................................................48  
1.9.3. Directive EXTRN .......................................................................................48  
1.9.4. Cách dịch và liên kết..................................................................................50  
1.10. Biến hỗn hợp : Directive STRUC, RECORD và UNION ...............................51  
1.10.1 Cấu trúc STRUC........................................................................................51  
1.10.2 Directive UNION.......................................................................................51  
1.11. Xây dựng chương trình Assembly để được tệp thực hiện dạng .COM............51  
1.11.1 Sự khác nhau chương trình dạng COM và EXE........................................51  
1.11.2 Làm thế nào để có được chương trình dạng .COM ...................................51  
1.11.3 Các vấn đề cần lưu ý..................................................................................52  
1.11.4 Dạng thường thấy 1 chương trình ASM để được dạng COM ...................52  
Chương 2: LIÊN KẾT CÁC NGÔN NGỮ BẬC CAO VỚI ASM...............................57  
2.1 Liên kết Pascal với ASM ....................................................................................57  
2.1.1 Inline ASM..................................................................................................57  
2.1.2 Viết tách biệt tệp ngôn ngữ Pascal và tệp ASM .........................................58  
2.2 Liên kết c/c++ với ASM...................................................................................67  
2.2.1. Inline Assembly.......................................................................................67  
2.2.2 Viết tách biệt C/C++ và tệp ASM.............................................................68  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
1
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
Chương 3: LẬP TRÌNH HỆ THỐNG...........................................................................77  
3.1. Các bước khi máy tính khởi động......................................................................77  
3.2 Phân loại ngắt và khái niệm...............................................................................78  
3.3 Cơ chế khi một ngắt được kích hoạt..................................................................79  
3.4. Các bước xác lập ngắt........................................................................................79  
3.4.1. Viết chương trình con phục vụ ngắt theo yêu cầu của thuật toán ..............79  
3.4.2. Lấy địa chỉ đầu của chương trình con phục vụ ngắt...................................79  
3.5 Vùng dữ liệu ROM BIOS ...................................................................................82  
3.6 Các ngắt hay dùng trong hệ thống ......................................................................87  
3.6.1. Ngắt bàn phím.........................................................................................87  
3.6.2 Các ngắt với màn hình.................................................................................90  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
2
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
Chương 1. NGÔN NGỮ ASM VÀ CÁCH LẬP TRÌNH  
1.1. Mở đầu  
Giới thiệu  
Ngôn ngữ Asembler là ngôn ngữ bậc thấp.  
ꢀƯu điểm :  
Vì ngôn ngữ Assembler rất gần gũi với ngôn ngữ máy nên chương trình  
+ Chạy nhanh.  
+ Tiết kiệm bộ nhớ.  
+ Có thể lập trình truy cập qua các giao diện vào ra nhưng hiện nay các ngôn ngữ  
bậc cao cũng có thể làm được.  
ꢀNhược điểm  
+ Khó viết bởi vì yêu cầu người lập trình rất am hiểu về phần cứng.  
+ Khó tìm sai: bao gồm sai về cú pháp (syntax) và sai về thuật toán (Algorithm).  
Chương trình dịch sẽ thông báo sai ta sẽ dùng debug của DOS để kiểm tra.  
+ Không chuyển chương trình Assembler cho các máy tính có cấu trúc khác nhau.  
ꢀỨng dụng  
+ Viết lõi của hệ điều hành.  
+ Các chương trình trò chơi ( ngày trước).  
+ Tạo virus.  
+ Các chương trình đo và điều khiển sử dụng trong công nghiệp, ngày nay các vi  
điều khiển được sử dụng một cách rộng rãi.  
1.2. Cài đặt chương trình dịch TASM  
Hiện nay có hai chương trình dịch rất phổ biến là MASM (của hãng Microsoft) và  
TASM (của hãng Borland) về cơ bản là hai chương dịch này rất giống nhau nhưng  
khác nhau ở chỗ: khi viết lệnh push  
Nếu viết :  
push ax  
push bx  
push cx  
thì cả hai chương trình đều biên dịch được. ( cách viết này theo MASM).  
Còn trong TASM thì cho phép viết  
push ax bx cx  
Cài đặt chương trình dịch TASM:  
ꢀCách 1:  
Mua đĩa bản quyền nếu là đĩa mềm thì có 5 đĩa hoặc là 1 đĩa CD  
Run  
cmd  
A:\ install  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
3
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
ꢀCách 2:  
+ Tạo thư mục: C:\TASM  
+ Copy 4 tệp lõi từ máy khác đã cài đặt theo cách 1 về thư mục đã tạo trước..  
1.3. Các bước thực hiện một chương trình Assember trên máy PC :  
(soạn thảo chương trình, dịch chương trình, liên kết, chạy thử và  
cách tìm sai bằng DEBUG của DOS và TD (Turbo Debug) của Borland)  
Bao gồm 4 bước:  
+ Bước 1: Dùng chương trình soạn thảo bất kì (Edit, NC, TC, ….) để soạn thảo  
chương trình. Sau khi soạn thảo xong phải cất tệp có đuôi là .ASM.  
+ Bước 2: Dịch chương trình gốc có đuôi .ASM thành tệp có đuôi là .OBJ  
Cú pháp: C:\BT> tasm ten tep[.ASM]  
ten tep.OBJ  
Chú ý: khi chương trình dịch có lỗi thì không sinh ra tệp có đuôi là .OBJ  
Cách khai báo sai  
** Error**ten tep.asm[10] Illegal Instruction  
dòng thứ bao nhiêu  
lỗi gì  
+ Bước 3: Liên kết để chuyển tên tệp có đuôi .OBJ sang tệp .EXE hay .COM  
Cú pháp: C:\BT> tlink ten tep[.OBJ]  
ten tep.EXE hay ten tep.COM  
+ Bước 4: Chạy thử chương trình  
Khi chạy nếu có lỗi thì dùng debug để kiểm tra.  
1.4. Sự hỗ trợ của hệ thống cho việc lập trình Assember  
1.4.1 Cấu trúc các thanh ghi  
a) Thanh ghi là gì? Thanh ghi là một  
vùng nhớ đặc biệt dạng RAM nằm ở  
CPU, việc thâm nhập các thanh ghi  
được thực hiện bằng tên huý (tên  
thanh ghi).  
+ Người lập trình ASM hay dùng thanh  
ghi làm toán hạng thay cho biến nhớ  
vì vậy làm cho chương trình chạy  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
4
Bộ môn Công nghệ điều khiển tự động  
nhanh hơn.  
Giáo trình hợp ngữ  
+ Giải thích: vì các thanh ghi nằm ở CPU nên dữ liệu lấy ra nhanh hơn.  
+ Vùng nhớ cache là vùng nhớ nằm trong CPU.  
b) Phân loại thanh ghi  
+ Máy tính 16 bit có 14 thanh ghi.  
+ Máy tính 32 bit có 16 thanh ghi.  
ꢀCấu trúc thanh ghi của máy tính 16 bit  
+ Nhóm 1: Thanh ghi cờ  
Người lập trình ASM hay dùng trạng thái các bit cờ làm điều kiện cho các lệnh  
nhảy có điều kiện.  
x x x x O D I T S Z x A x P x C  
+ x: không được định nghĩa.  
6 bit cờ trạng thái thể hiện các trạng thái khác nhau của kết quả sau một thao tác  
nào đó, trong đó 5 bit cờ đầu thuộc byte thấp của thanh cờ là các cờ giống như của bộ  
vi xử lý 8 bit 8085 của Intel.  
+ C hoặc CT (Carry flag): cờ nhớ. CF = 1 khi có nhớ hoặc mượn từ MSB.  
+ P hoặc PF (Parity flag): cờ parity. PF phản ánh tính chẵn lẻ (parity) của tổng  
số bit có trong kết quả. PF = 1 khi tổng số bit 1 trong kết quả là chẵn.  
+ A hoặc AF (Auxiliary carry flag): cờ nhớ phụ, rất có ý nghĩa khi ta làm việc  
với các số BCD. AF = 1 khi có nhớ hoặc mượn từ một số BCD thấp (4 bit  
thấp) sang một số BCD cao (4 bit cao).  
+ Z hoặc ZF ( Zero flag): cờ rỗng, ZF = 1 khi kết quả bằng 0.  
+ S hoặc SF (Sign flag): cờ dấu, SF = 1 khi kết quả âm.  
+ O hoặc OF (Overflow flag): cờ tràn, OF = 1 khi kết quả là một số bù hai  
vượt ra ngoài giới hạn biểu diễn dành cho nó.  
Ngoài ra bộ vi xử lí 8088 còn có các cờ điều khiển sau đây:  
+ T hoặc TF (Trap flag): cờ bẫy, TF = 1 thì CPU làm việc ở chế độ chạy từng  
lệnh( chế độ này cần dùng khi cần tìm lỗi trong một chương trình).  
+ I hoặc IF (Interrupt enable flag): cờ cho phép ngắt, IF = 1 thì CPU cho phép  
các yêu cầu ngắt được tác động.  
+ D hoặc DF (Direction flag): cờ hướng, DF = 1 khi CPU làm việc với chuỗi  
kí tự theo thứ tự từ trái sang phải (hay còn gọi D là cờ lùi).  
+ Nhóm 2: Thanh ghi đa năng: gồm 8 thanh ghi 16 bits.  
AX  
BX  
CX  
DX  
SI  
AH  
BH  
CH  
DH  
AL  
BL  
CL  
DL  
DI  
BP  
SP  
+ Trong đó H(high) thể hiện các bit cao, L(low) thể hiện các bit thấp.  
+ Trong 4 thanh ghi AX, BX, CX và DX có 3 cách truy cập: truy cập theo 8  
bit cao hoặc theo 8 bit thấp hoặc theo cả 16 bit. Các thanh ghi còn lại chỉ có  
một cách truy cập.  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
5
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
+ AX (Accumulator, Acc): thanh chứa. Các kết quả của các thao tác thường  
được chứa ở đây (kết quả của phép nhân, chia). Nếu kết quả là 8 bit thì  
thanh ghi AL được coi là Acc.  
+ BX (Base): thanh ghi cơ sở, thường chứa địa chỉ cở sở của một bảng dùng  
trong lệnh XLAT.  
+ CX (Count): bộ đếm, CX thường được dùng để chứa số lần lặp trong trường  
hợp các lệnh LOOP, còn CL thường chứa số lần dịch hoặc quay trong các  
lệnh dịch hay quay thanh ghi.  
+ DX (Data): thanh ghi dữ liệu, DX cùng AX tham gia vào các thao tác của  
phép nhân hoặc chia các số 16 bit. DX còn dùng để chứa địa chỉ của các  
cổng trong các lệnh vào ra trực tiếp (IN/OUT).  
+ SI (Source index): chỉ số gốc hay nguồn, SI chỉ vào dữ liệu trong đoạn dữ  
liệu DS mà địa chỉ cụ thể đầy đủ tương ứng với DS : SI.  
+ DI (Destination index): chỉ số đích, DI chỉ vào dữ liệu trong đoạn dữ liệu  
DS mà địa chỉ cụ thể đầy đủ tương ứng với DS : DI.  
+ BP (Base pointer) : con trỏ cơ sở, BP luôn trỏ vào một dữ liệu nằm trong  
đoạn ngăn xếp SS. Địa chỉ đầy đủ của một phần tử trong đoạn ngăn xếp ứng  
với SS : BP.  
+ SP (Stack pointer): con trỏ ngăn xếp, SP luôn trỏ vào đỉnh hiện thời của  
ngăn xếp SS. Địa chỉ đầy đủ của đỉnh ngăn xếp ứng với SS:SP.  
Người lập trình chỉ dùng 7 thanh ghi sau: AX, BX, CX, DX, SI, DI, BP.  
+ Nhóm 3: Thanh ghi con trỏ lệnh IP (Instruction pointer) hay PC(ProgRAM  
pointer)  
IP (Instruction pointer)  
15  
0
Nội dung trong thanh ghi IP cho biết địa chỉ offset của vùng nhớ chứa mã lệnh.  
+ Nhóm 4: Thanh ghi Segmnet ( phân đoạn): 4 thanh ghi 16 bits.  
15  
CS  
DS  
ES  
SS  
0
Các thanh ghi segment cho biết địa chỉ segment.  
+ CS (Code segment): mã máy.  
+ DS, ES: dữ liệu.  
+ SS: ngăn xếp  
ꢀCấu trúc thanh ghi của máy tính 32 bit  
+ Nhóm 1+ nhóm 2 + nhóm 3 là các thanh ghi 32 bit và với chữ E ở đầu (ví dụ:  
EAX hay EBX)  
EAX  
31  
15  
AX  
0
+ Nhóm 4 vẫn là các thanh ghi 16 bit và thêm hai thanh ghi GS và FS  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
6
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
1.4.2 Cách thể hiện địa chỉ ô nhớ (ROM hoặc RAM): dạng lôgíc và dạng vật lý  
Một thanh ghi 16 bit thì trỏ được 64k nhưng vùng nhớ của máy tính hiện nay rất  
lớn do vậy phỉa dùng 2thanh ghi để thể hiện địa chỉ của một ô nhớ. Và vùng nhớ  
được chia thành nhiều phần, mỗi phần 64k.  
a) Dạng Logic  
Địa chỉ 1 ô nhớ = segment : offset  
+ Thanh ghi thứ nhất cho biết ô nhớ đó nằm ở 64k thứ mấy (địa chỉ segment).  
+ Thanh ghi thứ hai cho biết khoảng cách từ đầu segment đến vị trí ô nhớ đó (địa  
chỉ offset).  
Ví dụ: 2: 100 tức là địa chỉ của ô nhớ nằm ở vị trí 100 tính từ trên đỉnh của  
segment thứ hai.  
b) Dạng vật lý  
Địa chỉ ô nhớ = seg*16 + offset  
+ Cách đánh địa chỉ này hay được dùng.  
1.4.3 Các ngắt hay dùng hỗ trợ cho lập trình Assembler  
+ Hàm 1: Chờ 1 kí tự  
mov ah,1  
int 21h  
; gán ah = 1 al chứa mã ASCII  
; al = 0 khi kí tự gõ vào là các phím chức năng.  
+ Hàm 2: Hiện 1 ký tự lên màn hình từ vị trí con trỏ đang đứng.  
Cách 1:  
mov al, mã ASCII  
mov ah,0eh  
int  
10h  
Cách 2:  
mov dl, mã ASCII  
; dl = mã ASCII của kí tự cần hiển thị  
mov ah,2  
int  
21h  
+ Hàm 3: Hiện xâu kí tự kết thúc ‘$’ lên màn hình.  
lea dx, tên biến xâu  
; mov dx,offset tên biến xâu  
mov ah,9  
int  
21h  
+ Hàm 4: Trở về DOS  
mov ah,4ch  
int  
21h  
1.5. Hệ lệnh Assembler  
+ Tập lệnh MNEMONIC sinh mã máy để chạy chương trình.  
+ Các DIRECTIVE điều khiển khi dịch chương trình.  
1.5.1. Cú pháp của một dòng lệnh ASM  
+ Mỗi một dòng chỉ được viết một lệnh.  
+ [Label] [Directive/Mnemonic] [Operands] [;Commnet]  
[Nhãn]  
[Loại lệnh]  
[Toán hạng] [Ghi chú]  
Từ ; cho đến hết dòng là ghi chú và nó có hiệu lực chỉ trên 1 dòng.  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
7
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
Ví dụ: 1) X1 EQU 10  
; gán 10 cho X1  
[Nhãn]  
[Lệnh Directive]  
[Toán hạng] [Ghi chú]  
2) L1:  
3) mov ax,bx  
[Lệnh Mnemonic][Toán hạng]  
1.5.2. Tập lệnh Mnemonic  
- Tập lệnh Mnemonic là gì? Đó là lệnh của ASM được thể hiện bằng viết tắt của  
tiếng Anh cho dễ hiểu.  
Tiếng Anh  
Move  
Addition  
Lệnh dạng Mnemonic  
mov  
add  
Multiplication  
mul  
- Các quy ước về toán hạng  
+ SRC: Toán hạng nguồn.  
+ DST: Toán hạng đích.  
+ REG(reg8/reg16: Toán hạng là thanh ghi  
+ Data: Toán hạng là hằng số.  
+ Mem: Toán hạng là biến nhớ.  
+ Segreg: Toán hạng là thanh ghi segment.  
- Tập lệnh MNEMONIC gồm có 6 nhóm  
+ Nhóm 1: Các lệnh di chuyển dữ liệu  
+ Nhóm 2: Các lệnh số học.  
+ Nhóm 3: Các lệnh thao tác bit  
+ Nhóm 4: Các lệnh thao tác xâu ký tự.  
+ Nhóm 5: Các lệnh rẽ nhánh  
+ Nhóm 6: Các hệ thống cờ  
a) Nhóm 1: Các lệnh di chuyển dữ liệu  
Tất cả lệnh trong nhóm này khi thực hiện không làm thay đổi trạng thái của các bit  
cờ.  
- Lệnh mov  
Chức năng: Đưa nội dung từ SRC đến DST  
Cú pháp: mov DST, SRC  
reg1  
reg  
reg  
mem  
mem  
segreg reg16  
reg16 segreg  
reg2  
data  
mem  
reg  
mov ax, bx  
mov cx,100  
mov dx,value  
mov value,dx  
mov value,100  
mov ds,ax  
data  
mov bx,cs  
segreg mem16  
mem16 segreg  
mov cs,value  
mov value,cs  
Chú ý:  
+ Không được di chuyển giữa hai biến nhớ (mov mem1,mem2).  
Thực hiện gián tiếp:  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
8
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
mov reg,mem2  
mov mem1,reg  
+ Không đưa trực tiếp dữ liệu vào thanh ghi segment (mov seg,data).  
Thực hiện gián tiếp:  
mov reg16,data  
mov segreg,reg16  
+ Sự khác nhau khi sử dụng các chế độ địa chỉ  
( mov ax,bx khác với mov ax,[bx] ; đưa nội dung mà bx trỏ đến vào ax)  
mov ax,[bx] tương đương với  
mov ax, ds:[bx] (SI,DI hay BP)  
- Lệnh push  
Chức năng: cất 2 byte của SRC vào đỉnh ngăn xếp(stack).  
Cú pháp:  
PUSH  
SRC  
reg16  
mem16  
Ví dụ: push ax  
Toán hạng gốc có thể tìm được theo các chế độ địa chỉ khác nhau: có thể là  
thanh ghi đa năng, thanh ghi đoạn hay là ô nhớ. Lệnh này thường được dùng  
với lệnh POP như là một cặp đỗi ngẫu để xử lý các dữ liệu và trạng thái của  
chương trình chính(CTC) khi vào ra chương trình con(ctc).  
- Lệnh POP  
Chức năng: lấy 2 byte (1 từ) ở đỉnh ngăn xếp (stack) vào toán hạng đích.  
Cú pháp:  
POP  
DST  
reg16  
mem16  
Ví dụ:  
push ax  
push bx  
push cx  
Đoạn Chương trình  
pop cx  
pop bx  
pop ax  
Chú ý: - Cơ chế PUSH/POP là LIPO( last in first out)  
- Cách viết trên chỉ được sử dụng trong MASM còn trong TASM được viết  
như sau:  
push ax bx cx  
- Lệnh PUSHF  
Chức năng; cất giá trị thanh ghi cờ vào đỉnh ngăn xếp  
Cú pháp: PUSHF  
Dữ liệu tại ngăn xếp không thay đổi, SS không thay đổi.  
- Lệnh POPF  
Chức năng: Lấy 2 byte từ đỉnh ngăn xếp rồi đưa vào thanh ghi cờ.  
Cú pháp: POPF  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
9
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
Sau lệnh này dữ liệu tại ngăn xếp không thay đổi, SS không thay đổi.  
- Lệnh XCHG (Exchange 2 Operands) Tráo nội dung 2 toán hạng  
Chức năng: Tráo nội dung 2 toán hạng DST  
SRC  
Cú pháp  
XCHG DST  
SRC  
reg2  
mem  
reg1  
reg  
Trong toán hạng đích có thể tìm theo chế độ địa chỉ khác nhau nhưng phải  
chứa dữ liệu có cùng độ dài và không được phép đồng thời là 2 ô nhớ và cũng  
không được là thanh ghi đoạn. Sau lệnh XCHG toán hạng chứa nội dung cũ của  
toán hạng kia và ngược lại.  
Lệnh này không tác động đến cờ.  
- Lệnh IN  
Chức năng: đọc dữ liệu từ cổng vào thanh ghi AL/AX  
Cú pháp: IN AL/AX, địa chỉ cổng  
Chú ý:  
+ Nếu địa chỉ cổng <256 thì số địa chỉ đứng trực tiếp trong lệnh IN  
Ví dụ: địa chỉ cổng là 1fh  
IN AL,1fh ; nội dung cổng 1fh đưa vào AL.  
+ Nếu địa chỉ cổng ≥ 256 thì phải nhờ đến thanh ghi DX  
Ví dụ: địa chỉ COM1 = 378h  
mov dx,378h  
in al,dx  
- Lệnh OUT  
Chức năng: đưa dữ liệu từ thanh ghi AL/AX ra cổng  
Cú pháp: OUT địa chỉ cổng,AL/AX  
Chú ý:  
+ Nếu địa chỉ cổng <256 thì số địa chỉ đứng trực tiếp trong lệnh OUT  
Ví dụ: địa chỉ cổng là 1fh  
OUT 1fh,AL ; nội dung cổng 1fh đưa vào AL.  
+ Nếu địa chỉ cổng ≥ 256 thì phải nhờ đến thanh ghi DX  
Ví dụ: địa chỉ COM1 = 378h  
mov dx,378h  
out dx,al  
Lệnh này không tác động đến cờ.  
- Lệnh LEA (load Efective address)  
Chức năng: lấy phần địa chỉ offset của biến đưa vào thanh ghi 16 bit  
Cú pháp: lea  
reg16, mem  
Ví dụ: lea bx, Value hay mov bx, OFFSET Value  
Đích thường là các thanh ghi: BX, CX, DX, BP, SI, DI.  
Nguồn là tên biến trong đoạn DS được chỉ rõ trong lệnh hay ô nhớ cụ thể.  
Ví dụ: lea dx, msg; Nạp địa chỉ offset của bản tin msg vào dx.  
DX xx:yy  
value  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
10  
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
- Lệnh LES (Load register and ES with words from memory)  
Chức năng: chuyển giá trị của 1 từ từ một vùng nhớ vào thanh ghi đích và giá  
trị của từ tiếp theo sau của vùng nhớ vào thanh ghi ES.  
Cú pháp: les  
reg, mem  
Trong đó: Đích là một trong các thanh ghi AX, BX,CX, DX, SP, BP, SI, DI.  
Gốc là ô nhớ trong đoạn DS được chỉ rõ trong lệnh  
BX xx:yy  
value  
ES  
- Lệnh LDS (Load resgister and DS with words from memory)  
Chức năng: Nạp một từ từ bộ nhớ vào thanh ghi cho trong lệnh và 1 từ tiếp theo  
vào DS.  
Cú pháp: lds  
reg, mem  
BX xx:yy  
value  
DS  
b) Nhóm 2: Các lệnh số học  
b1) Số có dấu và số không dấu  
- Số không dấu: Nếu nhìn vào toán hạng (độ lớn các toán hạng là 1 byte hay là là 2  
byte) với số không dấu thì bit cao nhất mang giá trị tại vị trí đó.  
Ví dụ:  
1 1 1 1 1 1 1 1  
- Số có dấu: Nếu nhìn vào toán hạng của số có dấu thì bit cao nhất sẽ mang ý nghĩa về  
dấu: 1 toán hạng là số âm, 0 toán hạng là số dương.  
255  
1 1 1 1 1 1 1 1  
Nếu số không dấu thì là 1.27 = 128  
Nếu số có dấu thì là – 1  
b2) Cách thể hiện một số âm của máy tính  
Máy tính thể hiện số âm bằng cách bù 2 giá trị tuyệt đối của số đó.  
Ví dụ: mov ax, - 1  
1= 0000 0000 0000 0001  
bù 1: 1111 1111 1111 1110  
+
1
bù 2: 1111 1111 1111 1111  
mov ax, - 100  
100 = 0000 0000 0110 0100  
1111 1111 1001 1011  
+
1
bù 2: 1111 1111 1001 1100  
Hầu hết các lệnh trong nhóm này khi thực hiện có thể làm thay đổi các kí tự.  
- Lệnh ADD(addition)  
Chức năng: DST  
DST + SRC  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
11  
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
Cộng hai toán hạng: lấy toán hạng đích cộng với toán hạng nguồn rồi đưa vào  
toán hạng đích.  
Cú pháp:  
add DST, SRC  
reg1  
reg  
reg  
mem  
mem  
reg2  
data  
mem  
reg  
add ax, bx  
add cx,100  
add dx,value  
add value,dx  
add value,100  
data  
Tác động đến cờ: C, P, A, Z, S, O.  
- Lệnh ADC(Add with carry)  
Chức năng: cộng có nhớ, DST  
Cú pháp: adc DST, SRC  
Tác động đến cờ: C, P, A, Z, S, O.  
Ví dụ: adc ax, bx  
DST + SRC + CF  
- Lệnh INC(Increment Destination Register or Memory)  
Chức năng: Tăng toán hạng đích thêm 1. DST  
Cú pháp: inc DST  
DST + 1  
Tác động đến cờ: C, P, Z, S, O.  
Ví dụ: reg  
inc  
inc  
ax  
value  
mem  
- Lệnh SUB (Substraction)  
Chức năng: Trừ hai toán hạng, DST  
DST – SRC  
Cú pháp:  
sub  
DST, SRC  
Ví dụ:  
sub ax, bx  
Tác động đến cờ: C, P, A, Z, S, O.  
Chú ý: chế độ địa chỉ không được đồng thời là 2 ô nhớ hay là thanh ghi đoạn.  
- Lệnh SBB (Substraction with borrow)  
Chức năng: Trừ có mượn, DST  
DST – SRC – CF  
Cú pháp:  
Ví dụ:  
sbb DST, SRC  
sbb ax, bx  
Tác động đến cờ: C, P, A, Z, S, O.  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
12  
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
- Lệnh MUL/ IMUL (Multiply Unsigned Byte or Word/ Integer  
Multiplication )  
Chức năng: Nhân 2 toán hạng với số không dấu (MUL), số có dấu (IMUL)  
Cú pháp: MUL(IMUL)  
SRC  
reg  
mem  
Có hai trường hợp tổ chức phép nhân  
+ 8 bits * 8 bits  
S ố bị nhân phải là số 8 bit để trong AL  
Sau khi nhân: al*SRC  
+ 16 bits * 16 bits  
AX  
S ố bị nhân phải là số 16 bit để trong AX  
Sau khi nhân: ax*SRC  
Tác động đến cờ: C, O.  
Chú ý:  
dx:ax  
al = 1111  
bl = 0000  
mul bl  
1111  
0010  
ax = al*bl (255*2 = 510)  
ax = al*bl (- 1*2 = -2 )  
imul bl  
Trong phép chia thì ax, bx, dx (al,bl,dx) là ẩn  
- Lệnh DIV/IDIV(Unsigned Divide/Integer Division)  
Chức năng: Chia hai toán hạng với số không dấu/ số có dấu  
Cú pháp: DIV (IDIV) SRC  
reg  
mem  
Hai trường hợp tổ chức phép chia  
+ Nếu số 16 bits chia cho số 8 bits  
+ Nếu số 32 bits chia cho số 16 bits  
Trong phép chia thì ax, bx, dx (al,bl,dx) là ẩn  
Ví dụ:  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
13  
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
- Lệnh DEC (Decrement Destination Register or Memory)  
Chức năng: Giảm toán hạng đích đi 1, DST DST – 1  
Cú pháp:  
dec DST  
reg  
dec  
dec  
ax  
value  
mem  
Tác động đến cờ: C, P, Z, S, O.  
- Lệnh NEG (Negate a Operand)  
Chức năng: lấy bù hai của một toán hạng, đảo dấu của một toán hạng  
DST  
- DST  
Cú pháp:  
neg DST  
reg  
mem  
neg  
neg  
ax  
value  
Tác động đến cờ: C, P, A, Z, S, O.  
- Lệnh CMP (Compare Byte or Word)  
Chức năng: So sánh nội dung của hai toán hạng và dựng cờ. Sau khi thực hiện  
lệnh này nội dung của hai toán hạng không thay đổi.  
Cú pháp:  
cmp DST, SRC  
Tác động đến cờ: C, P, Z, S, O.  
Cách dựng cờ:  
cmp DST, SRC  
+ Nếu DST < SRC thì CF = 1.  
+ Nếu DST ≥ SRC thì CF = 0.  
+ Nếu DST = SRC thì ZF = 1.  
+ Nếu DST ≠ SRC thì ZF = 0.  
c) Nhóm 3: Các lệnh thao tác bit  
Chú ý: tất cả các lệnh trong nhóm này khi thực hiện có thể làm thay đổi trạng thái  
các bit cờ.  
- Lệnh AND  
Chức năng: Thực hiện phép “và logic”, bit của kết quả bằng 1 khi 2 bit tương  
ứng đều bằng 1. DST  
Ví dụ:  
DST Λ SRC  
al = 1010 1010  
bl = 1100 1100  
and al,bl = 1000 1000  
Cú pháp: and DST, SRC  
Cách hay dùng:  
+ Tách bit:  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
14  
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
al = xxxx xxxx  
0001 0000  
and al, 10h = 000x 0000  
Khi dùng phép AND để che đi/ giữ lại một vài bit nào đó của một toán hạng  
thì bằng cách nhân logic toán hạng đó với toán hạng tức thì có các bit0/1 ở các  
chỗ cần che/ giữ nguyên tương ứng.  
+ Dựng cờ  
Ví dụ:  
and DST,DST  
and ax, ax  
Nếu ax < 0 thì SF = 1.  
Nếu ax ≥ 0 thì SF = 0.  
Nếu ax = 0 thì ZF = 1.  
Nếu ax ≠ 0 thì ZF = 0.  
- Lệnh OR  
Chức năng: thực hiện phép hoặc logic, Bit của kết quả = 1 khi 1 trong 2 bit là 1.  
DST  
DST V SRC  
Ví dụ:  
al = 1010 1010  
bl = 1100 1100  
= 1110 1110  
or al,bl  
Cú pháp: or DST, SRC  
Tác động đến cờ: C = O = 0, P, Z, S.  
- Lệnh XOR  
Chức năng: Thực hiện phép “hoặc loại trừ” 2 toán hạng, bit của kết quả bằng 1  
khi 2 bit tương ứng khác nhau.  
Ví dụ:  
al = 1010 1010  
bl = 1100 1100  
xor al,bl = 0110 0110  
Cú pháp: xor DST, SRC  
Cách hay dùng:  
+ Tách bit:  
al = xxxx xxxx  
0001 0000  
and al, 10h = 000x 0000  
Tác động đến cờ: C = O = 0, P, Z, S.  
Ví dụ: Thực hiện ax = 0  
1. mov  
2. and  
3. sub  
4. xor  
ax,0  
ax,0  
ax,ax  
ax,ax  
3 byte  
2 byte  
- Lệnh SHL (Shift Left)  
Chức năng: dịch trái các bit của toán hạng đích đi một số lần nào đó (số lần dịch  
được cất trong thanh ghi CL).  
Cú pháp: SHL DST, CL  
(reg, mem)  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
15  
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
Tác động đến cờ: C, P, Z, S, O.  
Mỗi một lần dịch MSB sẽ đưa qua cờ CF và đưa 0 vào LSB. CL chứa số lần  
dịch mong muốn.  
Nếu dịch một lần thì ta có thể viết trực tiếp.  
VD: shl ax,1  
Nếu số lần dịch ≥ 2 thì phải nhờ đến CL/CX  
shl ax, 4  
mov cl/cx, 4  
≡
shl  
ax, cl/cx  
Ý nghĩa: Dịch trái 1 lần là nhân 2 với số nguyên dương.  
- Lệnh SHR (Shift Right)  
Chức năng: dịch phải logic các bit của toán hạng đích đi một số lần nào đó (số  
lần dịch được cất trong thanh ghi CL).  
Cú pháp: SHR DST, CL  
(reg, mem)  
Tác động đến cờ: C, P, Z, S, O.  
Mỗi một lần dịch LSB sẽ đưa qua cờ CF và đưa 0 vào MSB. CL chứa số lần  
dịch mong muốn.  
Nếu dịch một lần thì ta có thể viết trực tiếp.  
VD: shr ax,1  
Nếu số lần dịch ≥ 2thì phải nhờ đến CL/CX  
shr ax, 4  
mov cl/cx, 4  
≡
shr  
ax, cl/cx  
Ý nghĩa: Dịch phải 1 lần là chia đôi và làm tròn dưới với số nguyên dương  
- Lệnh SAR ( Shift Arithmetically Right)  
Chức năng: dịch phải số học các bit của toán hạng đích đi một số lần nào đó (số  
lần dịch được cất trong thanh ghi CL).  
Cú pháp: SAR DST, CL  
(reg, mem)  
Tác động đến cờ: C, P, Z, S, O.  
Mỗi một lần MSB được giữ lại ( nếu ta hiểu đây là bit dấu của một số nào  
đó thì dấu luôn không đổi sau phép dịch phải số học) còn LSB được đưa vào cờ  
CF. CL chứa sẵn số lần dịch mong muốn.  
Nếu dịch một lần thì ta có thể viết trực tiếp.  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
16  
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
VD:sar ax,1  
Nếu số lần dịch ≥ 2thì phải nhờ đến CL/CX  
sar ax, 4  
mov cl/cx, 4  
≡
sar  
ax, cl/cx  
Ý nghĩa: Dịch phải 1 lần là chia đôi và làm tròn dưới với số có dấu.  
- Lệnh ROL( Rotate All Bits to the Left)  
Chức năng: quay vòng sang trái các bit của toán hạng đích đi một số lần nào đó  
(số lần dịch được cất trong thanh ghi CL). Trong mỗi lần quay giá trị bit cao  
nhất vừa chuyển vào thanh ghi cờ CF đồng thời chuyển vào bit thấp nhất  
Cú pháp: ROL DST, CL  
(reg, mem)  
Tác động đến cờ: C, O.  
.
Nếu dịch một lần thì ta có thể viết trực tiếp.  
VD:rol ax,1  
- Lệnh ROR  
Chức năng: quay vòng sang phải các bit của toán hạng đích đi một số lần nào đó  
(số lần dịch được cất trong thanh ghi CL). Trong mỗi lần quay giá trị bit thấp  
LSB nhất vừa chuyển vào thanh ghi cờ CF đồng thời chuyển vào bit cao nhất  
MSB.  
Cú pháp: ROR DST, CL  
(reg, mem)  
Tác động đến cờ: C, O.  
.
Nếu dịch một lần thì ta có thể viết trực tiếp.  
VD:ror ax,1  
d) Nhóm 4: Các lệnh làm việc với xâu  
Chú ý: Chỉ có 2 lệnh trong nhóm này khi thực hiện làm thay đổi các bit cờ.  
- Lệnh MOVSB/MOVSW (Move String Byte or String Word)  
Chức năng: Chuyển một xâu ký tự theo từng byte(MOVSB) hay theo từng từ  
(MOVSW) từ vùng nhớ trỏ bởi DS:SI sang vùng nhớ trỏ bởi ES:DI. Sau mỗi  
lần dịch chuyển thì giá trị của SI, DI tự động tăng lên 1 hoặc 2 khi cờ hướng  
DF = 0 hoặc giảm đi 1 hoặc 2 khi DF = 1.  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
17  
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
Phần tử của Chuỗi đích  
Phần tử của Chuỗi gốc  
Cú pháp: MOVSB hoặc MOVSW  
Chuẩn bị trước ds:si con trỏ đến đầu xâu SRC, es:di con trỏ đến đầu xâu DST  
Lệnh này không tác động đến cờ.  
- Lệnh LODSB/LODSW (Load String Byte or Word into AL/AX  
Chức năng: Chuyển các kí tự theo từng byte (LODSB) hay theo từng từ  
(LODSW) từ vùng nhớ trỏ bởi DS:SI vào AL/AX.  
Cú pháp: LODSB hoặc LODSW  
Chuẩn bị trước ds:si con trỏ ở đầu xâu, df = 0 hay df = 1.  
Lệnh này không tác động đến cờ.  
- Lệnh STOSB/STOSW (Store AL/AX in String Byte/Word)  
Chức năng: Chuyển các kí tự nằm ở AL(STOSB) /AX (STOSW) vào vùng nhớ  
trỏ bởi ES:DI.  
Cú pháp: STOSB hoặc STOSW hoặc STOS Chuỗi đích.  
Xác lập trước ES:DI trỏ đến đầu vùng nhớ, df = 0 hay df = 1.  
Lệnh này không tác động đến cờ.  
Nhận xét  
1. movsb = lodsb + stosb  
2. movsw = lodsw + stosw  
- Lệnh CMPSB/CMPSW  
Chức năng: So sánh hai xâu kí tự theo từng byte (CMPSB) / theo từng từ  
(CMPSW) giữa hai vùng nhớ trỏ bởi DS:SI và ES:DI. Lệnh này chỉ tạo cờ,  
không lưu lại kết quả so sánh, sau khi so sánh các toán hạng không bị thay đổi.  
Cú pháp: CMPSB hoặc CMPSW hoặc STOS Chuỗi đích.  
Xác lập trước DS:SI trỏ đến đầu xâu 1, ES:DI trỏ đến đầu xâu 2, df = 0 hay df =  
1.  
Tác động đến cờ: ZF = 1 khi hai xâu bằng nhau, ZF = 0 khi hai xâu khác nhau.  
- Tiền tố REP (Repeat String Instruction until CX = 0).  
Chức năng: Lặp đi lặp lai lệnh làm việc với xâu kí tự đằng sau nó cho đến khi  
cx = 0. Sau mỗi lần thực hiện cx tự động giảm đi 1  
Cú pháp: mov cx, số lần  
rep  
lệnh làm việc với xâu ; rep  
movsb  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
18  
Bộ môn Công nghệ điều khiển tự động  
Giáo trình hợp ngữ  
Thuật toán  
1. DS:SI  
2. ES:DI  
3. D = 0  
4. CX = 5  
5. rep movsb; sau mỗi lần cx = cx – 1 cho đến khi cx = 0.  
e) Nhóm 5: Các lệnh rẽ nhánh  
- Lệnh Call  
Chức năng: Gọi chương trình con  
Cú pháp  
Call  
Addr (seg:offset)  
Label  
Tên chương trình con  
reg  
mem  
- Lệnh RET  
Chức năng: quay về chương trình đã gọi chương trình con  
Cú pháp: RET (nằm ở cuối chương trình con)  
- Lệnh INT  
Chức năng: Kích hoạt một ngắt (chuyển sang chạy chương trình con phục vụ  
ngắt) (Ngắt mềm).  
Cú pháp:  
int  
n (số ngắt viết theo số hexa)  
Ví du: int 21h = int 33  
- Lệnh IRET  
Chức năng: quay về chương trình đã kích hoạt nó từ chương trình con phục  
ngắt.  
Cú pháp:  
IRET  
- Lệnh JMP (go to)  
Chức năng: nhảy không điều kiện  
Cú pháp:  
jmp  
Addr (seg:offset)  
Label  
Tên chương trình con  
reg  
mem  
Chú ý: Bước nhảy của lệnh jump < 64k  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
19  
Bộ môn Công nghệ điều khiển tự động  
- Lệnh nhảy có điều kiện  
Giáo trình hợp ngữ  
Với số không có dấu  
(Below/above)  
Với số có dấu  
(Less/ greater)  
Nhảy theo trạng  
thái các bit cờ  
Cmp  
DST, SRC  
Cmp  
DST, SRC  
Jb/jnae Nhãn  
Địa chỉ  
Jbe/jna Nhãn  
Địa chỉ  
KhiDST  
dưới SRC  
Jl/jnge Nhãn  
Khi  
DST<SRC  
Khi  
jc Nhãn  
Địa chỉ CF=1  
jnc Nhãn  
Khi  
Địa chỉ  
Khi  
DST Jle/jng Nhãn  
Khi  
dưới SRC  
hoặc =  
Địa chỉ  
DST≤SRC  
Địa chỉ CF=0  
Je  
Nhãn  
Khi  
Je  
Nhãn  
Khi  
jz Nhãn  
Khi  
Địa chỉ  
DST= SRC  
Địa chỉ  
DST= SRC  
Địa chỉ ZF=1  
Jne  
Nhãn  
Khi  
Jne  
Nhãn  
Khi  
jnz Nhãn  
Khi  
Địa chỉ  
Ja/jnbe Nhãn  
Địa chỉ  
Jae/jnb Nhãn  
Địa chỉ  
DST≠ SRC  
Địa chỉ  
DST≠ SRC  
Khi  
DST > SRC  
Khi  
Địa chỉ ZF=0  
Khi  
DST Jg/jnle Nhãn  
js Nhãn  
Khi  
trên SRC  
Địa chỉ  
Địa chỉ  
Địa chỉ SF=1  
Khi  
DST Jge/jnl Nhãn  
jns Nhãn  
Khi  
trên /=SRC  
DST ≥SRC  
Địa chỉ SF=0  
Chú ý: Bước nhảy các lệnh nhảy có điều kiện phải nhỏ hơn hoặc bằng 128 byte  
- Lệnh LOOP (for của ASM)  
Chức năng: lặp đi lặp lại khối lệnh ASM nằm giữa nhãn và loop cho đến khi cx  
= 0. Mỗi khi thực hiện một vòng lặp giá trị của CX giảm đi 1.  
Cú pháp:  
mov cx, số lần lặp; số lần lặp ≥ 1  
Nhan:  
Khối lệnh ASM  
Loop Nhan  
f) Nhóm 6: Các lệnh thao tác với cờ  
- Lệnh CLC (Clear CF)  
Chức năng: Xoá giá trị cờ CF về 0, CF = 0  
Cú pháp: CLC  
Cờ C = 0  
- Lệnh STC  
Chức năng: Đưa giá trị cờ CF lên 1, CF = 1  
Cú pháp: STC  
Cờ C = 1  
- Lệnh CMC  
Chức năng: Đảo giá trị hiện thời của cờ CF.  
Cú pháp: CMC  
Tác động đền cờ C.  
- Lệnh CLI  
Chức năng: Xoá giá trị của cờ IF về 0(IF = 0). Cấm toán bộ các ngắt cứng trừ  
ngắt MNI.  
Cú pháp: CLI  
Cờ IF = 0.  
- Lệnh STI  
Chức năng: Đưa giá trị của cờ IF lên1 (IF = 1). Cho phép ngắt cứng.  
Ch−¬ng 1- Ng«n ng÷ ASM vµ c¸ch lËp tr×nh  
20  
Tải về để xem bản đầy đủ
pdf 94 trang myanh 23880 Free
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Hợp ngữ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_hop_ngu.pdf