1. Trang chủ
  2. » Luận Văn - Báo Cáo

môn kiến trúc máy tính hợp ngữ assembly language

26 0 0
Tài liệu đã được kiểm tra trùng lặp

Đ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 26
Dung lượng 1,26 MB

Nội dung

Kiểu dữ liệu của dữ liệu nguyên thủy xác định số lượng bit cần thiết để lưu trữ giá trị.Các kiểu dữ liệu nguyên thủy phổ biến trong hợp ngữ bao gồm:· BYTE: Kiểu dữ liệu 8 bit· WORD: Kiểu

Trang 1

HỌC VIỆN HÀNG KHÔNG VIỆT NAM KHOA CÔNG NGHỆ THÔNG TIN

MÔN: KIẾN TRÚC MÁY TÍNH

Giảng viên phụ trách: Nguyễn Hữu Hiệp

Sinh viên : Ngô Anh Kiệt - 2331540206

Đoàn Gia Bảo Ngọc – 2331540045

Trang 2

LỜI MỞ ĐẦU

Hợp ngữ (Assembly language) là một ngôn ngữ lập trình cấp thấp,

sử dụng các mã máy để điều khiển máy tính Hợp ngữ có thể được sử dụng để viết các chương trình máy tính hiệu quả và tối ưu, nhưng nó cũng có thể khó học và sử dụng.

Hợp ngữ được tạo thành từ các lệnh máy, là các mã nhị phân có thể được máy tính hiểu và thực thi Mỗi lệnh máy tương ứng với một hành động cụ thể mà máy tính sẽ thực hiện Ví dụ, lệnh máy ADD sẽ cộng hai số lại với nhau, lệnh máy MOV sẽ di chuyển dữ liệu từ một vị trí bộ nhớ sang vị trí khác, và lệnh máy JMP sẽ chuyển hướng thực thi đến một vị trí trong chương trình.

Hợp ngữ thường được sử dụng để viết các chương trình hệ thống, chẳng hạn như trình điều khiển thiết bị và hệ điều hành Các chương trình này thường yêu cầu hiệu suất tối đa và cần kiểm soát chặt chẽ đối với phần cứng máy tính.

Hợp ngữ cũng có thể được sử dụng để viết các chương trình ứng dụng, chẳng hạn như trò chơi và ứng dụng phần mềm Tuy nhiên, hợp ngữ thường không được sử dụng cho các ứng dụng này vì nó khó học và

sử dụng hơn các ngôn ngữ lập trình cấp cao

2

Trang 3

M C L C:Ụ Ụ

I.Cú pháp của chương trình hợp ngữ 4

II.Dữ liệu cho chương trình hợp ngữ: 5

Dữ liệu nguyên thủy: 6

Dữ liệu cấu trúc: 6

Dữ liệu số: 7

Dữ liệu ký tự: 7

III.Tập lệnh hợp ngữ(Nhóm lệnh chuyển dữ liệu): 8

1.Nhóm lệnh chuyển dữ liệu đa dụng: 8

Lệnh MOV: 8

Lệnh PUSH: 9

Lệnh POP: 10

Lệnh XCHG: 11

Lệnh XLAT: 12

2.Nhóm lệnh chuyển dữ liệu qua cổng: 13

Lệnh IN: 13

Lệnh OUT: 13

3.Nhóm lệnh chuyển cờ hiệu (thanh ghi trạng thái): 14

Lệnh PUSHF (push flag): 14

Lệnh POPF (pop flag): 14

Lệnh SAHF (Store AH into Flags): 15

Lệnh LAHF (Load AH from Flags): 16

4.Nhóm lệnh chuyển địa chỉ: 18

Lệnh LEA (load Efective address): 18

Lệnh LDS: (Load pointer using DS): 19

Lệnh LES (Load register and ES with words from memory): 20

5.Nhóm lệnh xử lý chuỗi: 21

Lệnh MOVS: chuyển dữ liệu từ vùng nhớ này sang vùng nhớ khác 21

Lệnh CMPS: so sánh nội dung 2 vùng nhớ 22

Lệnh SCAS: 22

Lệnh LODS: 22

Lệnh STOS: 22

IV Câu hỏi lệnh chuyển dữ liệu trong hợp ngữ: 23

3

Trang 4

I.Cú pháp của chương trình hợp ngữ

Trong chương trình hợp ngữ, mỗi lệnh được đặt trên một dòng – dòng lệnh;lệnh có 2 dạng:

Lệnh thật: là các lệnh gợi nhớ của vi xử lý

VD: MOV, SUB, ADD, …

Khi dịch, lệnh gợi nhớ được dịch ra mã máy

Lệnh giả: là các hướng dẫn chương trình dịch

VD: MAIN PROC, DATA, END MAIN, …

Khi dịch, lệnh giả không được dịch ra mã máy mã chỉ có tác dụng định hướng cho chương trình dịch

Không phân biệt chữ hoa hay chữ thường trong các dòng lệnh hợp ngữ khi được dịch

Cấu trúc dòng lệnh hợp ngữ:

Một câu lệnh hợp ngữ thường bao gồm các thành phần sau:

liệu từ một vị trí bộ nhớ sang vị trí khác

hoặc hai địa chỉ bộ nhớ cần di chuyển dữ liệu

[Tên] [mã lệnh] [các toán hạng] [chú giải]

5

Trang 5

START: MOV AH,100 ; chuyển 100 vào thanh ghi AH

Các trường của dòng lệnh:

Tên:

- Là nhãn, tên biến, hằng hoặc thủ tục sau nhãn là dấu hai chấm (:)

- Các tên sẽ được chương trình dịch gán địa chỉ ô nhớ

- Tên chỉ có thể gồm các chữ cái, chữ số, dấu gạch dưới và phải bắt đầubằng 1 chữ cái

- Bắt đầu bằng dấu chấm phẩy (;)

II.Dữ liệu cho chương trình hợp ngữ:

Dữ liệu trong chương trình hợp ngữ được lưu trữ trong bộ nhớ máy tính Dữ liệu

có thể được chia thành hai loại:

-Dữ liệu nguyên thủy: Dữ liệu nguyên thủy là dữ liệu không được cấu trúc, chẳng hạn như số, ký tự và boolean

6

Trang 6

-Dữ liệu cấu trúc: Dữ liệu cấu trúc là dữ liệu được cấu trúc thành các phần, chẳng hạn như mảng, cấu trúc và tập hợp.

Dữ liệu nguyên thủy:

Dữ liệu nguyên thủy được lưu trữ trong bộ nhớ dưới dạng các giá trị nhị phân Kiểu dữ liệu của dữ liệu nguyên thủy xác định số lượng bit cần thiết để lưu trữ giá trị

Các kiểu dữ liệu nguyên thủy phổ biến trong hợp ngữ bao gồm:

· BYTE: Kiểu dữ liệu 8 bit

· WORD: Kiểu dữ liệu 16 bit

· DWORD: Kiểu dữ liệu 32 bit

· QWORD: Kiểu dữ liệu 64 bit

Ví dụ, biến a sau là kiểu dữ liệu 8 bit và có thể lưu trữ một giá trị từ 0 đến 255:VAR a:BYTE

Dữ liệu cấu trúc:

Dữ liệu cấu trúc là dữ liệu được cấu trúc thành các phần Mỗi phần của dữ liệu cấu trúc được gọi là thành phần

Các kiểu dữ liệu cấu trúc phổ biến trong hợp ngữ bao gồm:

-Mảng: Mảng là một tập hợp các giá trị có cùng kiểu dữ liệu Các giá trị trong mảng được lưu trữ liên tiếp trong bộ nhớ

-Cấu trúc: Cấu trúc là một kiểu dữ liệu được tạo thành từ nhiều thành phần Mỗi thành phần của cấu trúc có thể có kiểu dữ liệu khác nhau

-Tập hợp: Tập hợp là một danh sách các giá trị có thể lặp lại Các giá trị trong tập hợp được lưu trữ theo thứ tự không rõ ràng

Ví dụ, mảng a sau có 10 phần, mỗi phần là một số nguyên:

VAR a [10]: BYTE

7

Trang 7

Cấu trúc b sau có hai thành phần, mỗi thành phần là một số nguyên:TYPE

Tập hợp c sau có 5 phần, mỗi phần là một chữ cái:

VAR c: SET OF CHAR

Dữ liệu số:

Thập phân: 0-9

Thập lục phân: 0-9, A-F

Bắt đầu bằng 1 chữ (A-F) thì thêm 0 vào đầu

Thêm ký hiệu H (Hexa) ở cuối

Trang 8

‘A’=65, ‘a’=97

III.Tập lệnh hợp ngữ(Nhóm lệnh chuyển dữ liệu):

1.Nhóm lệnh chuyển dữ liệu đa dụng:

destination là địa chỉ bộ nhớ nơi dữ liệu sẽ được lưu trữ

source là địa chỉ bộ nhớ hoặc giá trị dữ liệu sẽ được di chuyển

-Lệnh MOV có thể được sử dụng để di chuyển dữ liệu giữa các biến, giữa biến và

ô nhớ, hoặc giữa hai ô nhớ

Ví dụ: Lệnh MOV sau sẽ di chuyển giá trị của biến a sang biến b:

liệu khác nhau Trong trường hợp này, bộ xử lý sẽ tự động chuyển đổi kiểu dữ liệu của dữ liệu Ví dụ, lệnh MOV sau sẽ di chuyển giá trị của biến a, là một số nguyên

8 bit, sang biến b, là một số nguyên 16 bit:

Trang 9

Lệnh PUSH:

-Là một lệnh thường được sử dụng để lưu trữ dữ liệu vào ngăn xếp Ngăn xếp là một cấu trúc dữ liệu LIFO (Last In First Out), nghĩa là dữ liệu được lưu trữ vào ngăn xếp theo thứ tự ngược lại với thứ tự lấy ra

operand là dữ liệu cần lưu trữ vào ngăn xếp Có thể là một thanh ghi, một giá trị số hoặc một địa chỉ bộ nhớ

Hoạt động:

- Lệnh push sẽ đẩy operand lên đỉnh ngăn xếp

- Ngăn xếp là một cấu trúc dữ liệu nằm trong bộ nhớ Khi một lệnh push được thực thi, CPU sẽ ghi operand vào vị trí đầu tiên của ngăn xếp Sau đó, CPU sẽ tăng chỉ số ngăn xếp lên 1 byte

Đoạn mã:

Trong ví dụ này, lệnh push sẽ lưu trữ các giá trị 10, 20 và 30 vào ngăn xếp, theo thứ tự ngược lại

Lợi ích của lệnh push:

Lệnh push cho phép lưu trữ dữ liệu tạm thời vào ngăn xếp Điều này có thể hữu ích cho các tình huống sau:

Lưu trữ dữ liệu cần sử dụng trong một hàm

Lưu trữ dữ liệu cần sử dụng trong một vòng lặp

Lưu trữ dữ liệu cần sử dụng trong một phép tính

10

Trang 10

Lệnh push có thể được sử dụng để gọi hàm Khi một hàm được gọi, các tham số của hàm sẽ được đẩy lên ngăn xếp Sau khi hàm được thực thi, các tham số sẽ được lấy ra khỏi ngăn xếp.

Lệnh POP:

-Là một lệnh thường được sử dụng để lấy dữ liệu ra khỏi ngăn xếp Ngăn xếp là một cấu trúc dữ liệu LIFO (Last In First Out), nghĩa là dữ liệu được lấy ra khỏi ngăn xếp theo thứ tự ngược lại với thứ tự lưu trữ

đó, CPU sẽ giảm chỉ số ngăn xếp xuống 1 byte

Đoạn mã:

Trong ví dụ này, lệnh pop sẽ lấy giá trị 30 từ đỉnh ngăn xếp và lưu trữ vào thanh ghi AX

Lợi ích của lệnh pop:

11

Trang 11

Lệnh pop cho phép lấy dữ liệu tạm thời ra khỏi ngăn xếp Điều này có thể hữu ích cho các tình huống sau:

Lấy dữ liệu đã được lưu trữ trong một hàm

Lấy dữ liệu đã được lưu trữ trong một vòng lặp

Lấy dữ liệu đã được lưu trữ trong một phép tính

Lệnh pop có thể được sử dụng để trả về từ hàm Khi một hàm trả về, dữ liệu đã được lưu trữ trên ngăn xếp bởi hàm sẽ được lấy ra khỏi ngăn xếp

giá trị của hai thanh ghi hoặc một thanh ghi với một vùng nhớ Trong ngữ cảnh củalập trình hợp ngữ, lệnh xchg có thể được sử dụng để đổi giá trị giữa hai biến hoặc hai thanh ghi

-Ví dụ trong ngôn ngữ lập trình Assembly, lệnh xchg có thể được sử dụng như sau:xchg ax, bx ; Đổi giá trị giữa thanh ghi AX và BX

xchg [si], ax ; Đổi giá trị giữa nội dung tại địa chỉ con trỏ DS:SI và thanh ghi AXTrong các ngôn ngữ lập trình hiện đại, đặc biệt là trong các ngôn ngữ bậc cao, việc

sử dụng lệnh xchg trực tiếp từ ngôn ngữ lập trình có thể không phổ biến Tuy nhiên, lệnh xchg vẫn có thể được sử dụng ẩn đằng sau các phép toán gán để thực hiện việc hoán đổi giá trị của hai biến mà không cần sử dụng biến trung gian.-Ví dụ trong một ngôn ngữ như C:

int a = 5;

12

Trang 12

ZF được thiết lập nếu giá trị của hai thanh ghi bằng nhau.

SF được thiết lập nếu giá trị của hai thanh ghi có dấu khác nhau

OF được thiết lập nếu giá trị của hai thanh ghi có số mũ khác nhau

AF được thiết lập nếu giá trị của hai thanh ghi có bit 4 khác nhau

Lệnh XLAT:

chuyển nội dung của ô nhớ 8 bit vào thanh ghi AL Địa chỉ ô nhớ xác định bằng cặp thanh ghi DS:BX (nếu không chỉ ra src) hay src, địa chỉ offset chứa trong thanh ghi AL

Trang 13

- Ví dụ : bài toán tính bình phương một số nguyên có thể thực hiện bằng cách tra bảng như sau

- Sau khi làm xong lệnh XLAT : AL = 25= 52

2.Nhóm lệnh chuyển dữ liệu qua cổng:

Mỗi I/O port giao tiếp với CPU sẽ có một địa chỉ 16 bit cho nó CPU gởi hay nhận

dữ liệu từ cổng bằng cách chỉ đến địa chỉ cổng đó Tuỳ theo chức năng mà cổng có thể: chỉ đọc dữ liệu (input port), chỉ ghi dữ liệu (output port) hay có thể đọc và ghi

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ỉ COMI = 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

14

Trang 14

Ví dụ: địa chỉ COMI = 378h

mov dx,378h

out dx,al

lệnh này không tác động đén cờ

3.Nhóm lệnh chuyển cờ hiệu (thanh ghi trạng thái):

Lệnh PUSHF (push flag):

Lưu giữ thanh ghi cờ vào ngăn xếp

Cú pháp: pushf

Hoạt động:

Lệnh pushf sao chép toàn bộ giá trị của thanh ghi cờ (flags register) gồm 16

cờ khác nhau, ví dụ như cờ carry (CF), cờ zero (ZF), cờ overflow (OF), cờ parity (PF), etc

Giá trị sao chép này được đẩy lên vị trí đầu tiên của ngăn xếp (SP).Chỉ số ngăn xếp (SP) được tăng lên 2 byte để trỏ đến vị trí trống tiếp theo trên ngăn xếp

Lợi ích của lệnh pushf:

Lưu trữ tạm thời giá trị của thanh ghi cờ để có thể phục hồi trạng thái cờ sau này Điều này thường được sử dụng trong các tình huống sau:

Khi xử lý ngắt (interrupt), giá trị cờ trước khi ngắt được lưu trữ bằng pushf để

có thể phục hồi sau khi xử lý xong ngắt

Khi thực hiện một đoạn mã phức tạp có thể thay đổi nhiều cờ, có

thể pushf trước khi bắt đầu để có thể quay lại trạng thái cờ ban đầu nếu cần.Lưu ý: Lệnh pushf chỉ đẩy giá trị cờ, không đẩy bất kỳ dữ liệu nào khác

Ví dụ: để đưa nội dung của thanh ghi cờ vào thanh ghi AX ta làm như sau:PUSHF

POP AX

Đây là lệnh lấy 2 byte từ ngăn xếp đưa vào thanh ghi cờ

Hoạt động:

Lệnh popf lấy giá trị từ vị trí đầu tiên của ngăn xếp (SP)

Giá trị này được ghi trở lại vào thanh ghi cờ

15

Trang 15

Chỉ số ngăn xếp (SP) được giảm xuống 2 byte để trỏ đến vị trí trống tiếp theo trên ngăn xếp.

Lợi ích của lệnh popf:

Phục hồi trạng thái cờ sau khi đã được lưu trữ bằng lệnh pushf Điều này thường được sử dụng trong các tình huống sau:

Sau khi xử lý ngắt (interrupt), giá trị cờ trước khi ngắt được phục hồi bằng popf

Sau khi thực hiện một đoạn mã phức tạp có thể thay đổi nhiều cờ, có thể popf để quay lại trạng thái cờ ban đầu

Lưu ý: Lệnh popf chỉ lấy giá trị cờ, không lấy bất kỳ dữ liệu nào khác

Lệnh SAHF (Store AH into Flags):

Là một lệnh x86 assembly language được sử dụng để di chuyển giá trị từ thanh ghi

AH (High byte của thanh ghi AX) vào thanh ghi cờ (Flags register) Lệnh này thường được sử dụng trong quá trình chuyển đổi giữa dạng số thập phân và dạng ASCII (ví dụ: chuyển đổi từ ký tự sang số)

Cú pháp của lệnh SAHF là: SAHF

Lệnh này không có tham số và không yêu cầu bất kỳ thanh ghi nào khác Sau khi thực hiện lệnh SAHF, các bit trong thanh ghi cờ sẽ được cập nhật dựa trên giá trị trong thanh ghi AH

Chức năng:

-Trong x86 assembly language được sử dụng để sao lưu giá trị của thanh ghi AH (High byte của thanh ghi AX) vào thanh ghi cờ (Flags register) Cụ thể, nó sao lưu các bit 0-7 của thanh ghi AH vào các cờ trong thanh ghi cờ

-Thanh ghi cờ (Flags register) là một thanh ghi 16-bit trong CPU chứa các cờ trạngthái, mỗi cờ biểu thị một điều kiện sau khi thực hiện một lệnh Các cờ chính bao gồm:

-Zero Flag (ZF): Được đặt thành 1 nếu kết quả của một phép toán là 0

-Sign Flag (SF): Được đặt thành bít cao nhất của kết quả của một phép toán (1 nếu

âm, 0 nếu dương hoặc không âm)

16

Trang 16

-Overflow Flag (OF): Được đặt thành 1 nếu có tràn (overflow) khi thực hiện một phép toán dấu (signed).

-Parity Flag (PF): Được đặt thành 1 nếu số lượng bit 1 trong kết quả của một phép toán là số chẵn

-Carry Flag (CF): Được đặt thành 1 nếu có tràn (carry) khi thực hiện một phép toánkhông dấu (unsigned)

Trường hợp thường gặp:

Lệnh SAHF thường được sử dụng sau các lệnh chuyển đổi giữa số và ASCII, nơi giá trị trong thanh ghi AH thường đại diện cho một ký tự số Sau khi sửdụng lệnh SAHF, bạn có thể kiểm tra các cờ để xác định điều kiện sau khi chuyển đổi và thực hiện các hành động tương ứng

sử dụng các lệnh như JZ (Jump if Zero), JG (Jump if Greater), JL (Jump if Less),

để kiểm tra và xử lý các trường hợp đặc biệt dựa trên giá trị của các cờ

thập phân và dạng ASCII, đặc biệt là khi xử lý ký tự số trong lập trình assembly Khi bạn đọc một ký tự số từ đầu vào người dùng hoặc từ một nguồn dữ liệu khác,

và sau đó cần chuyển đổi ký tự đó thành giá trị số, lệnh SAHF có thể giúp xác địnhđiều kiện sau khi chuyển đổi

Trong x86 assembly language được sử dụng để nạp giá trị của thanh ghi cờ (Flags register) vào thanh ghi AH (High byte của thanh ghi AX)

Cú pháp của lệnh LAHF là: LAHF

Lệnh này không có tham số và không yêu cầu bất kỳ thanh ghi nào khác Sau khi thực hiện lệnh LAHF, giá trị của thanh ghi cờ sẽ được sao chép vào thanh ghi AH, với các bit 0-7 của thanh ghi AH giống như các bit 0-7 của thanh ghi cờ.Lệnh LAHF thường được sử dụng để đọc các cờ trạng thái sau khi thực hiện một phép toán và lưu trữ chúng để sau đó kiểm tra và xử lý các điều kiện tương ứng

17

Trang 17

Chức năng:

năng nạp giá trị của thanh ghi cờ (Flags register) vào thanh ghi AH (High byte của thanh ghi AX) Cụ thể, lệnh này sao chép các bit trạng thái của thanh ghi cờ vào các bit tương ứng của thanh ghi AH

này bao gồm Zero Flag (ZF), Sign Flag (SF), Overflow Flag (OF), Parity Flag (PF), và nhiều cờ khác nữa, tùy thuộc vào loại phép toán

cờ để sau đó có thể kiểm tra và xử lý các điều kiện tương ứng Điều này thường xảy ra sau khi thực hiện một chuỗi các phép toán và bạn muốn kiểm tra kết quả củachúng

bạn cần kiểm tra và xử lý các điều kiện hoặc lỗi sau khi thực hiện một loạt các phép toán trong mã assembly x86 Cụ thể, LAHF được sử dụng để nạp giá trị của thanh ghi cờ (Flags register) vào thanh ghi AH (High byte của thanh ghi AX) Các

cờ này chứa thông tin về kết quả của các phép toán trước đó, và việc lưu trữ thông tin này trong thanh ghi AH giúp bạn dễ dàng kiểm tra các điều kiện và thực hiện xử

lý tương ứng

Dưới đây là một số tình huống phổ biến khi LAHF có thể được sử dụng:

sau đó sử dụng LAHF để kiểm tra cờ Overflow (OF) và xử lý trường hợp tràn lahf

jnz overflow_handler ; Nhảy nếu OF không bằng 0

; Tiếp tục xử lý nếu OF bằng 0

overflow_handler:

; Xử lý khi OF bằng 1

18

Ngày đăng: 24/05/2024, 07:50

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w