Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 78 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
78
Dung lượng
1,32 MB
Nội dung
BÀI GIẢNG MÔN HỢP NGỮ Quảng Ngãi - 2015 Bài giảng môn Assembly Mục lục Chương - CƠ BẢN VỀ HỢP NGỮ 1.1 Cú pháp lệnh hợp ngữ 1.1.1 Trường Tên (Name Field) 1.1.2 Trường toán tử (operation field) 1.1.3 Trường toán hạng (operand(s) field) 1.1.4 Trường thích (comment field) 1.2 Các kiểu số liệu chương trình hợp ngữ 1.2.1 Các số 1.2.2 Các ký tự 1.3 Các biến (variables) 1.3.1 Biến byte 1.3.2 Biến từ 1.3.3 Mảng (arrays) 1.4 Các (constants) 1.5 Các lệnh 1.5.1 Lệnh MOV XCHG 1.5.2 Lệnh ADD, SUB, INC, DEC 1.5.3 Lệnh NEG (negative) 1.6 Chuyển ngôn ngữ cấp cao thành ngôn ngữ ASM 1.6.1 Mệnh đề B=A 1.6.2 Mệnh đề A=5-A 1.6.3 Mệnh đề A=B-2*A 1.7 Cấu trúc chương trình hợp ngữ 1.7.1 Các kiểu nhớ (memory models) 1.7.2 Đoạn số liệu 1.7.3 Đoạn ngăn xếp 1.7.4 Đọan mã 1.8 Các lệnh vào 1.8.1 Lệnh INT 21h 1.9 Chương trình 1.10 Tạo chạy chương trình hợp ngữ 10 1.11 Xuất chuỗi ký tự 10 1.12 Chương trình đổi chữ thường sang chữ hoa 11 Bài giảng môn Assembly Chương - Trạng thái vi xử lý ghi cờ 13 2.1 Các ghi cờ (Flags register) 13 2.2 Tràn (overflow) 14 2.3 Các lệnh ảnh hưởng đế cờ 15 Chương - CÁC LỆNH ĐIỀU KHIỂN 18 3.1 Ví dụ lệnh nhảy 18 3.2 Nhảy có điều kiện 18 3.3 Lệnh JMP 21 3.4 Cấu trúc ngôn ngữ cấp cao 21 3.4.1 Cấu trúc rẽ nhánh 21 4.3.2 Cấu trúc lặp 25 3.5 Lập trình với cấu trúc cấp cao 26 Chương - CÁC LỆNH LOGIC, DỊCH VÀ QUAY 31 4.1 Các lệnh logic 31 4.1.1 Lệnh AND,OR XOR 31 4.1.2 Lệnh NOT 33 4.1.3 Lệnh TEST 33 4.2 Lệnh SHIFT 33 4.2.1 Lệnh dịch trái (left shift ) 34 4.2.2 Lệnh dịch phải (Right Shift ) 34 4.3 Lệnh quay (Rotate) 35 4.4 Xuất nhập số nhị phân số hex 36 4.4.1 Nhập số nhị phân 36 4.4.2 Xuất số nhị phân 37 4.4.3 Nhập số HEX 37 4.4.4 Xuất số HEX 38 Chương - NGĂN XẾP VÀ THỦ TỤC 40 5.1 Ngăn xếp 40 5.2 Ưng dụng stack 42 5.3 Thủ tục (Procedure) 43 5.4 CALL & RETURN 44 5.5 Ví dụ thủ tục 46 Chương - LỆNH NHÂN VÀ CHIA 48 6.1 Lệnh MUL IMUL 48 Bài giảng môn Assembly 6.2 Ưng dụng đơn giản lệnh MUL IMUL 49 6.3 Lệnh DIV IDIV 50 6.4 Mở rộng dấu số bị chia 51 6.5 Thủ tục nhập xuất số thập phân 51 Chương - MẢNG VÀ CÁC CHẾ ĐỘ ĐỊA CHỈ 58 7.1 Mảng chiều 58 7.2 Các chế độ địa (addressing modes) 59 7.2.1 Chế độ địa gián tiếp ghi 59 7.2.2 Chế độ địa chỉ số sở 61 7.2.5 Truy xuất đoạn stack 65 7.3 Sắp xếp số liệu mảng 65 7.4 Mảng chiều 67 7.6 Ưng dụng để tính trung bình 69 7.7 Lệnh XLAT 71 Chương - CƠ BẢN VỀ HỢP NGỮ Trong chương giới thiệu nguyên tắc chung để tạo ra, dịch chạy chương trình hợp ngữ máy tính Cấu trúc ngữ pháp lệnh hợp ngữ giáo trình trình bày theo Macro Assembler (MASM) dựa CPU 8086 1.1 Cú pháp lệnh hợp ngữ Một chương trình hợp ngữ bao gồm loạt mệnh đề (statement) viết liên tiếp nhau, mệnh đề viết dòng Một mệnh đề : - lệnh (instruction) : trình biên dịch (Assembler =ASM) chuyển thành mã máy - dẫn Assembler (Assembler directive) : ASM không chuyển thành mã máy Các mệnh đề ASM gồm trường : Name Operation Operand(s) Comment trường cách ký tự trống ký tự TAB ví dụ lệnh đề sau : START : MOV CX,5 ; khơỉ tạo ghi CX Sau dẫn ASM : MAIN PROC ; tạo thủ tục có tên MAIN 1.1.1 Trường Tên (Name Field) Trường tên dùng cho nhãn lệnh, tên thủ tục tên biến ASM chuyển tên thành địa nhớ Tên dài từ đến 31 ký tự Trong tên chứa ký tự từ a-z, số ký tự đặc biệt sau : ? ,@, _, $ dấu Khơng phép có ký tự trống phần tên Nếu tên có ký tự phải ký tự Tên khơng bắt đầu số ASM không phân biệt ký tự viết thường viết hoa Sau ví dụ tên hợp lệ không hợp lệ ASM 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 1.1.2 Trường toán tử (operation field) Đối với lệnh trường toán tử chưá ký hiệu (symbol) mã phép toán (operation code = OPCODE) ASM chuyển ký hiệu mã phép toán thành mã máy Thơng thường ký hiệu mã phép tốn mơ tả chức phép tốn, ví dụ ADD, SUB, INC, DEC, INT Đối với dẫn ASM, trường toán tử chưá opcode giả (pseudo operation code = pseudoop) ASM không chuyển pseudo-op thành mã máy mà hướng dẫn ASM thực việc ví dụ tạo thủ tục, định nghĩa biến 1.1.3 Trường toán hạng (operand(s) field) Trong lệnh trường toán hạng số liệu tham gia lệnh Một lệnh khơng có tốn hạng, có tốn hạng Ví dụ : NOP ; khơng có tốn hạng INC AX ; tốn hạng ADD WORD1,2 ; toán hạng cộng với nội dung từ nhớ WORD1 Bài giảng môn Assembly Trong lệnh toán hạng toán hạng đầu tốn hạng đích (destination operand) Tốn hạng đích thường làthanh ghi vị trí nhớ dùng để lưu trữ kết Toán hạng thứ hai toán hạng nguồn Tốn hạng nguồn thường khơng bị thay đổi sau thực lệnh Đối với dẫn ASM, trường tốn hạng chứa nhiều thơng tin mà ASM dùng để thực thi dẫn 1.1.4 Trường thích (comment field) Trường thích tuỳ chọn mệnh đề ngôn ngữ ASM Lập trình viên dùng trường thích để thuyết minh câu lệnh Điều cần thiết ngơn ngữ ASM ngơn ngữ cấp thấp (low level) khó hiểu chương trình khơng thích cách đầy đủ rỏ ràng Tuy nhiên khơng nên có thích dòng chương trình, kể nnhững lệnh mà ý nghĩa rỏ ràng : NOP ; không làm chi Người ta dùng dấu chấm phẩy (;) để bắt đầu trường thích ASM cho phép dùng tồn dòng cho thích để tạo khoảng trống ngăn cách phần khác cuả chương trình ,ví dụ : ; ; khởi tạo ghi ; MOV AX,0 MOV BX,0 1.2 Các kiểu số liệu chương trình hợp ngữ CPU làm việc với số nhị phân Vì ASM phải chuyển tất loại số liệu thành số nhị phân Trong chương trình hợp ngữ cho phép biểu diễn số liệu dạng nhị phân, thập phân thập lục phân chí ký tự nửa 1.2.1 Các số Một số nhị phân dãy bit va 2phải kết thúc h H Một số thập phân dãy chữ só thập phân kết thúc d D (có thể khơng cần) Một số hex phải bắt đầu chữ số thập phân phải kết thúc h H Sau biểu diễn số hợp lệ không hợp lệ ASM : Số Loại 10111 thập phân 10111b nhị phân 64223 thập phân -2183D thập phân 1B4DH hex 1B4D số hex không hợp lệ FFFFH số hex không hợp lệ 0FFFFH số hex 1.2.2 Các ký tự Ký tự chuỗi ký tự phải đóng hai dấu ngoặc đơn hai dấu ngoặc kép Ví dụ ‘A’ “HELLO” Các ký tự chuyển thành mã ASCII ASM Do chương trình ASM xem khai báo ‘A’ 41h (mã ASCII A) giống Bài giảng môn Assembly 1.3 Các biến (variables) Trong ASM biến đóng vai trò ngơn ngữ cấp cao Mỗi biến có loại liệu gán địa nhớ sau dịch chương trình Bảng sau liệt kê tốn tử giả dùng để định nghĩa loại số liệu 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) 1.3.1 Biến byte Chỉ dẫn ASM để định nghĩa biến byte có dạng sau : NAME DB initial_value Ví dụ : ALPHA DB Chỉ dẫn gán tên ALPHA cho byte nhớ nhớ mà giá trị ban đầu Nếu giá trị byte không xác định đặt dấu chấm hỏi (?) vào giá trị ban đầu Ví dụ : BYT DB ? Đối với biến byte vùng giá trị mà lưu trữ -128 đến 127 số có dấu đến 255 số không dấu 1.3.2 Biến từ Chỉ dẫn ASM để định nghĩa biến từ sau : NAME DW initial_value Ví dụ : WRD DW -2 Cũng dùng dấu ? để thay cho biến từ có giá trị không xác định Vùng giá trị biến từ -32768 đến 32767 số có dấu đến 56535 số không dấu 1.3.3 Mảng (arrays) Trong ASM mảng loạt byte nhớ từ nhớ liên tiếp Ví dụ để định nghĩa mảng byte gọi B_ARRAY mà giá trị ban đầu 10h,20h 30h viết : B_ARRAY DB 10h,20h,30h B_ARRAY tên gán cho byte B_ARRAY+1 tên byte thứ hai B_ARRAY+2 tên byte thứ ba Nếu ASM gán địa offset 0200h cho mảng B_ARRAY nội dung nhớ sau : SYMBOL ADDRESS CONTENTS B_ARRAY 200h 10h B_ARRAY+1 201h 20h B_ARRAY+2 202h 30h Chỉ dẫn sau định nghĩa mảng phần tử có tên W_ARRAY: W_ARRAY DW 1000,40,29887,329 Bài giảng môn Assembly Giả sử mảng bắt đầu 0300h nhớ sau: SYMBOL ADDRESS CONTENTS W_ARRAY 300h 1000d W_ARRAY+2 302h 40d W_ARRAY+4 304h 29887d W_ARRAY+6 306h 329d Byte thấp byte cao từ Đôi cần truy xuất tới byte thấp byte cao biến từ Giả sử định nghĩa : WORD1 DW 1234h Byte thấp WORD1 chứa 34h, byte cao WORD1 chứa 12h Ký hiệu địa byte thấp WORD1 ký hiệu địa byte cao WORD1+1 Chuỗi ký tự (character strings) Một mảng mã ASCII định nghĩa chuỗi ký tự Ví dụ : LETTERS DW 41h,42h,43h tương đương với LETTERS DW ‘ABC ’ Bên chuỗi, ASM phân biệt chữ hoa chữ thường Vì chuỗi ‘abc’ chuyển thành bytes : 61h ,62h 63h Trong ASM tổ hợp ký tự số định nghĩa Ví dụ : MSG DB ‘HELLO’, 0AH, 0DH, ‘$’ tương đương với MSG DB 48H,45H,4CH,4Ch,4FH,0AH,0DH,24H 1.4 Các (constants) Trong chương trình đặt tên nhờ dẫn EQU (equates) Cú pháp EQU : NAME EQU constant ví dụ : LF EQU 0AH sau có khai báo LF dùng thay cho 0Ah chương trình Vì ASM chuyễn lệnh : MOV DL,0Ah MOV DL,LF thành mã máy Cũng dùng EQU để định nghĩa chuỗi, ví dụ: PROMPT EQU ‘TYPE YOUR NAME ’ Sau có khai báo này, thay cho MSG DB ‘TYPE YOUR NAME ’ viết MSG DB PROMPT Bài giảng môn Assembly 1.5 Các lệnh CPU 8086 có hàng trăm lệnh, chương ,chúng ta xem xét lệnh đơn giản 8086 mà chúng thường dùng với thao tác di chuyển số liệu thực phép toán số học Trong phần sau đây, WORD1 WORD2 biến từ, BYTE1 BYTE2 biến byte 1.5.1 Lệnh MOV XCHG Lệnh MOV dùng để chuyển số liệu ghi, ghi vị trí nhớ để di chuyển trực tiếp số đến ghi vị trí nhớ Cú pháp lệnh MOV : MOV Destination, Source Sau vài ví dụ : MOV AX,WORD1 ; lấy nội dung từ nhớ WORD1 đưa vào ghi AX MOV AX,BX ; AX lấy nội dung BX, BX không thay đổi MOV AH,’A’ ; AX lấy giá trị 41h Bảng sau cho thấy trường hợp cho phép cấm lệnh MOV Lệnh XCHG (Exchange) dùng để trao đổi nội dung ghi ghi vị trí nhớ Ví dụ : XCHG AH,BL XCHG AX,WORD1 ; trao đổi nội dung ghi AX từ nhớ WORD1 Cũng lệnh MOV có số hạn chế lệnh XCHG bảng sau : 1.5.2 Lệnh ADD, SUB, INC, DEC Lệnh ADD SUB dùng để cộng trừ nội dung ghi, ghi vị trí nhớ, cộng (trừ) số với (khỏi) ghi vị trí nhớ Cú pháp : ADD Destination, Source SUB Destination, Source Ví dụ : ADD WORD1, AX ADD BL, 5 Bài giảng môn Assembly SUB AX,DX ; AX=AX-DX Vì lý kỹ thuật, lệnh ADD SUB bị số hạn chế bảng sau: Việc cộng trừ trực tiếp vị trí nhớ khơng phép Để giải vấn đề người ta phải di chuyển byte (từ ) nhớ đến ghi sau cộng trừ ghi với byte (từ ) nhớ khác Ví dụ: MOV AL, BYTE2 ADD BYTE1, AL Lệnh INC (incremrent) để cộng thêm vào nội dung ghi vị trí nhớ Lệnh DEC (decrement) để giảm bớt khỏi ghi vị trí nhớ Cú pháp chúng là: INC Destination DEC Destination Ví dụ : INC WORD1 INC AX DEC BL 1.5.3 Lệnh NEG (negative) Lệnh NEG để đổi dấu (lấy bù ) ghi vị trí nhớ Cú pháp : NEG destination Ví dụ : NEG AX ; Giả sử AX=0002h sau thực lệnh NEG AX AX=FFFEh LƯU Ý : toán hạng lệnh phải loại (cùng byte từ ) 1.6 Chuyển ngôn ngữ cấp cao thành ngôn ngữ ASM Giả sử A B biến từ Chúng ta chuyển mệnh đề sau ngôn ngữ cấp cao ngôn ngữ ASM 1.6.1 Mệnh đề B=A MOV AX,A ; đưa A vào AX MOV B,AX ; đưa AX vào B 1.6.2 Mệnh đề A=5-A MOV AX,5 ; đưa 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 Bài giảng môn Assembly AX SI DI 1000h 2000h 3000h 1000h 2000h 3000h 1BACh 20FFh 031Dh Ví dụ 1: Hãy cho biết lệnh sau hợp lý, offset nguồn kết qủa lệnh hợp lý a MOV BX,[BX] b MOV CX,[SI] c MOV BX,[AX] d ADD [SI],[DI] e INC [DI] Lời giải : a b c d e Source offset 1000h 2000h illegal source register (must BX,SI,DI) illegal memory-memory add 3000h Result 1BACh 20FFh be 031Eh Ví dụ : Viết đoạn mã để cộng vào AX 10 phần tử mảng W định nghĩa sau : W DW 10,20,30,40,50,60,70,80,90,100 Giải : XOR AX,AX ; xoá AX LEA SI,W ; SI trỏ tới địa sở (base) mảmg W MOV CX,10 ; CX chưá số phần tử mảng ADDITION: ADD AX,[SI] ; AX=AX + phần tử thứ ADD SI,2 ; tăng trỏ lên LOOP ADDITION ; lặp Ví dụ : Viết thủ tục để đảo ngược mảng n từ Điều có nghĩa phần tử thứ đổi thành phần tử thứ n, phần tử thứ hai thành phần tử thứ n-1 Chúng ta dùng SI trỏ mảng BX chứa số phần tử mảng (n từ ) Giải : Số lần trao đổi N/2 lần Nhớ phần tử thứ N mảng có địa A+2x(N-1) Đoạn mã sau : REVERSE PROC ; input: SI= offset of array ; BX= number of elements ; output : reverse array PUSH AX ; cất ghi PUSH BX PUSH CX PUSH SI PUSH DI ; DI tới phần tử thứ n 60 Bài giảng môn Assembly MOV DI,SI ; DI trỏ tới từ thứ MOV CX,BX ; CX=BX=n : số phần tử DEC BX ; BX=n-1 SHL BX,1 ;BX=2x(n-1) ADD DI,BX ;DI = 2x(n-1) + offset mảng : tới phần tử ; thứ n SHR CX,1 ;CX=n/2 : số lần trao đổi ; trao đổi phần tử XCHG_LOOP: MOV AX,[SI] ; lấy phần tử nửa thấp mảng XCHG AX,[DI] ; đưa lên nửa cao mảng MOV [SI],AX ; hoàn thành trao đổi ADD SI,2 ; SI tới phần tử mảng SUB DI,2 ; DI tới phần tử thứ n-1 LOOP XCHG_LOOP POP DI POP SI POP CX POP BX POP AX RET REVERSE ENDP 7.2.2 Chế độ địa chỉ số sở Trong chế độ địa này, địa offset tốn hạng có cách cộng số gọi displacement với nội dung ghi Displacement : - địa offset biến, ví dụ A - (âm dương ), ví dụ -2 - địa offset biến cộng với số, ví dụ A+4 Cú pháp tốn hạng kiểu tương đương sau : [ register + displacement] [displacement + register] [ register]+ displacement [ displacement]+ register displacement[register] Các ghi phải BX, SI, DI (địa đoạn phải ghi DS) BP (thanh ghi SS chứa địa đoạn ) Chế độ địa gọi sở (based) ghi BX(base register) BP (base pointer) dùng Chế độ địa gọi số (indexed) ghi SI(source index) DI (destination index) dùng Ví dụ : Giả sử W mảng từ BX chưá Trong lệnh MOV AX,W[BX} 61 Bài giảng môn Assembly displacement địa offset biến W Lệnh di chuyển phần tử có điạ W+4 vào ghi AX Lệnh viết dạng tương đương sau : MOV MOV MOV MOV AX, AX, AX, AX, [W+BX] [BX+W] W+[BX] [BX]+W Lấy ví dụ khác, giả sử SI chứa địa mảng từ W Trong lệnh MOV AX,[SI+2] displacement Lệnh di chuyển nội dung từ nhớ W+2 tới AX Lệnh viết dạng khác : MOV MOV MOV MOV AX,[2+SI] AX,2+[SI] AX,[SI]+2 AX,2[SI] Với chế độ địa sở viết lại code cho tốn tính tổng 10 phần tử mảng sau: XOR AX,AX ; xoá AX XOR BX,BX ; xoá BX (thanh ghi sở ) MOV CX,10 ; CX= số phần tử =10 ADDITION: ADD AX,W[BX} ; sum=sum+element ADD BX,2 ; trỏ tới phần tử thứ hai LOOP ADDITION Ví dụ : Giả sử ALPHA khai báo sau : ALPHA DW 0123h,0456h,0789h,0ADCDH đoạn địa DS giả sử : BX =2 [0002]= 1084h SI=4 [0004]= 2BACh DI=1 Chỉ lệnh sau hợp lệ, địa offset nguồn số chuyển a MOV AX,[ALPHA+BX] b MOV BX,[BX+2] c MOV CX,ALPHA[SI} d MOV AX,-2[SI] e MOV BX,[ALPHA+3+DI] f MOV AX,[BX]2 g MOV BX,[ALPHA+AX] Giải : a b c d e f Source offset ALPHA+2 2+2 = ALPHA+4 -2+4=+2 ALPHA+3+1=ALPHA+4 illegal form source operand [BX]2 62 Number moved 0456h 2BACh 0789h 1084h 0789h Bài giảng môn Assembly g illegal ; ghi AX không phép Ví dụ sau cho thấy mảng xử lý chế độ địa chỉ số sở Ví dụ : Đổi ký tự viết thường chuỗi sau thành ký tự viết hoa MSG DB ‘co ty lo lo ti ca ’ Giải : MOV CX,17 ; số ký tự chứa CX=17 XOR SI,SI ; SI số cho ký tự TOP: CMP MSG[SI], ‘ ’ ; blank? JE NEXT ; yes, skip AND MSG[SI],0DFH ; đổi thành chữ hoa NEXT: INC SI ; số ký tự LOOP TOP ; lặp Trong chương trước biết toán hạng lệnh phải loại, tức là byte từ Nếu toán hạng số ASM chuyển chúng thành loại tương ứng với tốn hạng Ví dụ, ASM thực lệnh MOV AX,1 lệnh toán hạng từ Tương tự, ASM thực lệnh MOV BH,5 lệnh byte Tuy nhiên, lệnh MOV [BX],1 không hợp lệ ASM khơng biết tốn hạng ghi BX toán hạng byte hay toán hạng từ Có thể khắc phục điều tốn tử PTR sau : MOV BYTE PTR [BX],1 ; toán hạng đích tốn hạng byte MOV WORD PTR [BX],1 ; tốn hạng đích tốn hạng từ Ví dụ : Thay ký tự t thành T chuỗi định nghĩa : MSG DB ‘this is a message’ Cách 1: Dùng chế độ địa gián tiếp ghi : LEA SI,MSG ; SI trỏ tới MSG MOV BYTE PTR [SI],’T’ ; thay t T Cách : Dùng chế độ địa chỉ số : XOR SI,SI ; xoá SI MOV MSG[SI],’T ’ ; thay t T Ở khơng cần dùng PTR MSG biến byte Nói chung tốn tử PTR dùng để khai báo loại (type) toán hạng Cú pháp chung sau: Type PTR address_expression Trong Type : byte, word, Dword Addres_expression : biến khai báo DB,DW, DD Ví dụ có khai báo biến sau : DOLLARS DB 1AH CENTS DB 52H 63 Bài giảng môn Assembly muốn di chuyển DOLLARS vào AL, di chuyển CENTS vào AH lệnh MOV Có thể dùng lệnh sau : MOV AX, WORD PTR DOLLARS ; AL=DOLLARS AH=CENTS Toán tử giả LABEL Có cách khác để giải vấn đề xung đột loại toán hạng cách dùng toán tử giả LABEL sau : MONEY LABEL WORD DOLLARS DB 1AH CENTS DB 52H Các lệnh khai báo biến MONEY biến từ với thành phần DOLLARS CENTS Trong DOLLRAS có địa với MONEY Lệnh MOV AX, MONEY Tương đương với lệnh : MOV AL, DOLLARS MOV AH, CENTS Ví dụ : Giả sử số liệu khai báo sau : DATA A DW 1234h B LABEL BYTE DW 5678h C LABEL WORD C1 DB 9Ah C2 DB 0bch Hãy cho biết lệnh sau hợp lệ kết qủa lệnh a MOV AX,B b MOV AH,B c MOV CX,C d MOV BX,WORD PTR B e MOV DL,WORD PTR C f MOV AX, WORD PTR C1 Giải : a không hợp lệ b hợp lệ, 78h c hợp lệ, 0BC9Ah d hợp lệ, 5678h e hợp lệ, 9Ah f hợp lệ, 0BC9Ah Trong chế độ địa gián tiếp ghi, ghi trỏ BX,SI DI địa offset ghi đoạn DS Cũng ghi đọan khác theo cú pháp sau : segment_register : [ pointer_register] Ví dụ : MOV AX, ES:[SI] SI=0100h địa toán hạng nguồn ES:0100h Việc chiếm đọan dùng với chế độ địa chỉ số chế độ địa sở 64 Bài giảng môn Assembly 7.2.5 Truy xuất đoạn stack Như nói BP địa offset chế độ địa gián tiếp ghi, SS cung cấp số đoạn Điều có nghĩa dùng dùng BP để truy xuất stack Ví dụ : Di chuyển từ đỉnh stack vào AX,BX,CX mà không làm thay đổi nội dung stack MOV MOV MOV MOV BP,SP ; BP tới đỉnh stack AX,[BP] ; copy đỉnh stack vào AX BX,[BP+2] ; copy từ thứ hai stack vào BX CX,[BP+4] ; copy từ thứ ba vào CX 7.3 Sắp xếp số liệu mảng Việc tìm kiếm phần tử mảng dễ dàng mảng xếp (sort) Để sort mảng A gồm N phần tử tiến hành qua N-1 bước sau : Bước 1: Tìm số lớn số phần tử A[1] A[N] Gán số lớn cho A[N] Bước : Tìm số lớn số A[1] A[N-1] Gán số lớn cho A[N-1} Bước N-1 : Tìm só lớn só A[1] A[2} Gán só lớn cho A[2} Ví dụ : giả sử mảng A chứa phần tử số nguyên sau : Position initial Bước Bước Bước Bước 21 21 7 5 5 16 16 16 16 16 40 21 21 21 40 40 40 40 Thuật toán i =N FOR N-1 times DO find the position k of the largest element among A[1] A[i] Swap A[i] and A[k] (uses procedure SWAP ) i=i-1 END_FOR Sau chương trình để sort phần mộ mảng Chúng ta dùng thủ tục SELECT để chọn phần tử mảng Thủ tục SELECT goị thủ tục SWAP để xếp Chương trình sau : TITLE PGM7_3: TEST SELECT MODEL SMALL STACK 100H DATA A DB 5,2,,1,3,4 CODE MAIN PROC MOV AX,@DATA 65 Bài giảng môn Assembly MOV DS,AX LEA SI,A MOV BX,5 ; số phần tử mảng chứa BX CALL SELECT MOV AH,4CH INT 21H MAIN ENDP INCLUDE C:\ASM\SELECT.ASM END MAIN Tập tin SELECT.ASM chứa thủ tục SELECT vàthủ tục SWAP viết sau C:\ASM SELECT PROC ; xếp mảng byte ; input: SI = địa offset mảng BX= số phần tử (n) mảng ; output: SI = điạ offset mảng xếp ; uses : SWAP PUSH BX PUSH CX PUSH DX PUSH SI DEC BX ; N = N-1 JE END_SORT ; Nếu N=1 MOV DX,SI ; cất địa offfset mảng vào DX ; lặp N-1 lần SORT_LOOP: MOV SI,DX ; SI trỏ tới mảng A MOV CX,BX ; CX = N -1 số lần lặp MOV DI,SI ; DI tới phần tử thứ MOV AL,[DI] ; AL chứa phần tử thứ ; tìm phần tử lớn FIND_BIG: INC SI ; SI trỏ tới phần tử CMP [SI],AL ; phần tử > phần tử thứ ING NEXT ; không, tiếp tục MOV DI,SI ; DI chứa địa phần tử lớn MOV AL,[DI] ; AL chứa phần tử lớn NEXT: LOOP FIND_BIG ; swap phần tử lớn với phần tử cuối CALL SWAP 66 Bài giảng môn Assembly DEC BX ; N= N-1 JNE SORT_LOOP ; lặp N0 END_SORT: POP SI POP DX POP CX POP BX RET SELECT ENDP SWAP PROC ; đổi chỗ phần tử mảng ; input : SI= phần tử thứ ; DI = phần tử thứ hai ; output : phần tử trao đổi PUSH AX ; cất AX MOV AL,[SI] ; lấy phần tử A[i] XCHG AL,[DI] ; đặt A[k] MOV [SI],AL ; đặt A[k] A[i] POP AX ; lấy lại AX RET SWAP ENDP Sau dịch chương trình, dùng DEBUG để chạy thử test kết qủa 7.4 Mảng chiều Mảng chiều mảng mảng, nghĩa mảng chiều mà phần tử mảng chiều khác Có thể hình dung mảng chiều ma trận chữ nhật Ví dụ mảng B gồm có hàng cột (mảng 3x4) sau : ROW\COLUMN B[1,1] B[2,1] B[3,1] B[1,2] B[2,2] B[3,2] B[1,3] B[2,3] B[3,3] B[1,4] B[2,4] B[3,4] Bởi nhớ chiều phần tử mảng chiều phải lưu trữ nhớ theo kiểu Có cách dùng : - Cách lưu trữ theo thứ tự dòng : mảng lưu trữ phần tử dòng đến phần tử dòng - Cách lưu trữ theo thứ tự cột : mảng lưu trữ phần tử cột đến phần tử cột Giả sử mảng B chứa 10,20,30,40 dòng chứa 50,60,70,80 dòng chưá 90,100,110,120 dòng Theo trật tự hàng chúng lưu trữ sau : B DW 10,20,30,40 DW 50,60,70,80 67 Bài giảng môn Assembly DW 90,100,110,120 Theo trật tự cột chúng lưu trữ sau : B DW 10,50,90 DW 20,60,100 DW 30,70,110 DW 40,80,120 Hầu hết ngôn ngữ cấp cao biên dịch mảng 2chiều theo trật tự dòng Trong ASM, dùng cách : thành phần hàng xử lý cách lưu trữ theo trật tự hàng dùng Ngược lại dùng cách lưu trữ theo trật tự cột Xác định phần tử mảng chiều : Giả sử mảng A gồm MxN phần tử lưu trữ theo trật tự dòng Goị S độ lớn phần tử : S=1 phần tử byte, S=2 phần tử từ Để tìm phần tử thứ A[i,j] cần tìm : hàng i tìm phần tử thứ j hàng Như phải tiến hành qua bước : Bước 1: Hàng bắt đầu vị trí A Vì hàng có N phần tử, Hàng bắt đầu A+ NxS Hàng bắt đầu A+2xNxS Hàng thứ i bắt đầu A+(i-1)xSxN Bước 2: Phần tử thứ j hàng cách vị trí đầu hàng (j-1)xS byte Từ bước suy mảng chiều NxM phần tử mà chúng lưu trữ theo trật tự hàng phần tử A[i,j] có địa xác định sau : A+((i-1)xN + (j-1))x S (1) Tương tự lưu trữ theo trật tự cột phần tử A[i,j] có địa sau : A+(i-1)+(j )xM)xS (2) Ví dụ : Giả sử A mảng MxN phần tử kiểu từ (S=2) lưu trữ theo kiểu trật tự hàng Hỏi : Hàng i bắt đầu địa ? Cột j bắt đầu điạ ? Hai phần tử cốt cách bytes Giải : Hàng i bắt đầu A[i,1] theo cơng thức (1) có địa : A+(i-1)xNx2 Cột j bắt đầu A[1,j ] theo công thức (1) có địa : A+(j-1)x2 Vì có N cột nên phần tử cột cách 2xN byte Trong chế độ này, địa offset toán hạng tổng : nội dung ghi sở (BX or BP) nội dung ghi số (SI or DI) địa offset biến (tuỳ chọn) âm dương (tuỳ chọn) Nếu ghi BX dùng DS chứa số đoạn địa tốn hạng Nếu BP dùng SS chưá số đoạn Toán hạng viết theo cách đây: variable[base_register][index_register] [base_register + index_register + variable + constant ] variable [ base_register + index_register + constant] constant [ base _ register + index_register + variable] Trật tự thành phần dấu ngoặc tuỳ ý Ví dụ, giả sử W biến từ, BX=2 SI =4 Lệnh MOV AX, W[BX][SI] 68 Bài giảng môn Assembly di chuyển nội dung mảng địa W+2+4 = W+6 vào ghi AX Lệnh viết theo cách sau : MOV AX,[W+BX+SI] MOV AX,W[BX+SI] Chế độ địa chỉ số sở thường dùng để xử lý mảng chiều ví dụ sau : Giả sử A mảng 5x7 từ lưu trữ theo trật tự dòng Viết đoạn mã dùng chế độ địa chỉ số để : 1) xóa dòng 2) xố cột Giải : 1) Dòng i bắt đầu A+(i-1)xNx2 Như dòng bắt đầu A+(2-1)x7x2= A + 28 Có thể xóa dòng sau : MOV BX,28 ; BX đến đầu dòng XOR SI,SI ; SI mục cột MOV CX,7 ; CX= số phần tử hàng CLEAR: MOV A[BX][SI],0 ; xoá A[3,1] ADD SI,2 ; đến cột LOOP CLEAR 2) Cột j bắt đầu điạ A + (j-1)x2 Vậy cột bắt đầu điạ A+(4-1)x2 = A+ Hai phần tử cột cách Nx2 byte, N=7, phần tử cách 14 byte Có thể xóa cột sau : MOV SI,6 ; SI đến cột XOR BX,BX ; BX đến hàng MOV CX,5 ; CX= : số phần tử cột CLEAR: MOV A[BX][SI],0 ; Xoá A[i,4] ADD BX,1 ; đến dòng LOOP CLEAR 7.6 Ưng dụng để tính trung bình Giả sử lớp gồm sinh viên có mơn thi Kết qủa cho mảng chiều sau : Tên SV Mary Scott George Beth Scam Bài thi 67 70 82 80 78 Bài thi 45 56 72 67 76 Bài thi 98 87 89 95 92 Bài thi 33 44 40 50 60 Chúng ta viết chương trình tính điểm trung bình cho thi Để làm điều tổng theo cột chia cho Thuật toán : j = repeat Sum the scores in column j 69 Bài giảng môn Assembly divide sum by to get average in column j j = j - Until j = Trong bước làm sau : Sum[j]= i = FOR times DO Sum[j]= Sum[j]+ Score[i, j] i = i + END_FOR Chương trình viết sau : TITLE PGM7_4 : CLASS AVERAGE MODEL SMALL STACK 100H DATA FIVE DB SCORES DW 67,45,98,33 ; MARY DW 70,56,87,44 ;SCOTT DW 82,72,89,40 ;GEORGE DW 80,67,,95,50 ; BETH DW 78,76,92,60 ;SAM AVG DW DUP (0) CODE MAIN PROC MOV AX,@DATA MOV DS,AX ;J=4 REPEAT: MOV SI,6 ; SI đến cột thứ XOR BX,BX ; BX hàng thứ XOR AX,AX ; AX chứa tổng theo cột ; Tổng điểm cột j FOR: ADD AX, SCORES[BX+SI] ADD BX,8 ; BX đến hàng thứ LOOP FOR ; end_for ; tính trung bình cột j XOR DX,DX ; xố phần cao số bị chia (DX:AX) DIV FIVE ; AX = AX/5 MOV AVG[SI],AX ; cất kết qủa mảng AVG 70 Bài giảng môn Assembly SUB SI,2 ; đến cột tiếp ; un til j=0 JNL REPEAT ;DOS EXIT MOV AH,4CH INT 21H MAIN ENDP END MAIN Sau biên dịch chương tnh dùng DEBUG để chạy xem kết qủa lệnh DUMP 7.7 Lệnh XLAT Trong số ứng dụng cần phải chuyển số liệu từ dạng sang dạng khác Ví dụ IBM PC dùng ASCII code cho ký tự IBM Mainframes dùng EBCDIC (Extended Binary Coded Decimal Interchange Code) Để chuyển chuỗi ký tự mã hoá ASCII thành EBCDIC, chương trình phải thay mã ASCII ký tự chuỗi thành mã EBCDIC tương ứng Lệnh XLAT (khơng có tốn hạng ) dùng để đổi giá trị byte thành giá trị khác chứa bảng AL phải chứa byte cần biến đổi DX chứa điạ offset bảng cần biến đổi Lệnh XLAT : 1) cộng nội dung AL với địa BX để tạo điạ bảng 2) thay giá trị AL với giá trị tìm thấy bảng Ví dụ, giả sử nội dung AL vùng đến Fh muốn thay mã ASCII số hex tương đương nó, tức thay 6h 036h=‘6’ , thay Bh 042h=“B” Bảng biến đổi : TABLE DB 030h ,031h, 032h ,033h ,034h, 035h, 036h, 037h,038h,039h DB 041h, 042h ,043h, 044h, 045h, 046h Ví dụ, để đổi 0Ch thành “C”, thực lệnh sau : MOV AL,0Ch ; số cần biến đổi LEA BX,TABLE ; BX chưá điạ offset bảng XLAT ; AL chứa “C” Ở XLAT tính TABLE + Ch = TABLE +12 thay AL 043h Nếu AL chứa số khơng khỏang đến 15 XLAT cho giá trị sai Ví dụ : Mã hố giải mã thơng điệp mật Chương trình : - Nhắc nhở người dùng nhập vào thơng điệp - Mã hố dạng không nhận biết , - In chúng dòng - Dịch chúng trở lại dạng ban đầu in chúng dòng Khi chạy ct hình có dạng sau : ENTER A MESSAGE : DAI HOC DA LAT ; input 71 Bài giảng môn Assembly OXC BUC OX EXK ; encode DAI HOC DA LAT ; translated Thuật toán sau : Print prompt Read and encode message Go to anew line Print encoded message go to a new line translate and print message Code: TITLE PGM7_5 : SECRET MESSAGE MODEL SMALL STACK 100H DATA ;ALPHABET ABCDEFGHIJKLMNOPQRSTUVWXYZ CODE_KEY DB 65 DUP (’ ‘), ‘ XQPOGHZBCADEIJUVFMNKLRSTWY’ DB 37 DUP (‘ ‘) ; 128 ký tự bảng mã ASCII CODED DB 80 dup (‘$’) ; 80 ký tự gõ vào DECODE_KEY DB 65 DUP (‘ ‘), ‘JHIKLQEFMNTURSDCBVWXOPYAZG’ DB 37 DUP (‘ ‘) PROMPT DB ‘ENTER A MESSAGE :’,0DH,0AH,’$’ CRLF DB 0DH,0AH,’$’ CODE MAIN PROC MOV AX,@DATA MOV DS, AX ; in dấu nhắc MOV AH,9 LEA DX,PROMPT INT 21H ; đọc mã hoá ký tự MOV AH,1 LEA BX,CODE_KEY ; BX tới CODE_KEY LEA DI, CODED ; DI tới thơng điệp mã hố WHILE_: INT 21h ; đọc ký tự vào AL CMP AL,0DH ; có phải ký tự CR JE ENDWHILE ; đúng, đến phần in thơng điệp mã hố XLAT ; mã hố ký tự MOV [DI],AL ; cất ký tự CODE 72 Bài giảng môn Assembly JMP WHILE_ ; xử lý ký tự ; xuống hàng MOV AH,9 LEA DX,CRLF INT 21H ; in thơng điệp mã hố LEA DX,CODED INT 21H ; xuống hàng LEA DX,CRLF INT 21H ; giải mã thơng điệp in MOV AH,2 LEA BX,DECODE_KEY ; BX chứa điạ bảng giải mã LEA SI,CODED ; SI tới thông điệp mã hố WHILE1: MOV AL,[SI] ; lấy ký tự từ thơng điệp mã hố CMP AL.’$’ ; có phải cuối thông điệp JE ENDWHILE1 ; kết thúc XLAT ; giải mã MOV DL,AL ;đặt ký tự vào DL INT 21H ; in ký tự INC SI ; SI=SI+1 JMP WHILE1 ; tiếp tục ENDWHILE1: MOV AH,4CH INT 21H MAIN ENDP END MAIN Trong chương trình có đọan số liệu với khai báo sau : ; ALPHABET ABCDEFGHIJKLMNOPQRSTUVWXYZ Cho biết bảng chữa tiếng Anh CODE_KEY DB 65 DUP (’ ‘), ‘ XQPOGHZBCADEIJUVFMNKLRSTWY’ DB 37 DUP (‘ ‘) Khai báo 128 ký tự bảng mã ASCII, thứ tự ký tự hoa tuỳ ý CODED DB 80 dup (‘$’) 80 ký tự gõ vào, giá trị ban đầu $ để in hàm ngắt 21h DECODE_KEY DB 65 DUP (‘ ‘), ‘JHIKLQEFMNTURSDCBVWXOPYAZG’ DB 37 DUP (‘ ‘) 73 Bài giảng môn Assembly Bảng giải mã thiết lập theo cách mã hoá, nghĩa phần mã hoá mã hố ‘A’ thành ‘X’ giải mã ‘X’ phải giải mã thành ‘A’ Các ký tự gõ vào ký tự hoa đếu chuyển thành ký tự trống KẾT THÚC 74 .. .Bài giảng môn Assembly Mục lục Chương - CƠ BẢN VỀ HỢP NGỮ 1.1 Cú pháp lệnh hợp ngữ 1.1.1 Trường Tên (Name Field) ... 71 Chương - CƠ BẢN VỀ HỢP NGỮ Trong chương giới thiệu nguyên tắc chung để tạo ra, dịch chạy chương trình hợp ngữ máy tính Cấu trúc ngữ pháp lệnh hợp ngữ giáo trình trình bày theo Macro... A,5 ;A=5-A Bài giảng môn Assembly 1.6.3 Mệnh đề A=B-2*A MOV SUB SUB MOV AX,B AX,A AX,A A,AX ;Ax=B ;AX=B-A ;AX=B-2*A ;A=B-2*A 1.7 Cấu trúc chương trình hợp ngữ Một chương trình ngơn ngữ máy bao