Lập trình Hợp ngữ

Assembly Language

Tổng quan

 Ngôn ngữ cấp thấp  Macro Assembler ( MASM) - CPU 8086.  Tập tin hợp ngữ nguồn (.ASM)

 Các phát biểu lệnh hợp ngữ (assembly statement)

 Assembly Language Instruction

 Xác định hành động CPU thực hiện  Dịch sang một lệnh mã máy tương ứng

 Assembler directive

 Khai báo hướng dẫn biên dịch

Tổng quan (tt)

 Các thành phần

 Bộ ký tự:

 26 chữ cái thường và hoa a-z, A-Z  10 kí tự số 0-9  Các kí tự dấu:

 ? @ _ $ : . [ ] ( ) < > { } + - * / & % ! ‘ ~ “ | \ = # ^ ; ,

 Kí tự ngăn cách  Khoảng trắng  Tab

 Kí tự xuống dòng : kết thúc một lệnh  Không phân biệt hoa thường

Tổng quan (tt)

 Từ vựng:

 Tên: A-Z a-z 0-9 . ? @ _ $

 Duy nhất  Qui tắc đặt tên??

 Từ khóa

 Bắt buộc  Kiểu số liệu:

 Số:

 Thập phân 110d (mặc định)  Nhị phân 01111b  Hexa 0FF01h

 Kí tự:

 Giữa hai dấu ngoặc đơn hoặc kép  Mã ASCII  ‘A’ == 41h

Cấu trúc lệnh

 Name: Operation Operand(s) ;Comment  [Nhãn] Tên gợi nhớ Toán hạng(s) Ghi chú  Kí tự ngăn cách: khoảng trắng, TAB

;khởi tạo thanh ghi CX

 START: MOV CX,5  MAIN PROC ; tạo thủ tục tên là MAIN

 Name: tên thay thế địa chỉ câu lệnh  Operation: hành động (2-7 kí tự)  Operand: dữ liệu để xử lý

 Hằng, thanh ghi, biểu thức, tên tượng trưng  Các dạng định địa chỉ???

 Comment: người lập trình hiểu

 Assembler bỏ qua

Khai báo dữ liệu

 Khai báo hằng

 Chỉ dẫn EQU hoặc =  Gán giá trị hằng cho tên  name EQU  name =

 Khai báo biến

 Loại dữ liệu riêng

 Số, ký tự, chuỗi, biểu thức có trị xác định

 Vùng nhớ xác định

 Tạo ra khi biên dịch chương trình  Truy xuất vùng nhớ qua tên biến

define byte define word (doublebyte) define doubeword (2 từ liên tiếp) define quadword (4 từ liên tiếp) define tenbytes (10 bytes liên tiếp)

Chỉ dẫn khai báo kiểu số liệu  DB  DW  DD  DQ  DT  Ví dụ:

 alpha DB 4

; khai báo biến alpha chiều dài 1

 beta DW ?

byte có giá trị khởi tạo 4

; khai báo biến beta chiều dài 2 byte không khởi tạo giá trị

Mảng (ARRAY)

 Thực chất là một loạt các byte hay từ nhớ liên tiếp

 Còn gọi là vùng nhớ có tên và tổng số byte chiều

nhau truy xuất địa chỉ thông qua tên biến

 Ví dụ: vùng nhớ B_ARRAY chiều dài 3 byte

dài

 b_array là tên gán cho byte đầu tiên  b_array+1 là tên của byte thứ hai  b_array+2 là tên của byte thứ ba

b_array DB 10h,20h,30h

Mảng (ARRAY)

CONTENTS

 Nếu ASM gán địa chỉ offset 0200h cho mảng B_ARRAY thì nội dung bộ nhớ như sau : ADDRESS 200h 201h 202h

 SYMBOL b_array b_array+1 b_array+2

10h 20h 30h

Mảng (ARRAY)

 Ví dụ mảng W_ARRAY 4 phần tử  W_ARRAY DW 1000,40,29887,329

 Giả sử mảng bắt đầu tại 0300h:  SYMBOL

W_ARRAY W_ARRAY+2 W_ARRAY+4 W_ARRAY+6

ADDRESS 300h 302h 304h 306h

CONTENTS 1000d 40d 29887d 329d

Khai báo dữ liệu

 Chuỗi kí tự

 Mảng các giá trị mã ASCII

 msg DB ‘HELLO’, 0AH, 0DH, ‘$’ tương đương  msg DB 48H,45H,4CH,4Ch,4FH,0AH,0DH,24H

 Toán tử DUP

 Lặp lại số lần giá trị dữ liệu cần khởi tạo

 result DB 100 DUP (‘?’)

; chuỗi 100 dấu ?

 Có thể lồng nhau

Cấu trúc chương trình ASM

 Cú pháp khai báo toàn phần:  Chỉ dẫn SEGMENT ..ENDS  Tự tham khảo

 Chương trình ASM gồm 3 phần  3 đoạn

 CODE  DATA  STACK

 Chỉ dẫn kiểu bộ nhớ: xác định kích thước đoạn

.model memory_type  SMALL, MEDIUM, COMPACT, LARGE

Đoạn dữ liệu – DATA Segment

 Cú pháp  .DATA  ;khai báo tên hằng, biến, mảng

 Ví dụ .DATA WORD1 DW 2 WORD2 DW 5 MSG DB ‘THIS IS A MESSAGE ’ MASK EQU 10010010B

Đoạn ngăn xếp – Stack Segment

 Cú pháp:

.STACK size

 Mặc định 1KB  Ví dụ:

.STACK 100h ;dành 256 bytes cho stack

Đoạn mã- Code segment

 Đoạn chứa mã lệnh chương trình  Bắt đầu bằng .CODE, bên trong chứa mã

lệnh của thủ tục

 Cú pháp khai báo thủ tục

name PROC

; body of the procedure

 Kết thúc chương trình bằng cú pháp END

name ENDP

Ví dụ:

 .MODEL SMALL ;1 đoạn code và 1 đoạn dữ liệu  .STACK 100h ; dành 256 byte cho stack  .DATA

 .CODE

; định nghĩa dữ liệu tại đây

MAIN PROC

; thân thủ tục MAIN

MAIN ENDP

 END MAIN

; các thủ tục khác nếu có

; kết thúc chương trình bắt đầu

bằng thủ tục MAIN

Các lệnh cơ bản

 MOV, XCHG  ADD, SUB, INC , DEC,NEG  Chuyển ngôn ngữ cấp cao sang hợp ngữ

; đưa A vào AX ; đưa AX vào B

 Mệnh đề B=A MOV AX,A MOV B,AX  Mệnh đề A=B-2*A MOV AX,B SUB AX,A SUB AX,A MOV A,AX

;Ax=B ;AX=B-A ;AX=B-2*A ;A=B-2*A

Các lệnh vào ra

 CPU thông tin với cổng ngoại vi I/O bằng

lệnh IN và OUT

 Không dùng trực tiếp. Tại sao???  Dùng chương trình phục vụ I/O  BIOS ( Basic Input Output System)  Do hệ điều hành cung cấp

 Trình phục vụ ngắt INT

INT interrupt_number

 Thực hiện các ngắt thông qua số hiệu hàm

INT 21h

 function number

 Input : DX= địa chỉ chuỗi ký tự kết thúc bằng $  Output: chuỗi kí tự xuất hiện trên màn hình

 function number

9 routine String input

routine Single character output

character

 Output:

 AL= ASCII code of the the display character or control

character

2  Input :  AH=2  DL=ASCII code of the the display character or control

Chương trình đầu tiên

 Đọc một ký tự in ra dòng mới  .MODEL SMALL  .STACK 100H  .CODE  MAIN PROC  ; hiện dấu nhắc  MOV AH,2  MOV DL,’?’  INT 21H

Chương trình đầu tiên

 ; nhập một ký tự  MOV AH,1  INT 21H  MOV BL,AL  ; chuyển xuống dòng mới bằng cách xuất kí tự  ; xuống hàng và kí tự về đầu hàng.  MOV AH,2  MOV DL,0DH  INT 21H  MOV DL,0AH  INT 21H

; hàm nhập ký tự ; ký tự nhập vào AL ; cất ký tự vào BL

; hàm xuất ký tự ; ký tự carriage return ; thực hiện xuất kí tự carriage return ; kí tự line feed ; thực hiện xuất kí tự line feed

Chương trình đầu tiên

 ; xuất kí tự nhập cất ở BL  MOV DL,BL ; đưa dữ liệu cất ở BL vào DL  INT 21H ; thực hiện xuất kí tự  ; trở về DOS  MOV AH,4CH ; hàm thoát về DOS  INT 21H ; thực hiện exit to DOS  MAIN ENDP  END MAIN