1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu tham khỏa: Lập trình hợp ngữ

109 24 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 109
Dung lượng 732,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

LẬ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 3

Ngô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 4

Hợ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 5

Ngô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 7

Chươ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 8

Mộ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 9

Cấ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 13

Trườ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 14

Phâ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 15

Cá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 16

Nhắ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 17

Thanh 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 18

Thanh 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 19

Thanh 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 21

Cá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 22

Cá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 23

Chuỗ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 25

Cấ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 26

Cá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 31

Tạ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 33

Lệ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 34

Lệnh MOV

MOV AX, WORD1

Trang 35

Lệnh MOV

Trang 37

Lệnh XCHG

XCHG AH, BL:

Trang 39

Ngắt 21h

MOV AH,1 ;Hàm vào 1 phím

INT 21H ;Mã ASCII trong AL

Trang 40

Ngắt 21h

MOV AH,2 ;Sử dụng hàm 2

Trang 43

Ngắ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 44

Hà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 45

Khở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 48

Lệ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 50

Lệ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 51

Ví dụ

SUB DL,AL ; DL ← DL - AL

SUB CX,[DI] ; CX ← CX - [DI+1,DI] SUB BP,4 ; BP ← BP - 4

Trang 55

Lệ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 57

Lệnh IMUL

• Tương tự lệnh MUL, nhưng xử lý trên số

có dấu

Trang 58

Lệ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 59

Lệnh IDIV

• Tương tự lệnh DIV nhưng làm việc trên

số có dấu

Trang 60

SHL SHR SAL SAR

Trang 61

Lệ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 62

Ví dụ:

MOV AL, 'a' ; AL = 01100001b

AND AL, 11011111b ; AL = 01000001b ('A')

Trang 65

Lệ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 67

Lệ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 68

Lệ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 70

Chuyể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 71

Chuong 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 72

Chuong 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 73

Lệ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 74

JG label1

JL label2 JMP label3

Trang 75

LỆ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 76

LỆ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 77

LỆ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 78

LỆ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 79

LỆ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 80

INT 21H INC DL LOOP IN_

Trang 81

Cấ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 82

Cấ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 83

Ví 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 84

Ví 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 85

Rẽ 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 86

Ví 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 87

MOV BX,-1 JMP END_CASE ZERO:

MOV BX,0 JMP END_CASE POSITIVE:

MOV BX,1 JMP END_CASE END_CASE :

Trang 88

Rẽ 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 89

Ví 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 91

Ví 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 92

Cà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 93

Cấ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 94

Vò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 96

Vò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 97

Ví 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 98

Vò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

Ngày đăng: 11/05/2021, 01:47

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w