sách ngôn ngữ lập trình Assembly

34 930 2
sách ngôn ngữ lập trình Assembly

Đ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

Chương TỔ CHỨC BỘ XỬ LÝ INTEL 8086 I BỘ XỬ LÝ (CPU) INTEL 8086 Tổ chức tổng quát CPU 8086 CPU 16 bit (bus số liệu có 16 dây) Nó dùng để chế tạo máy vi tính hãng IBM Thật IBM dùng CPU 8088 với đường bus số liệu ngồi bit Cho đến nay, CPU khơng ngừng cải tiến trải qua dạng 80186, 80286, 80386, 80486, 80586 (Pentium), Pentium Pro, Pentium II, PIII, PIV Các CPU tương thích từ xuống (downward compatible) nghĩa tập lệnh bao gồm tập lệnh CPU cũ thêm nhiều lệnh Execution Unit (EU) Thực lệnh AH BH CH DH AL BL CL DL SP BP SI DI Bus Interface Unit (BIU) Giao tiếp Bus AX BX CX DX PC 0000 0000 0000 0000 CS DS ES SS Điều khiển bus ALU (Bộ làm tính & luận lý) CU (Bộ điều khiển) Thanh ghi trạng thái Bus ngoại Hàng chờ lệnh Comment [Mr1]: Phím Enter Thanh ghi lệnh Hình: Sơ đồ khối CPU 8086 Ta thấy CPU 8086 chia thành phận chính: Bộ phận thực lệnh (Execution Unit: EU) phận giao tiếp Bus (Bus Interface Unit: BIU) Bộ phận thực lệnh EU: Kiểm soát ghi, giải mã thi hành lệnh tức làm tác vụ mà lệnh yêu cầu Như EU làm hầu hết cơng việc CPU cổ Trang Giáo trình Assembler điển Các ghi đường bus EU điều 16 bit EU không nối với bus hệ thống bên ngồi, lấy lệnh từ hàng chờ lệnh mà BIU cung cấp Khi có yêu cầu truy xuất nhớ hay ngoại vi EU yêu cầu BIU làm việc BIU tái định địa cho phép EU truy xuất đầy đủ 1MB (8086 có 20 đường địa ngoại) Bộ phận giao tiếp bus (BIU): BIU thực tất tác vụ bus EU Trong EU thực lệnh BIU lấy lệnh từ nhớ cất giữ vào ô nhớ (gọi hàng chờ lệnh) bên CPU Do đó, EU khơng phải đợi lấy lệnh từ nhớ Đây cách đơn giản cache Các ghi 8086 a Thanh ghi đa dạng: CPU 8086 có ghi đa dụng 16bit, chia đơi thành thanh, bit  AX (accumulator): ghi tích luỹ bản, tác vụ vào/ra dùng ghi này, tác vụ dùng số liệu tức thời, số tác vụ chuỗi ký tự lệnh tính tốn dùng ghi AX   BX (base register): ghi thường dùng để tính tốn địa ô nhớ  DX (data register): thường chứa địa số lệnh vào ra, lệnh tính tốn số học (kể nhân chia) CX (count register): ghi đếm thường dùng để đếm số lần lệnh vòng lặp xử lý chuỗi ký tự b Thanh ghi trỏ: Dùng để thâm nhập số liệu ngăn xếp   SP (stack pointer): Thanh ghi trỏ ngăn xếp BP (base pointer): Thanh ghi trỏ dùng để lấy số liệu từ ngăn xếp c Thanh ghi số   SI (source index): Thanh ghi số nguồn DI (destination index): Thanh ghi số đích d Thanh ghi đoạn: Được dùng tính tốn địa nhớ Mỗi ghi đoạn xác định 64 KB ô nhớ nhớ    CS (code segment): Thanh ghi đoạn mã lệnh  SS (stack segment): Thanh ghi đoạn ngăn xếp Con trỏ SP trỏ tới đỉnh ngăn xếp DS (data segment): Thanh ghi đoạn liệu ES (extra segment): Thanh ghi đoạn thêm Các pháp tính chuỗi dùng DI liên quan đến ES e Thanh ghi cờ: Phản ảnh kết phép tính tốn số học luận lý, xác định trạng thái hoạt động CPU Các bit ghi cờ có ý nghĩa trình bày     CF: thể số giữ thoát từ bit cao ghi kết sau phép tính tốn  ZF: kết phép tính (và ngược lại) OF: thể việc tính tốn vượt q khả CPU AF: thể số giữ từ bít thứ (bit 3) ghi kết PF: bít thấp ghi kết phép tính tốn có số số chẳn (và ngược lại) Chủ biên Võ Thanh Ân Trang    DF: lập trình được, SI DI giảm cho vòng lặp IF: lập trình được, cho phép ngắt TF: lập trình được, cho phép chương trình chạy bước để phục vụ sửa sai chương trình 15 14 13 12 11 10 O D I T S Z A P C Để dành dùng sau CF cờ số giữ PF cờ chẳn lẽ AF cờ số giữ phụ ZF cờ zero SF cờ dấu * TF cờ bẩy * IF cờ ngắt * DF cờ hướng OF cờ tràn Tổ chức nhớ Bộ nhớ tổ chức thành mảng gồm ô nhớ bit Các liệu cất giữ lấy từ nhớ Mỗi nhớ có địa Theo qui ước Intel kiện 16 bit cất giữ vào ô nhớ với byte cao địa cao byte thấp nhớ có địa thấp Sự phân đoạn nhớ CPU 8086 có khơng gian địa MB (ứng với 20 đường dây địa chỉ) Vậy CPU 8086 quản lý nhớ 220 = MB Bộ nhớ 1MB chia thành nhiều đoạn 64 KB Các đoạn chồng lên Mỗi địa ô nhớ xác định số: Đoạn 16 bit Độ dời (offset) Địa cụ thể gọi địa vật lý tính cách dịch trái ghi đoạn bit (nhân cho 16) cộng vào độ dời Ví dụ: Đoạn CS có giá trị 1002H, địa vật lý nhớ K đoạn CS có độ dời 500H (thường viết CS:500H) là: + 10020H 500H 10520H Vì 1002H dịch trái 4bit = 10020H  Đây địa vật lý ô nhớ K Trang Giáo trình Assembler Trong ví dụ ta thấy đoạn CS có điểm bắt đầu địa vật lý 10020H Độ dời 500H khoảng cách từ địa điểm bắt đầu đoạn CS đến ô nhớ K  Ô nhớ K Địa vật lý ô nhớ K: 10520H   Độ dời 500H Địa 10020H Điểm bắt đầu đoạn CS  Chính BIU định dùng đoạn theo tính chất số liệu - Nếu số liệu mã lệnh BIU dùng đoạn CS Nếu số liệu liệu chương trình BIU dùng đoạn DS Nếu số liệu liệu nằm ngăn xếp BIU dùng đoạn SS Nếu dùng phép tính chuỗi ghi DI ln chứa độ dời ô nhớ đoạn ES Lúc khởi động CPU 8086 đến địa vật lý cao nhớ (đoạn CS=0FFFFH độ dời 0) để lấy lệnh Địa ứng với địa ROM nhớ Địa ngoại vi Các ngoại vi có địa riêng từ đến 64 KB CPU 8086 dùng lệnh riêng biệt để truy xuất ngoại vi nhớ Muốn truy xuất ngoại vi, BIU cần đưa địa ngoại vi lên 16 bit thấp bus địa (khơng có đoạn) Các chân vi mạch 8086 AD0 … AD15 + AD16 … AD19 20 chân bus địa chỉ, chân từ AD0 đến AD15 đa hợp (multiplex) với bus số liệu, chân từ AD16 đến AD19 đa hợp với nhiệm vụ trạng thái thể chân S3, S4, S5, S6 GND AD14 13 12 11 10 8 32 RD 10 31 RQ / GT ( HOLD) 11 12 13 30 29 28 Lock (WR) 14 27 S1( DT / R) AD0 NMI INTR CLK GND 15 16 17 18 19 20 26 25 24 23 22 21 S ( DEN ) CPU 8086 40 39 38 37 36 35 34 33 Hình: Vi mạch CPU 8086 Chủ biên Võ Thanh Ân Trang Vcc AD15 AD16 / S3 AD17 / S4 AD18 / S5 AD19 / S6 BHE / S7 MN / MX (MIN , MAX mode) RQ / GT1( HALD) S ( M / IO) QS0 (ALE) QS1( INTA) TEST READY RESET Sau chu kỳ máy thứ S3, S4 cho ta biết đoạn dùng để tạo địa S3 0 1 S4 1 Ý nghĩa Đoạn ES Đoạn SS Đoạn CS không đoạn Đoạn DS S5 thể trạng thái cờ ngắt (interrupt flag) S6 giữ trạng thái thấp CPU sử dụng hệ thống bus S7 lưu giữ trạng thái BHE chu kỳ máy thứ RD : CPU dùng tín hiệu để đọc số liệu từ nhớ hay từ thiết bị ngoại vi Ready: Ô nhớ ngoại vi dùng tín hiệu để báo cho CPU biết sẳn sàng chuyển liệu TEST : Khi ta dùng lệnh WAIT CPU trạng thái nghỉ tín hiệu chân xuống thấp CPU thi hành lệnh kế sau lệnh WAIT INTR: Các ngoại vi tác động vào chân cần ngắt CPU NMI (non maskable interrupt): Đây ngã vào ngắt không che, ngắt khơng che có ưu tiên tuyệt đối Reset: Khởi động lại hệ thống CPU 8086 có hai chế độ vận hành MAX ( MX ) MIN (MN) Nhiệm vụ chân tương ứng với chế độ vận hành sau: MIN (MN) MAX ( MX ) HOLD RQ / GT HALD RQ / GT1 WR Lock S2 M / IO DT / R S1 DEN S0 ALE QS0 QS1 INTA  Chế độ MN (hiệu điện chân MN / MX cao) DEN (data enable): Cho phép số liệu nhận vào CPU đưa bus số liệu tuỳ theo tín hiệu chân DT / R Nếu chân DT / R có hiệu cao, CPU đưa số liệu bus hệ thống Nếu DT / R có hiệu thấp, CPU nhận số liệu từ bus hệ thống M / IO (memory / input output): Chân trạng thái cao CPU liên hệ với nhớ Nó trạng thái thấp nế CPU làm việc với ngoại vi HOLD: Các ngoại vi tác động vào chân muốn sử dụng bus hệ thống HLDA (hold acknowledge): CPU dùng tín hiệu để báo cho ngoại vi biết thả bus hệ thống ALE (address latch enable): Tín hiệu chân cho biết địa ô nhớ đưa bus hệ thống INTA (interrupt latch enable): Đây tín hiệu cho biết CPU công nhận ngắt mà ngoại vi yêu cầu WR : Tín hiệu dùng để viết số liệu vào nhớ  Chế độ MX (hiệu điện chân S0, S1, S2 kết hợp, ý nghĩa sau: MN / MX thấp) Trang Giáo trình Assembler S0 0 0 1 1 S1 0 1 0 1 S2 1 1 Ý nghĩa Công nhận ngắt Đọc từ ngoại vi Viết ngoại vi Trạng thái dừng (HALT) Tìm lệnh Đọc nhớ Viết vào nhớ Khơng có hoạt động RQ / GT (request / grant): Ngoại vi tạo xung thấp chân để báo cho CPU biết cần sử dụng bus hệ thống CPU báo lại xung âm cho biết thả bus hệ thống RQ / GT1 giống RQ / GT ưu tiên thấp QS0 QS1 cho biết trạng thái hàng chờ lệnh sau: QS0 0 1 QS1 1 Ý nghĩa Chưa có tác vụ Byte thứ lệnh thực Hàng chờ lệnh đầy Byte lệnh lấy từ hàng chờ lệnh LOCK: Đây tín hiệu báo CPU sử dụng bus hệ thống GND (ground): chân mass (0 volt) V cc hiệu điện nguồn volt CPU 8086 phải dùng chung với số vi mạch khác như: vi mạch điều khiển bus, vi mạch tạo xung nhịp (clock),… tạo thành máy vi tính II CÁC LỆNH THƯỜNG DÙNG CỦA CPU 8086 Giới thiệu Bộ xử lý 8086 có tập lệnh gồm 111 lệnh, chiều dài lệnh từ byte đến vài byte Tập lệnh xử lý Intel ngày có nhiều lệnh mạnh phức tạp Bộ xử lý Intel 80386 có 206 lệnh, lệnh có chiều dài từ đến 15 byte, số lệnh cần 1000 chu kỳ xung nhịp để thực Sau đề cập số lệnh thường dùng CPU 8086 Tập lệnh đầy đủ xử lý 8086 nêu phụ lục Tập lệnh xử lý 80386 Pentium khơng đề cập giáo trình phức tạp Chúng ta dùng qui ước sau:  Reg (register): Thanh ghi  Reg8, Reg16: Thanh ghi bit, 16 bit  Mem (memory): Ô nhớ  Mem8, Mem16: Ô nhớ bit, 16 bit  Immed (immediate): Tức  Immed8, Immed16: Tốn hạng tức bit, 16 bit  Segreg (segment register): Thanh ghi đoạn Nhóm di chuyển số liệu - MOV (move): Di chuyển MOV đích, nguồn Chủ biên Võ Thanh Ân Trang Lệnh di chuyển số liệu từ nguồn sang đích Nguồn Reg, Mem, Immed; đích Reg, Mem - - Ví dụ: MOV CX, BX Lệnh thực chuyển nội dung ghi BX vào ghi CX Nội dung ghi BX giữ nguyên Sau lệnh BX CX có nội dung PUSH (push): đẩy vào PUSH nguồn Nguồn Reg16, Mem16 Lệnh PUSH giảm trỏ ngăn xếp SP xuống đơn vị Ví dụ: PUSH AX Lệnh thực chuyển nội dung ghi AX vào ngăn xếp, đồng thời trỏ SP giảm đơn vị POP (pop: lấy, di chuyển): lấy liệu từ ngăn xếp POP đích Đích Reg16, Mem16 Lệnh POP tăng trỏ ngăn xếp SP xuống đơn vị Ví dụ: POP BX Lệnh thực chuyển nội dung byte ô nhớ mà SP trỏ tới để đưa vào BX, byte có địa thấp đưa vào BL, byte có địa cao đưa vào BH, đồng thời trỏ SP tăng đơn vị Ghi chú: Qua lệnh PUSH POP, ta thấy ngăn xếp nhớ từ nhớ có địa cao, đến nhớ có địa thấp, nghĩa số liệu đưa vào ngăn xếp trước địa cao, số liệu đưa ngăn xếp sau địa thấp Nhóm lệnh chuyển địa - LEA (load effective address): nạp địa hiệu dụng LEA Reg16, Mem16 Chuyển độ dời ô nhớ Mem16 vào thang ghi Reg16 Ví dụ: LEA DX, StringVar Lệnh thực chuyển độ dời biến StringVar vào ghi DX Ta viết (MASM): MOV DX, offset StringVar tương đương lệnh Nhóm lệnh chuyển cờ hiệu (thanh ghi trạng thái) - - PUSHF (push flag): lưu giữ cờ PUSHF (khơng có đối) Đây lệnh lưu giữ ghi cờ vào ngăn xếp POPF (pop flag): lấy cờ POPF (khơng có đối) Đây lệnh lấy byte từ ngăn xếp đưa vào ghi cờ Ví dụ: Để đưa nội dung ghi cờ vào ghi AX ta làm sau: PUSHF POP AX Trang Giáo trình Assembler Nhóm lệnh vào ngoại vi - - IN (in: vào): lấy số liệu từ ngoại vi IN AL, địa cổng 8bit Đây lệnh đưa số liệu lưu giữ ô nhớ đệm ngã cổng vào ghi AL Nếu địa cổng 16bit phải đưa địa cổng vào ghi DX trước sử dụng lệnh IN Ví dụ: IN AL, 3FH ;3FH địa cổng 8bit MOV DX, 3F8H ;3F8H địa cổng 16 bit IN AL, DX OUT (out: ra): đưa số liệu ngoại vi OUT địa cổng 8bit, AL MOV DX, địa cổng 16 bit OUT DX, AL Nhóm lệnh điều khiển - - - JMP (jump: nhảy): lệnh nhảy vô điều kiện đến địa khác JMP đích Nhảy đến địa đánh dấu nhãn hay số ám độ dời Nhãn nằm đoạn CS Tuỳ theo khoảng cách đích đến lệnh JMP mà ta có kiểu lệnh JMP near đích Lệnh (cịn viết: JMP đích) nhảy đến đoạn nằm CS JMP short đích Dùng để nhảy đến địa khoảng –128 đến +127 tính từ lệnh JMP JMP far đích Dùng để nhảy khỏi đoạn CS Lệnh nhảy có điều kiện: Lệnh kiểm tra điều kiện trước nhảy Nếu điều kiện nhảy tới đích, ngược lại thi hành lệnh kế cách bình thường JA (jump if above: nhảy lớn hơn) Nếu cờ CF=ZF=0 nhảy đến đích JB (jump if below: nhảy nhỏ hơn) Nếu cờ CF=1 nhảy đến đích JZ (jump if zero: nhảy 0) Nếu cờ ZF=1 (phép tốn trước so sánh nhau) nhảy JNZ (jump if not zero: nhảy khác 0) Nếu cờ ZF=0 (phép tốn trước khác so sánh khác nhau) nhảy Nhóm lệnh so sánh - Lệnh CMP CMP trái, phải Chủ biên Võ Thanh Ân Trang Nếu trái > phải ZF = CF =0 Nếu trái = phải ZF = CF =0 Nếu trái < phải ZF = CF =1 Ví dụ: MOV AX, 1000H CMP AX, 200H JZ NHANDEN ; nhãn đến … … NHANDEN: ADD AX, BX Nhóm lệnh vòng lặp - LOOP (loop: nhảy vòng): Lệnh làm giảm ghi CX xuống nhảy tới nhãn (trong vòng –128 đến 127) CX khác Ví dụ: MOV AH, 02H MOV DL, 48 MOV CX, 10 ; lặp 10 lần BATDAU: - INT 21H INC DL LOOP BATDAU … … LOOPZ (loop if zero: nhảy 0) Nhảy vòng cờ ZF =1 LOOPNZ (loop if not zero: nhảy khác 0) Nhảy vòng cờ ZF =0 Nhóm lệnh gọi chương trình - - CALL (call: gọi): lệnh gọi chương trình CALL Nhản (hoặc tên chương trình con) Lệnh gọi chương trình lệnh đặc biệt trước nhảy tới nhãn CPU tự động lưu địa trở (là địa sau lệnh CALL) vào ngăn xếp RET (return: trở về) Lệnh kết thúc chương trình Khi gặp lệnh CPU 8086 lấy địa trở ngăn xếp để tiếp tục thi hành lệnh chương trình Ví dụ: Chương trình sau sử dụng Macro, Procedure INCHU Macro mov ah,02 mov dl, 'A' int 21h ENDM dulieu segment thongbao db 'hello!$' Trang Giáo trình Assembler dulieu ends malenh1 segment P2 Proc far mov ah,02 mov dl, 'C' int 21h ret P2 Endp malenh1 ends malenh2 segment malenh group malenh1, malenh2 assume cs: malenh, ds: dulieu batdau: mov ax, dulieu mov ds, ax ; khoi dong lea dx, thongbao ; in thong bao nhap chuoi mov ah, 09h int 21h inchu ;goi macro call pinchu ;goi ctrinh call p2 ;goi ctrinh mov ah, 4ch int 21h PINCHU Proc near mov ah,02 mov dl, 'B' int 21h ret PINCHU Endp malenh2 ends end batdau Nhóm lệnh tính tốn số học 10 - ADD (add: cộng): cộng số nguyên, lấy nguồn cộng vào đích kết lưu đích ADD đích, nguồn Đích Reg, Mem; nguồn Reg, Mem Immed Ví dụ: - MOV AL, 02 ADD AL, 06 (Sau lệnh AL = 08 tức AL = 02+06) INC (increment: tăng) INC đích Đích Reg, Mem Lệnh tăng nội dung đích lên đơn vị Ví dụ: - MOV AL, 02 INC AL ;Sau lệnh AL = SUB (subtract: trừ ra): lấy đích trừ nguồn kết lưu đích SUB đích, nguồn Đích Reg, Mem; nguồn Reg, Mem Immed Ví dụ: Chủ biên Võ Thanh Ân Trang 10 Giáo trình Assembler - Ký hiệu: tên định nghĩa để thay cho biểu thức, từ gợi nhớ lệnh Ký hiệu dùng làm tốn hạng biểu thức, lệnh hay lệnh giả Ví dụ: FOO EQU 7H TOTO = 0FH Từ gợi nhớ mã lệnh a Giới thiệu Từ gợi nhớ mã lệnh dã học chương I tập lệnh xử lý 8086 nên sau nghiên cứu số lệnh giả thường dùng MASM Lệnh giả gọi lệnh hướng dẫn (directive) dùng hướng dẫn chương trình dịch hợp ngữ việc vào ra, tổ chức nhớ, dịch chương trình với điều kiện, điều khiển in danh sách đối chiếu chéo, định nghĩa Lệnh giả chia thành nhóm trình bày b Nhóm lệnh giả liên quan đến nhớ - ASSUME: Lệnh cho biết đoạn thuộc loại gì? Ví dụ: ASSUME DS: DATA, CS: CODE dùng để báo cho hợp ngữ biết đoạn có tên DATA đoạn DS đoạn có tên CODE đoạn CS ASSUME NOTHING báo cho hợp ngữ biết khơng có tên đoạn cho biết loại lần liên hệ đến nhãn, biến ta phải báo cho biết đoạn chúng (ví dụ DS: NHAN cho biết NHAN thuộc đoạn DS) - COMMENT: Lệnh cho ta ghi Ví dụ: COMMENT *Day la ghi chu* (dấu * ký tự giới hạn) Các lệnh dùng định nghĩa biến, khởi động vùng ô nhớ cho biến: - DB (define byte: định nghĩa byte): dành ô nhớ để chứa byte - DW (define word: định nghĩa từ - 16bit): dành ô nhớ để chứa từ - từ tương đương byte - DD (define double word: định nghĩa đôi từ): dành ô nhớ để chứa đôi từ - byte - DQ (define qualword: định nghĩa từ): dành ô nhớ để chứa từ - byte - DT (define ten byte: định nghĩa 10 byte): dành ô nhớ để chứa 10 byte Ta xem ví dụvà phần giải thích sau: MOTCHU DB ‘A’ ;dành vị trí nhớ số 65 ARRAY DB 1, 2, 3, ;định nghĩa vị trí nhớ chứa 1, 2, 3, MES DB ‘CHAO BAN!’ ;dành ô nhớ chứa chuỗi ‘CHAO BAN!’ BUF DB 10 DUP(?) ;dành 10 ô nhớ mà không khởi động ;nhớ nghĩa nhớ chứa số ;nào BUF 100 DUP(‘A’) ;dành 100 nhớ chứa tồn chữ ‘A’ Chủ biên Võ Thanh Ân Trang 20 - - - - - - BSIZE DW 4*128 ;dành ô nhớ để chứa số 512 END: chấm dứt chương trình gốc EQU (equate: bằng): gán trị cho tên Ta dùng lệnh EQU để gán trị cho tên lần, muốn gán lại nhiều lần ta dung lệnh = (bằng) Ví dụ: FOO EQU 2*10 ;gán trị 20 vào FOO Dấu = (bằng): lệnh giống EQU cho phép ta gán lại nhiều lần EVENT (chẳn): làm cho ghi đếm chương trình PC có nội dung số chẳn EXTRN (external: bên ngoài): cho biết tên hay ký hiệu định nghĩa bên modul khác với modul chương trình Ví dụ: EXTRN TAGN: NEAR, SO: WORD TAGN nhãn gần (2 byte), SO từ máy tính nằm ngồi modul GROUP (nhóm): gom đoạn có tên khác để gán chúng tên Ví dụ: NHOM123 GROUP NHOM1, NHOM2, NHOM3 NHOM1, NHOM2, NHOM3 tên đoạn khác nhau, chúng gom lại có tên NHOM123 INCLUDE (bao gồm): Cho phép xen thêm tập tin hợp ngữ vào tập tin hợp ngữ hành Ví dụ: INCLUDE C:\THEM.ASM Nội dung tập tin THEM.ASM đĩa C:\ xen vào tậo tin hành lệnh giả INCLUDE LABEL (nhãn): Cho phép đánh dấu địa địa lệnh hay số liệu kê Ví dụ: NHF LABEL FAR ;nhản xa, đánh dấu vị trí NH NH: MOV AX, DATA ;nhản gần MOV DS, AX … … CHB LABEL BYTE ;đánh dấu vị trí CH lấy byte CH DW 100 DUP(0) ;chuỗi từ … NAME (tên): Đặt tên cho modul hợp ngữ Ví dụ: NAME CURSR ;đặt tên cho modul CURSR Trang 21 Giáo trình Assembler - - - - - - ORG (origin: điểm gốc): Ấn định địa cho đoạn chương trình viết sau lệnh giả ORG Ví dụ: ORG 100H MOV AX, Code PROC (procedure: thủ tục): Gán tên cho chương trình Ví dụ: CTCON PROC NEAR MOV AX, CODE … … RET CTCON ENDP PUBLIC (public: công cộng): Dùng khai báo ký hiệu modul hành mà modul khác sử dụng Ví dụ: PUBLIC FOO, NH, TOTO RADIX: Cho phép đổi số, số 10 Ví dụ: MOV BX, 0FFH ;tương đương với RADIX 16 RECORD (mẫu tin): Cho phép định nghĩa mẫu tin Ví dụ: FOO RECORD CAO: 7, VUA: 3, THAP: Vậy FOO có chiều dài 16bit, 4bit thấp có tên THAP, 3bit kế có tên VUA, 7bit kế có tên CAO Cịn bít chưa định nghĩa STRUC (structure: cấu trúc): Giống lệnh RECORD, khác vùng bên byte SEGMENT: Cho phép định nghĩa đoạn SEGMENT [align] [combine] [‘class’] … … ENDS Vùng [align] xác định đoạn bắt đầu sau: Byte: Đoạn bắt đầu địa Word: Đoạn phải bắt đầu địa chẳn Para: Đoạn phải bắt đầu với địa bội 16 Page: Đoạn phải bắt đầu với địa bội 256 Vùng [combine] xác định đoạn kết hợp với phân đoạn khác sau: Public: Các đoạn tên class ghép nối với liên kết Chủ biên Võ Thanh Ân Trang 22 Common: Các đoạn tên class phủ lắp lên liên kết AT(biểu thức): Đoạn đặt địa bội 16 ghi biểu thức STACK: Giống Public, nhiên trỏ ngăn xếp SP vào địa ngăn xếp Private khơng để hết cho vùng combine đoạn tên class khơng ghép vào c Nhóm lệnh giả dịch (complie) có điều kiện Các lệnh giả dịch có điều kiện nhằm báo cho hợp ngữ dịch hay không dịch nhóm lệnh điều kiện thỏa IF  [đối số] … … [ELSE] … … ENDIF IF  [đối số] có hình thức sau: - IFE : biểu thức tính đoạn chương trình IFE dịch, biểu thức tính khác đoạn chương trình sau lệnh giả ELSE dịch (nếu có lệnh giả ELSE) - IF1: Nếu hợp ngữ dịch lần đoạn chương trình sau IF1 dịch - IF2: Nếu hợp ngữ dịch lần đoạn chương trình sau IF2 dịch - IFDEF : Nếu ký hiệu khơng định nghĩa dịch chương trình sau IFDEF - IFB : Nếu đối số khoảng trắng khơng có đối số dịch đoạn chương trình sau IFB - IFNB : Nếu có đối số dịch đoạn chương trình sau IFNB - IFIDN , : Nếu đoạn chương trình sau IFIDN dịch - IFDIF , : Nếu khác đoạn chương trình sau IFIDF dịch - ENDIF: Đánh dấu hết đoạn chương trình sau IF  d Nhóm lệnh giả MACRO Lệnh giả MACRO giúp ta viết đoạn chương trình mà ta xen vào nơi chương trình hợp ngữ cách viết tên MACRO mà ta muốn gọi Trang 23 Giáo trình Assembler Ta định nghĩa MACRO sau: MACRO [tham số] … … ENDM ;chấm dứt MACRO Ví dụ: Ta viết MACRO có tên TEST sau: TEST MACRO X, Y, Z MOV AX, X MOV BX, Y MOV CX, Z ENDM Như vậy, chương trình ta gọi TEST sau: TEST 10, 20, 30 Thì câu lệnh tương đương sau: MOV AX, 10 MOV BX, 20 MOV CX, 30 Bên MACRO ta dùng lệnh giả LOCAL, EXITM Lệnh EXITM dùng để thoát khỏi MACRO trước có lệnh chấm dứt MACRO Lệnh giả LOCAL dùng bên MACRO, lệnh giúp ta định nghĩa nhãn MACRO mà ta muốn gọi nhiều lần Ví dụ: Ta thiết kế hàm WAIT sau: WAIT MACRO count MOV CX, count NEXT: LOOP NEXT ENDM MACRO WAIT gọi lần nhãn NEXT xuất chương trình lần Muốn gọi lệnh WAIT nhiều lần, ta thiết kế lại lệnh WAIT sau: WAIT MACRO count LOCAL NEXT MOV CX, count NEXT: LOOP NEXT ENDM e Nhóm lệnh giả liệt kê (listing) Nhóm dùng để điều khiển liệt kê lên máy in, xem đề tựa đầu trang - PAGE số hàng, số cột Ví dụ: PAGE 58, 60 ;mỗi trang liệt kê có 58 hàng 60 cột - TITLE (đề tựa): Cho phép đặt đề tựa Ví dụ: TITLE Chuong Trinh Hop Ngu Chủ biên Võ Thanh Ân Trang 24 - SUBTTL (subtitle: đề tựa con): Cho phép liệt kê đề tựa đầu trang % OUT : Văn liệt kê hợp ngữ dịch chương trình XLIST: Khơng cho liệt kê XALL: Liệt kê mã MACRO tạo nên LALL: Liệt kê toàn MACRO SALL: Không liệt kê MACRO CREF: Cho liệt kê bảng đối chiếu chéo XCREF: Không cho phép liệt kê bảng đối chiếu chéo f Nhóm lệnh giả tốn hạng tốn tử Có loại tốn hạng: tức thì, ghi nhớ - Tốn hạng tức số ký hiệu gán số lệnh giả EQU dấu = (bằng) Ví dụ: SL EQU 15 MOV CL, SL MOV AL, 20 - Tốn hạng nhớ tượng trưng địa nhớ Nó ln độ dời địa bắt đầu đoạn tương ứng Ví dụ: FOO DW 0FEFEH MOV AX, FOO ;FOO địa số liệu MOV FOO, AX FOO+5, FOO[5], 5[FOO] tương đương đến địa FOO cộng 5 [BX] [SI], [BX+5][SI], [BX] [SI] tương đương với [BX+SI+5] định dạng + số Các tốn tử chia làm loại: tốn tử thuộc tính (attribute), toán tử số học, toán tử quan hệ (relational), toán tử logic i Tốn tử thuộc tính - PTR (pointer: trỏ): Dùng để thay đổi kiểu địa Ví dụ: CALL Word PTR [BX+SI] [BX+SI] trỏ tới byte ô nhớ ta muốn lấy byte bắt đầu chương trình nên ta dùng WORD PTR - Dấu : (hai chấm): Dùng để thay đổi đoạn Ví dụ: MOV AX, ES:[BX+SI] [BX+SI] trỏ tới số liệu DS ta muốn lấy đoạn ES nên viết ES:[BX+SI] - SHORT: Dùng để thay đổi kiểu NEAR lệnh JMP báo cho hợp ngữ biết nhảy vòng –128 đến +127 so với vị trí lệnh nhảy JMP Trang 25 Giáo trình Assembler - - - - - - THIS: Tạo tốn hạng có giá trị tuỳ thuộc vào tham số THIS Ví dụ: NH EQU THIS BYTE tương đương với NH LABEL BYTE SCH = THIS NEAR tương đương với SCH LABEL NEAR SEG: Cho ta giá trị đoạn, nhãn hay biến Ví dụ: MOV AX, SEG TENB Đưa vào AX giá trị đoạn chứa TENB OFFSET: Cho độ dời nhãn hay biến Ví dụ: MOV DX, OFFSET TENCHUOI Đưa vào DX độ dời biến TENCHUOI, lệnh giả tương đương với lệnh giã LEA DX, TENCHUOI TYPE : Cho biết số byte mà loại biến chiếm (BYTE=1, WORD=2, DWORD=4,…) Ví dụ: MOV AX, (TYPE NH) PTR [BX+SI] Với NH nhãn LENGTH: Cho biết số phần tử biến Ví dụ: FOO DW 100 DUP(?) MOV CX, LENGTH FOO ;CX chứa 100 SIZE: Cho biết số byte biến Ví dụ: FOO DW 100 DUP(?) MOV CX, SIZE FOO ;CX chứa 200 Tốn tử số học Các tốn tử thơng dụng như: + (cộng), – (trừ), * (nhân), / (chia) Dấu trừ đứng trước số để số âm MOD: Chia lấy số dư Ví dụ: MOV AX, 13 MOD ;AX chứa số - SHR (shift right): dịch phải Ví dụ: MOV AX, 00011000B SHR ;AX chứa số 00000011B - SHL (shift left): dịch trái Ví dụ: MOV AX, 00011000 SHL ;AX chứa số 11000000B ii - iii Toán tử quan hệ Toán tử quan hệ dùng so sánh hai số hạng thường dùng việc dịch chương trình có điều kiện - EQ ( EQ ): Nếu tốn hạng tốn hạng biểu thức cho giá trị (true) - NE (not equal: không nhau): Trả TRUE tốn hạng khơng Chủ biên Võ Thanh Ân Trang 26 - LT (less than: nhỏ hơn): Trả true toán hạng bên trái LT nhỏ toán hạng bên phải LT LE (less than or equal: nhỏ nhau): Giống LT thêm điều kiện GT (greater than: lớn hơn): Trả true toán hạng bên trái LT lớn toán hạng bên phải LT GE (greater than or equal: lớn nhau): Giống GT thêm điều kiện iv Toán tử logic Toán tử logic so sánh hai toán hạng bit - NOT: Trả true toán hạng bên trái bên phải khác - AND: Trả true toán hạng true - OR: Trả true hai (hoặc hai) toán hạng true - XOR: Trả true hai toán hạng khác (tốn hạng true, tốn hạng cịn lại false) III LẬP TRÌNH DÙNG HỢP NGỮ MASM Giới thiệu Trong lập trình dùng hợp ngữ MASM, ta thường sử dụng ngắt có sẳn ROM-BIOS (basic output input system: hệ thống vào bản) DOS Toàn ngắt nhiều sách lập trình hợp ngữ nêu lên đầy đủ Trong giáo trình ta nêu vài ngắt thường dùng DOS Một số ngắt thường dùng HĐH MS-DOS Các ngắt DOS đánh số từ 20H đến 27H Ngắt đặt biệt quan trọng ngắt 21H INT 20H: Chấm dứt chương trình, trở DOS từ chương trình có đuôi chấm COM INT 23H: Chận CONTROL – BREAK Thông thường, chương trình chạy DOS, ta dùng tổ hợp phím CONTROL – BREAK để kết thúc cách Tổ hợp phím làm CPU nhảy đến chương trình phục vụ ngắt 23H, sau đến thủ tục DOS để kết thúc chương trình chạy trở DOS (dừng đột ngột) Nếu khơng muốn cho phép chương trình kết thúc sớm phím CONTROL – BREAK, ta cho ngắt 23H trỏ tới chương trình đặc biệt đó, để thơng báo lên hình khơng cho chương trình chạy kết thúc sớm chẳn hạn INT 27H: Kết thúc đặt thường trú Ngắt cho phép để nhớ chương trình tắt máy Để sử dụng ngắt này, ta cho chạy chương trình gồm phần Một phần phụ trách việc nội trú cho phần INT 21H: Ngắt 21H có nhiều hàm, muốn gọi hàm ngắt 21H, ta đặt số thứ tự hàm vào ghi AH gọi INT 21H Trang 27 Giáo trình Assembler - - - - - - - Hàm 1: Đợi đọc ký tự từ bàn phím in hình Khi phím ấn ký tự tương ứng phím lưu ghi AL Nếu phím ấn phím đặc biệt AL=0 Dùng tổ hợp phím CONTROL – BREAK để kết thúc công việc Hàm 2: Đưa ký tự hình Ký tự cần đưa hình chứa DL Hàm 3: Đọc vào từ cổng nối tiếp Ký tự chứa AL Hàm 4: Đưa ký tự DL cổng nối tiếp Hàm 5: Đưa ký tự DL máy in Hàm 6: Hàm thực vào lẫn Muốn nhập, ta cho DL = FFH Sau thực hàm 6, cờ ZF = AL chứa ký tự nhập vào, cờ ZF = khơng có ký tự nhập vào Nếu DL chứa số khác FFH ký tự chứa DL đưa hình Hàm 7: Giống hàm khơng in hình ký tự vừa nhập vào, khơng thể dùng CONTROL – BREAK để kết thúc Hàm 8: Giống hàm khơng in hình ký tự vừa nhập hình Hàm 9: Đưa hình chuỗi ký tự đặt DS:DX (nghĩa chuỗi ký tự nằm đoạn DS độ dời nằm DX) Lưu ý, chuỗi ký tự phải kết thúc dấu ‘$’ Hàm 0AH: Đọc vào vùng đệm bàn phím Trước dùng hàm ta phải tạo vùng đệm nhớ Byte xác định số ký tự tối đa nhập vào, byte thứ DOS ghi số ký tự thực mà người dùng nhập vào Các byte chứa ký tự nhập Địa vùng đện đặt DS:DX Hàm 0BH: Cho trạng thái bàn phím Sau thực hàm AL=0 khơng có ký tự đợi, AL khác có ký tự đợi CPU đọc vào Tiếp theo hàm 0BH số hàm thực công việc FCB (file control block) lỗi thời nên khơng cịn nói đến Thay vào ta dùng hàm tương đương thẻ tập tin (file handle) Hàm 25H: Đổi vectơ ngắt, ta đặt DS:DX giá trị địa vectơ ngắt, AL ta để số ngắt Hàm 30H: Lấy ấn (version) DOS Sau thực hàm AL chứa phần chính, AH chứa phần phụ ấn Hàm 31H: Kết thúc lại thường trú Hàm giống ngắt INT 27H Ta đặt ghi DX số paraghaph (16 bytes) phần tập tin muốn giữ thường trú Hàm 35H: Lấy giá trị vectơ ngắt Ta để AL số ngắt Sau thực hàm ES:BX chứa địa vectơ ngắt Chủ biên Võ Thanh Ân Trang 28 - - - - - - Hàm 3CH: Tạo tập tin Cặp ghi DS:DX trỏ tới tên tập tin Cuối chuỗi ta phải có số CX chứa thuộc tính tập tin sau: - bình thường, - đọc, - ẩn, tập tin hệ thống Sau thực thẻ tập tin chứa AX Ta phải giữ lại lần truy xuất tập tin ta phải cần thẻ tập tin Hàm 3DH: Mở tập tin có đĩa Cặp ghi DS:DX trỏ tới tên tập tin (có cuối chuỗi tên) Ta đặt AL kiểu truy cập tập tin sau: 0-chỉ đọc, 1-chỉ ghi, 2-đọc ghi Thẻ tập tin nằm AX Hàm 3EH: Đóng tập tin Thẻ tập tin đóng nằm BX Hàm 3FH: Đọc từ tập tin thiết bị, cặp ghi DS:DX trỏ đến vùng nhớ mà liệu chuyển tới BX chứa thẻ tập tin Trước đọc phải mở tập tin CX chứa số byte cần đọc Sau thực hàm AX chứa số byte đọc vào Ta dùng hàm để gán thẻ cho ngoại vi DOS gán thẻ cho ngoại vi Hàm 40H: Ghi lên tập tin thiết bị, trước hết phải mở tập tin DS:DX trỏ đến vùng chứa liệu nhớ BX chứa thẻ tập tin CX chứa số byte cần ghi lên đĩa Có thể dùng hàm để gỏi liệu ngoại vi Hàm 41H: Xoá tập tin đĩa DS:DX chứa đến tên tập tin muốn xố, ta khơng thể xố tập tin mở tập tin có thuộc tính đọc Hàm 43H: Đọc thay đổi thuộc tính tập tin Đọc thuộc tính: Đặt AL = DS:DX trỏ đến tên tập tin Sau thực hàm, thuộc tính nằm CX Đổi thuộc tính: Đặt AL = CX chứa thuộc tính DS:DX trỏ đến tên tập tin Hàm 4CH: Kết thúc chương trình trở DOS (cả loại tập tin có COM EXE) Hàm 56H: Đổi tên tập tin DS:DX trỏ tới tên cũ ES:DI trỏ tới tên Cấu trúc chương trình hợp ngữ MASM Một chương trình hợp ngữ gồm nhiều modul Các modul viết riêng lẽ chương trình xử lý văn dịch riêng lẽ MASM chương trình đích Các chương trình đích trình liên kết nối lại thành chương trình chạy có chấm EXE Mỗi modul viết sau: Trang 29 Giáo trình Assembler PAGE 60, 132 TITLE (Tiêu đề vị trí này) (Các phát biểu EXTRN hay PUBLIC có) MCR MACRO (viết macro) ENDM STACK SEGMENT PARA STACK ‘STACK’ DB 64 DUP(?) STACK ENDS DSEG SEGMENT PARA PUBLIC DATA (dành ô nhớ cho liệu đây) DSEG ENDS CSEG SEMENT PARA PUBLIC ‘CODE’ ASSUME CS: CSEG, DS: DSEG BATDAU: MOV AX, DSEG MOV DS, AX (chương trình chính) … … CTC PROC NEAR (viết chương trình con) CTC ENDP CSEG ENDS END BATDAU ;Chấm dứt chương trình chọn địa bắt đầu ;chương trình BATDAU Tập tin COM tập tin đuôi EXE a Giới thiệu Hợp ngữ MASM cho phép tạo tập tin đuôi COM dùng cho chương trình nhỏ tập tin EXE để xây dựng chương trình lớn b Đặc điểm tập tin COM - Chỉ có đoạn nhất, ghi CS, DS, SS có chung trị số - Kích thước tối đa 64KB - Tập tin COM nạp vào nhớ thực nhanh tập tin EXE Khi DOS thực tập tin COM, tạo vùng nhớ từ độ dời từ đến 0FFH để chứa thông tin cần thiết cho DOS Vùng gọi vùng PSP Chủ biên Võ Thanh Ân Trang 30 - (program segment prefix) Vì địa bắt đầu tập tin COM từ độ dời 100H Tất cảc ghi đoạn phải dến PSP Dạng điển hình tập tin COM sau: Ví dụ chương trình gốc HELLO.ASM CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG, ES: CSEG, SS: CSEG ORG 100H BATDAU: MOV AX, DSEG MOV DS, AX MOV AH, 09H MOV DS, offset Mess INT 21H INT 20H Mess BD ‘Hello!$’ CSEG ENDS END BATDAU c Đặc điểm tập tin đuôi EXE - Chương trình lớn nằm nhiều đoạn khác - Có thể gọi chương trình dạng Far - Kích thước tập tin tuỳ ý - Có Header đầu tập tin để chứa thông tin cần thiết cho tập tin EXE Tập tin EXE không dùng lệnh ORG 100H đầu chương trình - Dạng điển hình tập tin EXE sau: Ví dụ chương trình gốc HELLO.ASM DULIEU SEGMENT THONGBAO DB 'HELLO!$' DULIEU ENDS MALENH SEGMENT ASSUME CS: MALENH, DS: DULIEU BATDAU: MOV AX, DULIEU MOV DS, AX MOV DX, Offset THONGBAO MOV AH, 09H INT 21H MOV AH, 4CH INT 21H MALENH ENDS Trang 31 Giáo trình Assembler END BATDAU d Các bước biên dịch chương trình hợp ngữ MASM - Dùng chương trình soạn thảo (Notepad chẳn hạn) để soạn thảo mã nguồn lưu lại tên tập tin có phần mở rộng ASM Ví dụ Hello.asm - Dùng hợp ngữ MASM để dịch Hello.asm thành chương trình đích Hello.obj Như trên, ta đánh lệnh: Masm Hello;  (lưu ý có dấu ; sau lệnh biên dịch) - Dùng chương trình LINK để biến Hello.obj thành chương trình thi hành được: Hello.exe Như trên, ta đánh tiếp lệnh: Link Hello;  (lưu ý có dấu ; sau lệnh biên dịch) Lúc đĩa có chương trình Hello.exe ta thực thi chương trình từ DOS cách đánh vào tên chương trìh vào ấn phím Enter Như ta đánh: Hello  - Cho tập tin có COM ngồi lệnh ta phải dùng lệnh ngoại trú DOS EXE2BIN để biến đổi EXE thành COM Như ta đánh: Exe2Bin Hello.exe Hello.com  Chủ biên Võ Thanh Ân Trang 32 Mục lục Chương TỔ CHỨC BỘ XỬ LÝ INTEL 8086 .1 I BỘ XỬ LÝ (CPU) INTEL 8086 1 Tổ chức tổng quát Các ghi 8086 Tổ chức nhớ Sự phân đoạn nhớ Địa ngoại vi Các chân vi mạch 8086 .4 II CÁC LỆNH THƯỜNG DÙNG CỦA CPU 8086 .6 Giới thiệu Nhóm di chuyển số liệu Nhóm lệnh chuyển địa .7 Nhóm lệnh chuyển cờ hiệu (thanh ghi trạng thái) Nhóm lệnh vào ngoại vi Nhóm lệnh điều khiển .8 Nhóm lệnh so sánh 8 Nhóm lệnh vòng lặp 9 Nhóm lệnh gọi chương trình .9 10 Nhóm lệnh tính tốn số học .10 11 Nhóm lệnh dịch chuyển quay .11 12 Nhóm lệnh logic 13 13 Nhóm lệnh xử lý chuỗi 13 14 Các lệnh khác 15 III CÁC KIỂU ĐỊNH VỊ CỦA CPU 8086 15 Định vị tức 15 Định vị trực tiếp .15 Định vị ghi 15 Định vị 16 Định vị số .16 Định vị số .16 Định vị chuỗi 16 Định vị cửa vào 16 Chương HỢP NGỮ 17 I ĐẶC TÍNH TỔNG QUÁT CỦA HỢP NGỮ 17 Cấu trúc tổng quát lệnh hợp ngữ .17 Cấu trúc tổng quát Macro .18 Cấu trúc tổng quát chương trình 18 Cấu trúc tổng quát biến toàn cục (global), biến địa phương (local) .18 Cấu trúc tổng quát bảng, thông báo mà hợp ngữ cung cấp cho người sử dụng 18 Cấu trúc tổng quát hợp ngữ chéo (cross assembler) .19 II HỢP NGỮ MASM - DÙNG CHO CPU 8086 19 Giới thiệu hợp ngữ MASM 19 Cấu trúc hàng lệnh hợp ngữ MASM .19 Tên hợp ngữ MASM 19 Trang 33 Giáo trình Assembler III Từ gợi nhớ mã lệnh 20 LẬP TRÌNH DÙNG HỢP NGỮ MASM 27 Giới thiệu 27 Một số ngắt thường dùng HĐH MS-DOS 27 Cấu trúc chương trình hợp ngữ MASM 29 Tập tin đuôi COM tập tin đuôi EXE 30 Chủ biên Võ Thanh Ân Trang 34 ... III LẬP TRÌNH DÙNG HỢP NGỮ MASM Giới thiệu Trong lập trình dùng hợp ngữ MASM, ta thường sử dụng ngắt có sẳn ROM-BIOS (basic output input system: hệ thống vào bản) DOS Toàn ngắt nhiều sách lập trình. .. chương trình làm cho chương trình ngày dài chiếm nhiều ô nhớ nhớ Cấu trúc tổng quát chương trình Hợp ngữ thường cho phép dịch chương trình Nó đánh dấu tham khảo chương trình chương trình chương trình. .. Ân Trang    DF: lập trình được, SI DI giảm cho vịng lặp IF: lập trình được, cho phép ngắt TF: lập trình được, cho phép chương trình chạy bước để phục vụ sửa sai chương trình 15 14 13 12 11

Ngày đăng: 13/05/2014, 03:28

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan