Lập trình hợp ngữ là ngôn ngữ bậc thấp Các VXL chỉ làm việc với các chỉ thị lệnh ở dạng nhị phân và đang ở trong bộ nhớ chính của hệ thống vi xử lý. Các ngôn ngữ bậc cao (chỉ mang tính tương đối ) như Pascal, C, java,... dễ hiểu và dễ viết tuy nhiên 1 chương trình ở ngôn ngữ bậc cao ngắn gọn có thể tạo ra 1 chương trình ở dạng nhị phân chiếm nhiều không gian ở bộ nhớ chính và chương trình được thực hiện chậm hơn....
Trang 1LẬP TRÌNH HỢP NGỮ
Trang 2– Ngôn ngữ máy - Machine languages
• Ngôn ngữ duy nhất của máy tính - CPU– Hợp ngữ - Assembly languages
– Ngôn ngữ cấp cao - High-level languages
Trang 3Ngôn ngữ máy - Machine languages
trực tiếp.
– Phụ thuộc vào máy tính cụ thể
– Dạng nhị phân {0,1}*
– Rất khó đọc hiểu
– Khó có khả năng viết chương trình trực tiếp
• Khó nhớ hàng chục ngàn lệnh dạng {0,1}*
• Rất khó xác định & sửa lỗi
• Không được sử dụng trong thực tế để viết chương trình
Trang 4Hợp ngữ - Assembly Languages
• Sử dụng các từ khóa tiếng Anh cho các lệnh hay nhóm lệnh của mã máy.
• Dễ đọc và dễ hiểu hơn
– Các lệnh còn đơn giản nên phải dùng nhiều lệnh.
– Chưa có những cấu trúc điều khiển thuận tiện
– Khả năng tìm và sửa lỗi cũng chưa thuận tiện.
• Nền tảng xây dựng các ngôn ngữ cấp cao
Trang 5Ngôn ngữ cấp cao
• Một câu lệnh diễn tả nhiều động thái
• Có cấu trúc ngày càng giống ngôn ngữ tự
nhiên (tiếng Anh)
• Được dịch sang assembly hay mã máy
bằng các chương trình dịch trước khi thực thi.
– Source code & Executed code
• Được phân làm nhiều lớp
– Lập trình goto
– Lập trình cấu trúc – Structured
– Lập trình hướng đối tượng – Object Oriented
– Các dạng khác
Trang 6• Học ngôn ngữ lập trình VS Học ngôn ngữ tự nhiên
– Quy tắc ngữ pháp đơn giản
– Từ vựng ít, tự quy định
– Cấu trúc câu đơn giản
• Hạn chế và khó khăn của sử dụng ngôn ngữ lập trình.
Trang 7Chương trình dịch
• Dùng để dịch từ một ngôn ngữ lập trình này sang ngôn ngữ
lập trình khác
• Mục tiêu cuối cùng là dịch sang mã máy để có được executed
code –> chương trình thực thi
– Dịch và sửa lỗi chương trình
– Chạy thử và sửa lỗi
Trang 8Một số khái niệm khác
• Lỗi và sửa lỗi
– Syntax error – lỗi ngữ pháp
– Semantic error- lỗi ngữ nghĩa
– Runtime error - Lỗi thực thi
• Debug – Tìm và sửa lỗi
• Dữ liệu, kiểu dữ liệu
– Các kiểu dữ liệu cơ bản
• integer, long, character, byte, ….
• Real (double, float)
• Kiểu khác: string
– Kiểu dữ liệu có cấu trúc: array, string, record,
• Biến (Variable) & Hằng (Constant)
• Giải thuật: khái niệm, công cụ biểu diễn
• Flow chart – lưu đồ
Trang 9Cấu trúc điều khiển cơ bản
If <condition> then Statement;
If <condition> then Statement 1
While <condition> do Statement;
Repeat Statement until <condition>;
For counter=start value to end value do Statement;
For counter=start value downto end value do Statement
Trang 11• Lập trình hướng đối tượng
– Java, C++, Object Pascal,…
• Khác
– Prolog, LISP, Visual basic (VB), VC++, J++, Delphi, ASP, PHP, – Visual studio NET: VB.NET, ASP.NET, C++.NET, C#
Trang 12– một lệnh ( instruction) : được trình biên dịch
( Assembler =ASM) chuyển thành mã máy.
– một chỉ dẫn của Assembler ( Assembler directive) :
ASM không chuyển thành mã máy
Trang 13Trường Tên ( Name Field)
• Trường tên được dùng cho nhãn lệnh , tên thủ tục
và tên biến ASM sẽ chuyển tên thành địa chỉ bộ
nhớ
• Tên có thể dài từ 1 đến 31 ký tự Trong tên chứa
các ký tự từ a-z , các số và các ký tự đặc biệt
sau : ? ,@ , _ , $ và dấu
• Không được phép có ký tự trống trong phần tên
Nếu trong tên có ký tự thì nó phải là ký tự đầu tiên
• Tên không được bắt đầu bằng một số
ASM không phân biệt giữa ký tự viết thường và
viết hoa
Trang 14Phân biệt
Tên hợp lệ Tên không hợp lệ
COUNTER1 TWO WORDS
@CHARACTER 2ABC
SUM_OF_DIGITS A45.28
DONE? YOU&ME
TEST ADD-REPEAT
Trang 15Các kiểu số liệu trong chương trình hợp
ngữ
• Các số
• Các ký tự
• Các biến ( variables)
Trang 16Nhắc lại phương pháp định địa chỉ
– Địa chỉ trong lệnh là địa chỉ ô nhớ của toán hạng
• Gián tiếp qua thanh ghi
– Thanh ghi chứa địa chỉ ô nhớ của toán hạng
Trang 17Thanh ghi CPU 8086
• 14 thanh ghi 16 bit
• 5 nhóm
– Thanh ghi đoạn
• CS (code segment), DS (data segment),
SS (stack segment), ES (extra segment)
– Thanh ghi con trỏ
• IP (instruction pointer), SP (stack pointer),
BP (base pointer)
– Thanh ghi chỉ số
• SI (source index), DI (Destination index)
– Thanh ghi đa dụng
– Thanh ghi cờ
Trang 18Thanh ghi đa dụng
– Sử dụng cho xuất nhập và các lệnh nhân chia
• Các thanh ghi đa dụng có thể “chia nhỏ” thành 2 thanh ghi 8-bit (cao và thấp)
– AH,AL,BH,BL,CH,CL,DH,DL
Trang 19Thanh ghi cờ (Flag)
TF Trap 8 CPU thực hiện từng bước
SF Sign 7 Kiểm tra kết quả là số âm
ZF Zero 6 Kiểm tra kết quả bằng 0
AF Auxiliary Carry 4
PF Parity 2 Kiểm tra số bit 1 chẵn
CF Carry 0 Tràn số không dấu
Trang 20• Một số hex phải bắt đầu bởi 1 chữ số thập phân
và phải kết thúc bởi h hoặc H
Ví dụ : 183Dh, 1AC0h, 0FFFFH
Trang 21Các ký tự
• Ký tự và một chuỗi các ký tự phải được đóng
giữa 2 dấu ngoặc đơn hoặc hai dấu ngoặc kép
Ví dụ: ‘ A ’ và “ HELLO ”
• Các ký tự đều được chuyển thành mã ASCII
bởi ASM Do đó trong một chương trình ASM
sẽ xem khai báo ‘A’ và 41h ( mã ASCII của A) là giống nhau
Trang 22Các biến ( variables)
Trong ASM biến đóng vai trò như trong ngôn ngữ cấp cao Mỗi biến có một loại dữ liệu và nó được gán một địa chỉ bộ nhớ sau khi dịch chương trình
PSEUDO-OP STANDS FOR
DB define byte
DW define word ( doublebyte)
DD define doubeword ( 2 từ liên tiếp)
DQ define quadword ( 4 từ liên tiếp )
DT define tenbytes ( 10 bytes liên tiếp)
Trang 23Chuỗi các ký tự ( character strings)
• Một mảng các mã ASCII có thể được định nghĩa bằng một
• Bên trong một chuỗi , ASM sẽ phân biệt chữ hoa và chữ thường
Vì vậy chuỗi ‘abc’ sẽ được chuyển thành 3 bytes : 61h ,62h và 63h.
• Trong ASM cũng có thể tổ hợp các ký tự và các số trong một
Trang 24• Cũng có thể dùng EQU để định nghĩa một chuỗi:
Sau khi có khai báo này, thay cho
MSG DB ‘TYPE YOUR NAME ’
↔
MSG DB PROMPT
Trang 25Cấu trúc của một chương trình hợp ngữ
• Một chương trình ngôn ngữ máy bao gồm
:
– Mã ( code)
– Số liệu ( data)
– Ngăn xếp (stack )
• Mỗi một phần chiếm một đoạn bộ nhớ
Mỗi một đoạn chương trình là được
chuyển thành một đoạn bộ nhớ bởi ASM
Trang 26Các kiểu bộ nhớ ( memory models)
• Độ lớn của mã và số liệu trong một
chương trình được quy định bởi chỉ dẫn MODEL nhằm xác định kiểu bộ nhớ dùng với chương trình Cú pháp của chỉ dẫn
MODEL như sau :
.MODEL memory_model
Trang 27Đoạn số liệu
• Đoạn số liệu của chương trình chứa các khai báo biến, khai báo
hằng Để bắt đầu đoạn số liệu chúng ta dùng chỉ dẫn DATA với
Trang 28Đoạn ngăn xếp
• Mục đích của việc khai báo đoạn ngăn xếp
là dành một vùng nhớ (vùng stack) để lưu trữ cho stack
Cú pháp của lệnh như sau : STACK
size
• Nếu không khai báo size thì 1KB được
dành cho vùng stack
.STACK 100h ; dành 256 bytes cho vùng stack
Trang 29Đoạn mã
• Đoạn mã chứa các lệnh của chương trình
Bắt đầu đoạn mã bằng chỉ dẫn CODE
như sau :
.CODE
• Bên trong đoạn mã các lệnh thường được
tổ chức thành thủ tục (procedure) mà cấu trúc của một thủ tục như sau :
name PROC ; body of the procedure name ENDP
Trang 31Tạo ra và chạy một chương trình hợp ngữ
Có 4 bước để tạo ra và chạy một chương trình hợp ngữ là :
• Dùng một trình soạn thảo văn bản để tạo ra tập tin chương trình nguồn ( source program file )
• Dùng một trình biên dịch (Assembler ) để tạo ra tập tin đối tượng (object file) ngôn ngữ máy
• Dùng trình LINK để liên kết một hoặc nhiều
tập tin đối tượng rồi tạo ra file thực thi được
• Cho thực hiện tập tin EXE hoặc COM
Trang 33Lệnh MOV
MOV dst,src
• Chuyển nội dung toán hạng src vào toán hạng dst
• Toán hạng nguồn src có thể là thanh ghi (reg), bộ nhớ
(mem) hay giá trị tức thời (immed); toán hạng đích dst có thể là reg hay mem
• Lệnh MOV không ảnh hưởng đến các cờ
• Không thể chuyển trực tiếp dữ liệu giữa hai ô nhớ mà
phải thông qua một thanh ghi
Trang 34Lệnh MOV
• MOV AX, WORD1
Trang 35Lệnh MOV
Trang 37Lệnh XCHG
• XCHG AH, BL:
Trang 39Ngắt 21h
MOV AH,1 ;Hàm vào 1 phím
INT 21H ;Mã ASCII trong AL
Trang 40Ngắt 21h
MOV AH,2 ;Sử dụng hàm 2
Trang 43Ngắt 21h
• Hiển thị một chuỗi
• Ký tự $ đánh dấu kết thúc chuỗi và không được hiển
thị
Trang 44Hàm LEA (Load Effective Address)
• Ví dụ: LEA DX,MSG : nhập địa chỉ tương đối của biến MSG vào DX
MSG BD “HELLO WORLD!$”
LEA DX, MSG ;Lấy thông báo
INT 21h ;Hiển thị chuỗi
Trang 45Khởi tạo đoạn dữ liệu
• Một chương trình có đoạn chứa dữ liệu sẽ
bắt đầu với 2 lệnh sau:
Trang 47-a
* /
Trang 48Lệnh ADD
• Dạng lệnh :
ADD reg,reg ADD reg,immed
ADD mem,reg ADD mem,immed
ADD reg,mem ADD accum,immed
• Giải thích : thđ ← thđ + thn
Cộng toán hạng nguồn vào toán hạng đích Kết quả cất vào toán hạng đích
• Tác động cờ :
Trang 50Lệnh SUB
• Dạng lệnh :
SUB reg,reg SUB reg,immed
SUB mem,reg SUB mem,immed
SUB reg,mem SUB accum,immed
• Giải thích : thđ ← thđ - thn
Trừ toán hạng đích cho toán hạng
nguồn Kết quả cất vào toán hạng đích
• Tác động cờ :
Xem thêm SBB
Trang 51Ví dụ
SUB DL,AL ; DL ← DL - AL
SUB CX,[DI] ; CX ← CX - [DI+1,DI] SUB BP,4 ; BP ← BP - 4
Trang 55Lệnh MUL
• Dạng lệnh :
• Giải thích : nhân số không dấu
– Trường hợp toán hạng nguồn là 8 bit thì :
AX ← AL * thn8 – Trường hợp toán hạng nguồn là 16 bit thì : {DX AX} ← AX * thn16
• Tác động cờ :
Trang 57Lệnh IMUL
• Tương tự lệnh MUL, nhưng xử lý trên số
có dấu
Trang 58Lệnh DIV
• Dạng lệnh :
• Giải thích : chia hai số không dấu
– Nếu toán hạng nguồn là 8 bit thì :
AL ← (AX / thn8)
AH ← số dư của (AX / thn8)
– Toán hạng nguồn 16 bit thì :
AX ← (DXAX / thn16)
DX ← số dư của (DXAX / thn16)
• Tác động cờ :
Trang 59Lệnh IDIV
• Tương tự lệnh DIV nhưng làm việc trên
số có dấu
Trang 60SHL SHR SAL SAR
Trang 61Lệnh AND
• Dạng lệnh :
AND reg,reg AND reg,immed AND mem,reg AND mem,immed AND reg,mem AND accum,immed
• Giải thích : thđ ← thđ AND thn
• Tác động cờ:
Trang 62Ví dụ:
MOV AL, 'a' ; AL = 01100001b
AND AL, 11011111b ; AL = 01000001b ('A')
Trang 65Lệnh XOR
• Dạng lệnh :
XOR reg,reg XOR reg,immed XOR mem,reg XOR mem,immed XOR reg,mem XOR accum,immed
• Giải thích : thđ ← thđ XOR thn
• Tác động cờ:
Trang 67Lệnh NOT
• Dạng lệnh :
NOT reg NOT mem
• Giải thích : thđ ← đảo từng bit ( thđ )
• Tác động cờ : (không thay đổi)
• Ví dụ:
MOV AL, 00011011b
NOT AL ; AL = 11100100b
Trang 68Lệnh SHL/SAL
• Dạng lệnh :
SHL reg,CL SHL mem,CL
• Giải thích : Dịch trái Dạng SHL reg,1
dùng để dịch trái 1 bit Dạng SHL reg,CL dùng để dịch trái nhiều bit Lúc đó thanh ghi CL chứa số bit cần dịch
• Tác động cờ :
Trang 70Chuyển ngôn ngữ cấp cao thành ngôn
ngữ ASM Giả sử A và B là 2 biến từ
Chúng ta sẽ chuyển các mệnh đề sau trong ngôn ngữ cấp cao ra ngôn ngữ ASM Mệnh đề B=A
MOV AX,A ; đưa A vào AX
MOV B,AX ; đưa AX vào B
Mệnh đề A=5-A
MOV AX,5 ; đưa 5 vào AX
SUB AX,A ; AX=5-A
MOV A,AX ; A=5-A
cách khác :
NEG A ;A=-A
ADD A,5 ;A=5-A
Mệnh đề A=B-2*A
MOV AX,B ;Ax=B
SUB AX,A ;AX=B-A
SUB AX,A ;AX=B-2*A
MOV A,AX ;A=B-2*A
Trang 71Chuong 8 : Cau truc DK va Vong
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.
Trang 72Chuong 8 : Cau truc DK va Vong
Lệnh JMP (Jump)
• Công dụng :Chuyển điều khiển không điều kiện Cú pháp : JMP đích
nhảy trong cùng 1 segment.
sang segment khác.
Trang 73Lệnh CMP
• Cú pháp: CMP đích, nguồn
• 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.
• Lệnh CMP giống hệt lệnh SUB trừ việc toán
hạng đích không thay đổi.
Trang 74JG label1
JL label2 JMP label3
Trang 75LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC
TOÁN HẠNG KHÔNG DẤU (1)
• Lệnh JA label: (Jump if Above)
• Lệnh JBE label: (Jump if Below or Equal)
– Nếu CF = 1 hoặc ZF = 1 thì JMP label
• Lệnh JNA label: (Jump if Not Above)
– Giống lệnh JBE
• Lệnh JNAE label: (Jump if Not Above or Equal)
– Giống lệnh JB
Trang 76LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC
TOÁN HẠNG KHÔNG DẤU (2)
• Lệnh JNB label: (Jump if Not Below)
• Lệnh JLE label: (Jump if Less or Equal)
– Nếu CF <> OF hoặc ZF = 1 thì JMP label
Trang 77LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC
TOÁN HẠNG KHÔNG DẤU (3)
• Lệnh JNG label: (Jump if Not Greater)
Trang 78LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC
TOÁN HẠNG KHÔNG DẤU (4)
• Lệnh JZ label: (Jump if Zero)
Trang 79LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC
TOÁN HẠNG KHÔNG DẤU (5)
• Lệnh JNS label: (Jump if No Sign)
Trang 80INT 21H INC DL LOOP IN_
Trang 81Cấu trúc của ngôn ngữ cấp cao
• Chúng ta sẽ dùng các lệnh nhảy để
thực hiện các cấu trúc tương tự như trong ngôn ngữ cấp cao
Trang 82Cấu trúc rẽ nhánh
IF condition is true THEN
execute true branch statements
END IF
Hoặc
IF condition is true THEN
execute true branch statements
ELSE
execute false branch statements
END_IF
Trang 83Ví dụ 1: Thay thế giá trị trên AX bằng giá
trị tuyết đối của nó
• Thuật toán:
IF AX<0
THEN
replace AX by - AX END-IF
• Mã hoá:
; if AX<0
CMP AX,0 JNL END_IF ; no , exit
;then
NEG AX , yes , change sign END_IF :
Trang 84Ví dụ 2 : giả sử AL và BL chứa ASCII code của 1 ký
tự Hãy xuất ra màn hình ký tự trước ( theo thứ
tự ký tự )
• Thuật toán
IF AL<= BL THEN
display AL ELSE
display character in BL END_IF
MOV DL,BL DISPLAY:
INT 21H END_IF :
Trang 85Rẽ nhánh nhiều hướng
• Case là một cấu trúc rẽ nhánh nhiều hướng
Có thể dùng để test một thanh ghi hay , biến nào đó hay một biểu thức mà giá trị cụ thể
Trang 86Ví dụ
– Nếu AX âm thì đặt -1 vào BX – Nếu AX bằng 0 thì đặt 0 vào BX – Nếu AX dương thì đặt 1 vào BX
Trang 87MOV BX,-1 JMP END_CASE ZERO:
MOV BX,0 JMP END_CASE POSITIVE:
MOV BX,1 JMP END_CASE END_CASE :
Trang 88Rẽ nhánh với một tổ hợp các điều kiện
• Đôi khi tình trạng rẽ nhánh trong các lệnh
IF , CASE cần một tổ hợp các điều kiện dưới dạng :
Condition_1 AND Condition_2 Condition_1 OR Condition_2
Trang 89Ví dụ 1: Đọc một ký tự và nếu nó là ký tự
hoa thì in nó ra màn hình
• Thuật toán :
Read a character ( into AL)
IF ( ‘A’<= character ) AND ( charater <= ‘Z’) THEN display character
END_IF
Trang 91Ví dụ 2: Đọc một ký tự , nếu ký tự đó là ‘Y’ hoặc ‘y’ thì in nó lên màn hình , ngược lại thì kết thúc
chương trình
• Thuật toán
Read a charcter ( into AL)
IF ( character =‘Y’) OR ( character=‘y’)
THEN dispplay it
ELSE
terminate the program END_IF
Trang 92Cài đặt
;read a character
MOV AH,2 INT 21H ; character in AL
; IF ( character =‘y’ ) OR ( charater = ‘Y’)
CMP AL,’y’ ; char =‘y’?
JE THEN ;yes , goto display it CMP AL,’Y’ ; char =‘Y’?
JE THEN ; yes , goto display it JMP ELSE_ ;no , terminate
THEN :
MOV DL,AL MOV AH,2 INT 21H JMP END_IF ELSE_:
MOV AH,4CH INT 21h
END_IF :
Trang 93Cấu trúc lặp
• Một vòng lặp gồm nhiều lệnh được lặp lại
, số lần lặp phụ thuộc điều kiện
Trang 94Vòng FOR
• Lệnh LOOP có thể dùng để thực hiện vòng FOR
LOOP destination_label
• Số đếm cho vòng lặp là thanh ghi CX mà ban đầu
nó được gán 1 giá trị nào đó Khi lệnh LOOP
được thực hiện CX sẽ tự động giảm đi 1 Nếu CX chưa bằng 0 thì vòng lặp được thực hiện tiếp tục Nếu CX=0 lệnh sau lệnh LOOP được thực hiện
• Lưu ý rằng vòng FOR cũng như lệnh LOOP thực hiện ít nhất là 1 lần Do đó nếu ban đầu CX=0 thì vòng lặp sẽ làm cho CX=FFFH, tức là thực hiện lặp đến 65535 lần
Trang 96Vòng WHILE
• Vòng WHILE phụ thuộc vào 1 điều
kiện Nếu điều kiện đúng thì thực hiện vòng WHILE Vì vậy nếu điều kiện sai thì vòng WHILE không thực hiện gì cả
Trang 97Ví dụ : Viết đoạn mã để đếm số ký tự được nhập vào trên cùng một hàng
MOV DX,0 ; DX để đếm số ký tự MOV AH,1 ;hàm đọc 1 ký tự
INT 21h ; đọc ký tự vào AL WHILE_:
CMP AL,0DH ; có phải là ký tự CR?
JE END_WHILE ; đúng , thoát INC DX ;tăng DX lên 1
INT 21h ; đọc ký tự JMP WHILE_ ; lặp
END_WHILE :
Trang 98Vòng REPEAT
• Cấu trúc của REPEAT là
repeat statements until condition
• Trong cấu trúc repeat mệnh đề được thi hành đồng thời điều kiện được kiểm tra Nếu điều kiện đúng thì vòng lặp kết
thúc