Kiến trúc máy tính phần ii hợp ngữ - chương 1

Nội dung • Giới thiệuvềhợp ngữ •Lập trìnhvớihợp ngữ • Vídụmẫu • Bàitập

pdf49 trang | Chia sẻ: longpd | Lượt xem: 3057 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Kiến trúc máy tính phần ii hợp ngữ - chương 1, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
PHẦN II HỢP NGỮ Chương 5 TỔNG QUAN VỀ HỢP NGỮ Nội dung • Giới thiệu về hợp ngữ • Lập trình với hợp ngữ • Ví dụ mẫu • Bài tập I.Giới thiệu • Hợp ngữ - Assembly • Trình dịch hợp ngữ - Assembler • So sánh ngôn ngữ máy và hợp ngữ Ngôn ngữ máy Hợp ngữ 5601:0100 5601:0102 5601:0105 B4.02 80.C2.30 50 MOV AH, 2 ADD DL,30 PUSH AX Hợp ngữ • Ngôn ngữ lập trình cấp thấp, dùng dạng gợi nhớ của tập lệnh mnemonic [operand1 [,operand2] • Các đặc điểm: – Thực thi nhanh – Kích thước nhỏ – Xử lý trực tiếp hệ thống – Có thể viết trên mọi hệ điều hành, mọi CPU – Khó viết Cú pháp của lệnh hợp ngữ • Bộ ký tự – Chữ cái latinh: A..Z, a..z – Chữ số thập phân: 0..9 – Các ký tự đặc biệt: ? @ _ $ : . [ ] ( ) … – Các ký tự cách: SP, Tab • Từ vựng: – Từ khóa (keyword) – Tên (Symbol, name) Từ khóa • Tên dành riêng của hợp ngữ – Tên các thanh ghi – Tên gợi nhớ – Tên toán tử – … Đặt tên • Tên hằng, tên biến, tên nhãn… do người lập trình đặt ra • Bắt đầu của tên không là số • Tên không được trùng với từ khóa • Tên tối đa 31 ký tự Cú pháp của một lệnh hợp ngữ [label:] mnemonic [operand1 [,operand2]] [; comment] - Nhãn thay thế địa chỉ câu lệnh. - Người lập trình tự đặt - Từ gợi nhớ xác định hành động của câu lệnh - Tra trong tập lệnh - Các toán hạng, ngăn cách bởi dấu , - Chú thích Chương trình hợp ngữ • Bao gồm các phát biểu hợp ngữ (assembly language instruction) • Lệnh hợp ngữ – >lệnh nhị phân/mã máy • Chỉ dẫn biên dịch (assembler directive) – >không có lệnh nhị phân tương ứng – >Tuân theo cú pháp của assembler Tổ chức bộ nhớ • Địa chỉ ô nhớ • Các đơn vị Tổ chức thanh ghi • CPU16bit và CPU 32bit Thanh ghi của CPU 8086 • Gồm 14 thanh ghi, mỗi thanh ghi 16 bit • Chia làm 5 nhóm: – Nhóm thanh ghi đoạn – Nhóm thanh ghi đa dụng – Nhóm thanh ghi con trỏ và chỉ mục – Thanh ghi con trỏ lệnh – Thanh ghi cờ hiệu Nhóm 1: các thanh ghi đoạn • Segment registers • Chứa địa chỉ đoạn (segment) • 4 thanh ghi: – CS (Code segment register) – DS (Data segment register) – ES (Extra data segment register) – SS (Stack segment register) Quản lý bộ nhớ với thanh ghi đoạn Nhóm 2: các thanh ghi đa dụng • General purpose registers • Chứa các toán hạng, dữ liệu • Gồm 4 thanh ghi 16 bit – AX (Accumulator Register) – BX (Base Register) – CX (Count Register) – DX (Data Register) Nhóm thanh ghi đa dụng (t.t) • Mỗi thanh ghi đa dụng 16bit có thể được sử dụng như 1 cặp thanh ghi 8bit Thanh ghi 16bit 8bit cao 8 bit thấp AX AH AL BX BH BL CX CH CL DX DH DL Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 AX AH AL Nhóm 3: Các thanh ghi con trỏ và chỉ mục • Gồm 4 thanh ghi – SI (Source Indexed register) – DI (Destination Indexed register) – SP (Stack Pointer register) – BP (Base Pointer register) Nhóm 4: Thanh ghi con trỏ chương trình • IP (Instruction Pointer register) • Lệnh kế tiếp sẽ thực hiện ở địa chỉ: CS:IP Nhóm 5: Thanh ghi cờ hiệu • Flag register • Gồm các cờ hiệu CF: Carry Flag AF: Auxiliary Flag ZF: Zero Flag OF: Overflow Flag SF: Signed Flag PF: Parity Flag DF: Direction Flag TF: Trap Flag IF: Interupt Enable Flag Tổ chức ngắt • Ngắt cứng: (hard interupt) IRQ0: timer IRQ4: COM1 IRQ1: keyboard IRQ5: Hard disk IRQ2: cho máy AT IRQ6: Floppy disk IRQ3: COM2 IRQ7: Parallel port àcác ngắt này có thể chắn được bởi lệnh CLI • Ngắt không chắn được NMI – độ ưu tiên cao nhất – báo sự nguy hiểm như sụt áp hay hư hỏng bộ nhớ Tổ chức ngắt (t.t) • Ngắt nội bộ (internal interupt) – phát sinh bởi CPU – “divide by zero”, “overflow”, “trap” • Ngắt mềm (soft interupt) – gọi 1 chương trình con có sẳn trong ROM hay RAM Bảng vector ngắt • bảng chiều dài 1KB nằm trong bộ nhớ bắt đầu từ 0000:0000 đến 0000:03FF • gồm 256 phần tử, mỗi phần tử chiếm 4 byte chứa giá trị segment và offset của chương trình xử lý ngắt 00h ÷ 1Fh : ngắt trong ROM 20h ÷ 2Fh: ngắt mềm của DOS 30h ÷ FFh: ngắt mềm do người dùng định nghĩa Sử dụng ngắt mềm 21h cho các thao tác xuất nhập • Sử dụng các lệnh IN / OUT cho các thao tác xuất nhập các thiết bị ngoại vi ? – đòi hỏi người lập trình phải am hiểu phần cứng – tùy theo các loại máy tính mà số hiệu cổng của các thiết bị ngoại vi có thể khác. • Các nhà sản xuất máy tính đã cung cấp sẳn các chương trình phục vụ vào ra cơ bản – người lập trình sẽ gọi thông qua lời gọi ngắt: INT số_hiệu_ngắt Một số hàm xuất/nhập đơn giản qua ngắt 21h • INT 21h/AH=1: Nhập 1 ký tự từ bàn phím • INT 21h/AH=2: Xuất 1 ký tự ra màn hình • INT 21h/AH=8: Nhập 1 ký tự từ bàn phím không hiển thị ký tự này lên màn hình • INT 21h/AH=9: Xuất 1 chuỗi ký tự ra màn hình • INT 21h/AH=0Ah: Nhập 1 chuỗi ký tự từ bàn phím è tham khảo tài liệu “The x86 interupts’ list” Gọi ngắt 21h • Gán AH là số hiệu hàm muốn gọi Ví dụ: MOV AH,9 ; gọi hàm xuất chuỗi • Gán các tham số khác nếu cần thiết Ví dụ: MOV DX, offset chuoikitu • Gọi ngắt 21h INT 21h INT 21h/AH=1 • Nhập một ký tự từ bàn phím và có hiển thị ký tự này ra màn hình • Gọi với: AH=1 INT 21h • Trị trả về:AL = mã ASCII của ký tự vừa nhập INT 21h/AH=8 • Nhập một ký tự từ bàn phím nhưng không hiển thị ký tự này ra màn hình • Gọi với: AH=8 INT 21h • Trị trả về: AL = mã ASCII của ký tự vừa nhập INT 21h/AH=0Ah • Nhập một chuỗi ký tự từ bàn phím với chiều dài tối đa 255, dùng phím BACKSPACE để sửa ký tự, ENTER để kết thúc việc nhập • Gọi với: AH=0Ah DS:DX = địa chỉ của vùng đệm lưu chuỗi INT 21h • Trị trả về: không có INT 21h/AH=0Ah (t.t) • Vùng đệm lưu chuỗi phải có dạng sau: – Byte đầu tiên: kích thước của vùng đệm, thể hiện số byte tối đa cần đọc • cần phải gán trước khi gọi hàm – Byte thứ hai: số byte thực sự đọc • được trả về sau khi gọi hàm – Các byte tiếp theo: lưu các ký tự đã nhập vào • được gán sau khi gọi hàm 10 ? 10 bytes vùng đệm chứa chuỗi nhập 10 5 h e l l o INT 21h/AH=2 • Hiển thị ký tự có mã ASCII chứa trong DL ra màn hình • Gọi với: AH=2 DL = Mã ASCII của ký tự muốn xuất INT 21h • Trị trả về: không có INT 21h/AH=9 • Xuất một chuỗi ký tự ra màn hình. Chuỗi phải kết thúc bằng ký tự ‘$’ • Gọi với: AH=9 DS:DX = Địa chỉ của chuỗi cần xuất INT 21h • Trị trả về: không có Các dạng hằng trong hợp ngữ • Nhị phân: – Gồm một dãy các chữ số 0 và 1, kết thúc bởi ký tự B hoặc b – Ví dụ: 0100 0101B : 8bit 1111000011110000b : 16bit Các dạng hằng (t.t) • Thập phân: – Gồm một dãy các chữ số từ 0 đến 9, có thể thêm các ký tự + , - để biểu thị dấu. – có thể kết thúc bằng ký tự D hoặc không cần – Ví dụ: 9871d hay 9871 Các dạng hằng (t.t) • Thập lục phân(hệ 16 hay hex): – Gồm một dãy các chữ số từ 0 đến 9 và các ký tự từ A-F (a-f), kết thúc bằng ký tự H – Nếu ký tự bắt đầu không phải là số thì phải thêm 0 vào đầu. – Ví dụ: 45h số hex 8bit 5AF8H số hex 16 bit 0A28FH bắt đầu bằng A nên phải thêm 0 vào đầu Các dạng hằng (t.t) • Dạng chuỗi: – Gồm một dãy các ký tự nằm giữa 2 dấu ‘ hay “ – Ví dụ: “Hello Assembly” ‘Xin chao!’ Dữ liệu cho chương trình • Khai báo hằng: – Cú pháp: tên hằng EQU giá trị biểu thức – Ví dụ: MAX EQU 100 loichao EQU ‘Hello!$’ mark EQU 01001110b Khai báo biến • Biến byte: db songuyen db 10 a db ? • Biến từ (word) dw • Biến từ gấp đôi (double word) dd Khai báo biến (t.t) • Biến mảng: tên db/dw pt1,pt2,pt3,… tên db/dw DUP() mang db 5,3,0,2,1,7 mang2 dw 100 DUP (0) • Kiểu chuỗi str db ‘chuoi ki tu’ Kiểu mảng • Thực chất là một loạt các byte hay từ nhớ liên tiếp 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 b_array DB 10h,20h,30h thì: 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 Kiểu mảng (t.t) • Nếu B_ARRAY được gán địa chỉ offset 0200h thì nội dung bộ nhớ như sau : SYMBOL ADDRESS CONTENTS b_array 200h 10h b_array+1 201h 20h b_array+2 202h 30h Mảng (t.t) • 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 ADDRESS CONTENTS W_ARRAY 300h 1000d W_ARRAY+2 302h 40d W_ARRAY+4 304h 29887d W_ARRAY+6 306h 329d Chương trình 16 bit dạng COM .model tiny .code org 100h : Int 20h end Dạng COM nạp ở địa chỉ 100h Gọi ngắt 20h để kết thúc chương trình COM Ví dụ: HelloC.ASM .model tiny .code org 100h batdau : Mov dx, offset loichao Mov ah, 9 Int 21h Int 20h loichao db ‘Hello Assembly! $’ end batdau Gọi ngắt 21h/AH=9 Xuất chuỗi ra màn hình Chuỗi kết thúc bởi $ Chương trình 16bit dạng EXE .model small .stack .data <khai báo biến, hằng> .code : Mov Ah,4Ch Int 21h end Qui mô bộ nhớ: small/ medium/ compact/ large/ huge Khai báo kích thước stack sử dụng Khai báo đoạn dữ liệu Khai báo đoạn chương trình Gọi ngắt 21h/AH=4C h để kết thúc chương trình EXE Các kiểu kích thước bộ nhớ cho chương trình hợp ngữ Ví dụ: HelloE.ASM .model small .data loichao db ‘Hello Assembly! $’ .code batdau : Mov ax,@data Mov ds,ax Mov dx, offset loichao Mov ah, 9 Int 21h Mov ah,4ch Int 21h end batdau Trỏ thanh ghi DS vào đoạn data Dịch và thực thi • Bộ dịch hợp ngữ: – MASM – Microsoft – TASM – Borland (Turbo Assembler) – MASM32 – www.masm32.com – NASM – www.sourceforge.net/projects/nasm – Emu8086