Tổng Hợp

Bài tập lập trình hợp ngữ asembly

Ngày đăng: 05/04/2014, 23:58

Bài thực hành số 1 Nhập môn Mục đích  Làm quen với ngôn ngữ lập trình Assembly  Biết cách viết, dịch, chạy và chẩn lỗi (debug) một vài chương trình đơn giản Tóm tắt lý thuyết Hợp ngữ (assembler) là ngôn ngữ bậc thấp, giúp cho người lập trình không phải ghi nhớ mã máy (opcode) mà sử dụng các từ ngữ gợi nhớ (pseudo-code) gần với ngôn ngữ tự nhiên để mô tả công việc cần thực hiện. Tuy vậy, assembler rất gần với ngôn ngữ máy, đòi hỏi người lập trình phải hiểu biết tương đối đầy đủ về cấu trúc phần cứng PC. Với mỗi kiểu thiết kế của bộ vi xử lý, có một bộ lệnh riêng, do đó, có một ngôn ngữ assembler riêng cho nó. Ở đây, tất cả chúng ta tìm hiểu assembler cho các bộ vi xử lý Intel thuộc họ x86. Các chương trình sẽ được viết cho cơ chế thực (real mode) trong DOS và được biên dịch bằng Turbo Assembler. Cấu trúc thông thường của một chương trình hợp ngũ .model <Khai báo kiểu chương trìnhvàgt; .stack <Khai báo kích thước ngăn xếpvàgt; .data <Khai báo dữ liệuvàgt; .code <Các lệnhvàgt; end Ví dụ: Chương trình sau in ra màn hình dòng chữ “Hello !” .model small .stack 100h .data s DB “Hello !$” ; khai báo xâu kí tự cần in .code mov AX,@data ; lấy địa chỉ data segment ghi vào DS mov DS,AX ; Vì model small, đây cũng là địa chỉ ; segment của xâu s ; xuất chuỗi mov DX, OFFSET s ; lấy địa chỉ offset ghi vào DX mov AH , 9 int 21h ; gọi hàm 9, ngắt 21h để in mov AH, 4Ch ; Thoát khỏi chương trình int 21h end Lưu ý: – Mọi chương trình đều phải có đoạn code thoát khỏi chương trình, nếu không chương trình sẽ không dừng khi hết chương trình của mình. Khai báo biến trong hợp ngữ Cú pháp: <tên biếnvàgt; Dvàlt;Kiểu DLvàgt; <giá trị khởi tạovàgt; hoặc <tên biếnvàgt; Dvàlt;Kiểu DLvàgt; <số phần tửvàgt; dup(<giá trị khởi tạovàgt;) Các kiểu dữ liệu: B (1 byte), W (2 bytes), D (4 bytes) Nếu không khởi tạo, dùng dấu hỏi “?” Ví dụ: Khai báo trong C Khai báo trong hợp ngữ char ch; ch DB ? char ch = „a‟; ch DB „a‟ char ch = 5; ch DB 5 char s[]=”nhello world!” s DB 10,13,”hello world!$” int i=100; i DW 100 long l; l DD ? char a[] = {1,2,3}; a DB 1,2,3 char a[100]; a DB 100 dup(?) char a[100][50]; a DB 100 dup(50 dup(?)) Dịch, link, chạy và chẩn lỗi chương trình từ dấu nhắc DOS Cần phải có các file: tasm.exe (dịch), tlink.exe (link), td.exe (chẩn lỗi). Các bước như sau:  B1. Thiết lập đường dẫn path = %path%;<đường kéo theo thư mục chứa các file kể trênvàgt;  B2. Biên dịch từ file .ASM sang file .OBJ Tasm <tên file chương trìnhvàgt;.ASM  B3. Biên dịch từ file .OBJ sang file .EXE Tlink <tên filevàgt;.OBJ  B4: chạy chương trình: <tên filevàgt;.EXE  B5: chẩn lỗi (nếu thiết yếu) Td <tên filevàgt;.EXE Để tự động hóa, ta có thể tạo file .BAT chứa các lệnh trên. Ví dụ: Tạo file RunASM.bat trong cùng thư mục với tập tin .ASM với nội dung như sau : tasm %1 tlink %1 %1 (%1 là lấy tham số thứ nhất trong command line) Sau đó để biên dịch, link và thực thi chương trình hello.ASM ta chỉ cần gõ : RunASM hello Công cụ EditPlus Đây là công cụ soạn thảo văn bản tiện lợi, cho phép tự động đổi màu chữ theo cú pháp. Ngoài ra còn có thể thiết đặt phím tắt để gọi các tiện ích khác. Để dùng cho soạn thảo chương trình assembler, cần sao chép file khái niệm cú pháp vào thư mục thiết lập và đăng kí sử dụng nó cho những file có tên mở rộng “.asm”.  B0. Cấu hình Edit Plus: xem trong file hướng dẫn  B1. Biên dịch file .ASM : nhấn Ctrl + 1 sẽ biên dịch file đang soạn thảo thành .OBJ  B2. Link : nhấn Ctrl + 2 sẽ biên dịch file .OBJ thành .EXE  B3. Chạy chương trình : nhấn Ctrl + 3 sẽ chạy chương trình .EXE  B4. Chẩn lỗi chương trình : nhấn Ctrl + 4 sẽ debug chương trình .EXE Lưu ý: – Để tránh phiền toái khi làm việc với Turbo Assembler, tránh đặt tên thư mục có chứa khoảng trắng. – Trước khi nhấn Ctrl + 1 lần trước hết, nhớ lưu chương trình với tên thiết yếu. Một số lệnh cơ bản MOV des,src : chép dữ liệu từ src sang des INC des : tăng des một nhà cung cấp DEC des : giảm des một nhà cung cấp ADD des,src : des = des + src SUB des,src : des = des – src INT num : gọi ngắt Tài liệu tham khảo 1. Nguyễn Minh Tuấn, Giáo trình hợp ngữ – Chương 1, ĐHKHTN, 2002 2. Randal Hyde, The art of assembly language programming – Chapter 1. 3. Norton Guide 4. Dan Rollins, TechHelp v.6.0 Bài tập Bài 1. Viết CT nhập vào 1 ký tự, xuất ra ký tự đó Ví dụ: Moi ban nhap 1 ky tu: b Ky tu vừa nhập: b Bài 2. Viết chương trình xuất ra màn hình một số dòng. Ví dụ: De chay duoc 1 CT hop ngu ban can thuc hien cac buoc sau: Dich file ASM thanh file OBJ Lien ket file OBJ thanh file EXE Chay file EXE Bài 3. Viết CT nhập vào 1 ký tự, xuất ra ký tự liền trước và liền sau. Ví dụ: Moi ban nhap 1 ky tu: b Ky tu lien truoc: a Ky tu lien sau: c Bài 4. Viết CT nhập vào 1 ký tự thường. In ra ký tự Hoa Ví dụ: Moi ban nhap 1 ky tu: b Ky tu Hoa: B Bài 5. Viết CT nhập vào 1 ký tự hoa. In ra ký tự thường Ví dụ: Moi ban nhap 1 ky tu: B Ky tu thường: b Bài 6. Viết chương trình nhập vào 2 số nguyên dương x1, x2 (1  x2 < x1 < 9). Xuất ra kết quả các phép tính: x1-1, x1 +2, x1+x2, x1-x2 Ví dụ: x1 = 5 x2 = 3 x1 – 1 = 4 x1 + 1 = 6 x1 + x2 = 8 x1 – x2 = 7 Mở rộng 1. Tự tìm hiểu xem hàm nào trong ngắt 21h dùng để nhập một xâu kí tự ? Ngoài ngắt 21h, còn ngắt nào có thể dùng để nhập xuất từ keyboard ? (dùng NortonGuide hoặc TechHelp). 2. Viết chương trình nhập tên và in ra màn hình câu “Hello ” + tên đã nhập. 3. Tìm hiểu xem vì sao không có lệnh MOV x1, x2 (x1,x2 là hai biến trong bộ nhớ lưu trữ) 4. Hai lệnh “INC AX” và “ADD AX, 1” khác nhau nơi đâu ? Hướng dẫn Bài 1. Để nhập 1 một ký tự sử dụng hàm 1 của ngắt 21h, để xuất, sử dụng hàm 2. Ví dụ: mov AH,1 int 21h ; kết quả trong AL mov DL,AL ; kí tự cần xuất trong DL mov AH,2 int 21h Bài 2. Cặp kí tự xuống dòng là 10,13. Có thể khai báo nhiều xâu kí tự hoặc chung một xâu. Ví dụ: Msg3 DB 10,13,9,“1. Dich file ASM thanh file OBJ.$” Msg4 DB 10,13,9,“2. Lien ket file OBJ thanh file EXE.$” Hoặc Msg34 DB 10,13,9,“1. Dich file ASM thanh file OBJ.” DB 10,13,9,“2. Lien ket file OBJ thanh file EXE.$” Bài 3, 4. Kí tự hoa và kí tự thường của cùng một chữ cái tiếng Anh cách nhau 20h. Do đó, để chuyển hóa chữ hoa thành chữ thường và trái lại, chỉ cần dùng lệnh ADD, SUB. Bài 5. Để chuyển hóa các kí tự „0‟ – „9‟ thành số 0 – 9 chỉ cần thực hiện phép trừ đi 48 (mã của „0‟). Sau thời điểm thực hiện phép tính, chuyển hóa thành kí tự và in ra màn hình (có thể dùng trình diễn Hex). Bài thực hành số 2 Lệnh so sánh – Lệnh nhảy – Lệnh lặp Mục đích  Hiểu cách so sánh hai số trong hợp ngữ  Hiểu cách thay đổi thứ tự thực hiện các lệnh  Biết cách sử dụng các lệnh so sánh, nhảy và lặp Tóm tắt lý thuyết Lệnh so sánh Trong hợp ngữ, muốn so sánh hai số, ta phải thực hiện một phép toán số học hoặc logic trên hai số đó và căn cứ vào các bit trong thanh ghi cờ rồi mang ra tổng kết. Để làm việc này, có thể dùng lệnh CMP và TEST. Bản chất của lệnh CMP Des,Src là lệnh SUB Des,Src (thực hiện phép tính Des – Src) nhưng kết quả của phép tính không được lưu vào Des như trong lệnh SUB. Ví dụ: so sánh hai số nguyên dương MOV AH,1 MOV AL,2 CMP AH,AL Sau thời điểm thực hiện hai lệnh trên, cờ Carry (CF) bật, báo hiệu rằng AH < AL Bản chất của lệnh TEST Des,Src là lệnh AND Des,Src (thực hiện phép tính Des AND Src) nhưng kết quả của phép tính không được lưu vào Des như trong lệnh AND. Ví dụ: xác minh hai bit cuối cùng của AL TEST AL,3 ; 3h = 11b Nếu cờ Zero (ZF) bật, có nghĩa là cả hai bit 0 và 1 của AL đều bằng 0. Lệnh nhảy Thông thường, khi một lệnh (instruction) được thực hiện, giá trị của thanh ghi IP (instruction pointer) được tự động update để trỏ đến lệnh tiếp theo. Ngoài ra, nội dung của thanh ghi IP chỉ có thể bị thay đổi thông qua một số lệnh đặc biệt. Đó là: các lệnh nhảy (J*), lệnh lặp (LOOP*), lệnh gọi hàm (call, ret), lệnh gọi ngắt (int, iret). Các lệnh này được xếp vào nhóm “Lệnh điều khiển luồng” (Program flow control instructions). Trong bài thực hành này, tất cả chúng ta sẽ học cách sử dụng các lệnh nhảy và các lệnh lặp.  Lệnh nhảy không điều kiện JMP <targetvàgt; Có các trường hợp sau:  JMP SHORT <tên nhãnvàgt; (short jump). Khi đó trong mã lệnh lưu 1 byte khoảng cách (offset) giữa vị trí hiện tại và vị trí cần nhảy đến. Kiểu này chỉ nhảy trong phạm vi từ –128 đến +127 byte so với vị trí hiện tại. Ví dụ: JMP SHORT Calculate  JMP <tên nhãnvàgt; (near jump). Khi đó trong mã lệnh lưu 2 byte khoảng cách (offset) giữa vị trí hiện tại và vị trí cần nhảy đến. Kiểu này nhảy tùy ý trong phạm vi segment. Ví dụ: JMP Calculate  JMP FAR PTR <tên nhãnvàgt; (far jump). Khi đó trong mã lệnh lưu offset và segment của vị trí cần nhảy đến. Kiểu này nhảy đến bất kì nơi đâu. Ví dụ: JMP FAR PTR Calculate  JMP <con trỏ 2 bytevàgt; (near indirect jump). Khi đó trong mã lệnh lưu địa chỉ offset của một ô nhớ. Khi thực hiện, IP sẽ được gán bằng giá trị lưu tại địa chỉ này. Có thể kết hợp dùng với định vị chỉ số. Ví dụ: myPointer DW Prepare, Calculate, Test, Output MOV bx,2 ; chỉ số trong mảng con trỏ SHL bx,1 ; nhân đôi JMP myPointer[bx] Prepare: ; công việc 0 Calculate: ; công việc 1 Test: ; công việc 2 – nơi cần nhảy đến Output: ; công việc 3  JMP <con trỏ 4 bytevàgt; (far indirect jump). Tương tự trường hợp trên, nhưng con trỏ gồm cả segment và offset. Chỉ khác ở khai báo con trỏ Ví dụ: myPointer DD Prepare, Calculate, Test, Output MOV bx,1 ; chỉ số trong mảng con trỏ MOV cl,2 SHL bx,cl ; nhân 4 JMP myPointer[bx] Prepare: ; công việc 0 Calculate: ; công việc 1 – nơi cần nhảy đến  JMP <thanh ghi 2 bytevàgt; (indirect jump via regs). Nhảy đến địa chỉ lưu trong thanh ghi AX. Ví dụ: MOV ax, offset Calculate JMP ax ; (IP ← AX)  Lệnh nhảy có điều kiện J <Labelvàgt; Các lệnh nhảy có điều kiện khởi đầu bằng chữ J sau đó là các chữ cái biểu thị điều kiện (ví dụ JGE ah,5: Jump if Greater than or Equal, nhảy nếu AH to hơn hay bằng 5), tiếp sau là một tên nhãn. Tùy thuộc vào trạng thái các cờ hiệu mà bộ vi xử lý có thực hiện việc nhảy đến nhãn hay không. So với bộ vi xử lý 80286 trở xuống, lệnh nhảy có điều kiện có độ dài 2 byte, byte trước hết chứa mã lệnh, byte thứ hai chứa khoảng cách tương đối từ lệnh đến nhãn, vì vậy <Labelvàgt; trong lệnh nhảy có điều kiện phải nằm trong khoảng từ -128 đến 127 so với vị trí lệnh nhảy. Muốn nhảy xa hơn ta phải dùng kết hợp lệnh nhảy không điều kiện JMP Từ 80386 trở lên, bộ lệnh được bổ sung, cho phép sử dụng lệnh nhảy có điều kiện có độ dài 4 byte, do đó <Labelvàgt; có quyền nằm tùy ý trong cùng phạm vi segment. Khi sử dụng lệnh nhảy có điều kiện sau khoảng thời gian thực hiện phép so sánh, phải đặc biệt lưu ý toán hạng trong phép so sánh là số có dấu (signed) hay không có dấu (unsigned) để lựa chọn lệnh cho thích hợp. Ví dụ: MOV AH,AL ; AL hiện bằng 128 CMP AH,1 JGE Greater ; AH > 1 nhưng không nhảy ???? . . . Greater: Một số lệnh nhảy có điều kiện thường dùng (tham khảo thêm trong SGK trang 81):  JE, JZ (nhảy nếu bằng).  JA (nhảy nếu to hơn, không dấu), JG (nhảy nếu to hơn, có dấu), JB (nhảy nếu nhỏ hơn, không dấu), JL (nhảy nếu nhỏ hơn, có dấu).  JAE (nhảy nếu to hơn hay bằng, không dấu), JGE (nhảy nếu to hơn hay bằng, có dấu), JBE (nhảy nếu nhỏ hơn hay bằng, không dấu), JLE (nhảy nếu nhỏ hơn hay bằng, có dấu).  JNE, JNZ (nhảy nếu không bằng). Ví dụ: nếu AL là số nguyên không dấu thì đoạn chương trình ở trên phải sửa lại như sau: MOV AH,AL CMP AH,1 JAE Greater . . . Greater: Lệnh lặp Bằng cách sử dụng các lệnh nhảy có thể tạo ra vòng lặp. Tuy nhiên, để viết chương trình tiện lợi và ngắn gọn, có thể dùng thêm các lệnh lặp như LOOP, LOOPZ,… Lệnh LOOP <Labelvàgt; tự động giảm CX một nhà cung cấp, sau đó xác minh xem CX có bằng 0, nếu không bằng thì nhảy đến nhãn <Labelvàgt; Lệnh LOOPZ <Labelvàgt; tự động giảm CX một nhà cung cấp, sau đó xác minh xem CX có bằng 0 hoặc cờ ZF có bật không, nếu cả hai điều này không xảy ra thì nhảy đến nhãn <Labelvàgt; Ví dụ: Nhập mảng A gồm 10 ký tự MOV SI, 0 ; chỉ số mảng MOV CX, 10 ; số lần lặp LAP: ;nhập ký tự MOV AH, 1 INT 21H MOV A[SI], AL INC SI ; xuất ký tự MOV AH, 2 INT 21H LOOP LAP Tài liệu tham khảo 1. Nguyễn Minh Tuấn, Giáo trình hợp ngữ – Chương 4, ĐHKHTN, 2002 2. Randal Hyde, The art of assembly language programming – Chapter 6, 10. 3. Dan Rollins, TechHelp v.6.0 4. NortonGuide Bài tập Bài 1. Viết chương trình cho nhập 1 ký tự từ màn hình và xuất câu thông báo chào buổi sáng, buổi trưa hay buổi chiều tương ứng với ký tự nhậpvào là ‘S’, ‘s’, ‘T’, ‘t’, ‘C’, ‘c’. Bài 2. Nhập 2 số nguyên dương thuộc N,M thuộc [0 9], nhập 1 ký tự Char. Xuất ra màn hình ma trận gồm N dòng và M cột gồm ký tự Char. Ví dụ: N=3, M=4, C=’*’  * * * * * * * * * * * * Bài 3. Nhập 2 số nguyên dương A, B. Tính A/B, A*B (không dùng lệnh DIV, MUL) Ví dụ: A=18, B=3 Tính A/B: 18 – 3 – 3 – 3 – 3 – 3 – 3 = 0, vậy A/B = 6 (tổng số lần A trừ B cho đến khi A = 0). Tính A*B = 18 + 18 + 18 = 54 Bài 4. Tìm USCLN của 2 số nguyên dương N, M nhập từ keyboard. Xác minh N,M có là hai số nguyên tố cùng nhau không? Ví dụ: N = 15, M = 6 => USCLN(15, 6) = 3 Ví dụ: N = 3, M = 5 => USCLN(3, 5) = 1 => 3, 5 là 2 số nguyên tố cùng nhau. Bài 5. Dùng lệnh lặp, viết chương trình nhập vào 1 chuỗi ký tự. Sau thời điểm nhập xong đếm xem chuỗi có bao nhiêu ký tự. Xuất số ký tự có trong chuỗi. Ví dụ: S = “Hello world !” ==> Số kí tự trong chuỗi là 13. Bài 6. Nhập vào 2 chuỗi số, đổi 2 chuỗi thành số, sau đó cộng hai số, đổi ra chuỗi và xuất chuỗi tổng. Ví dụ: S1 = “123” => N1 = 123 S2 = “456” => N2 = 456 N = N1 + N2 = 123 + 456 = 579 => S = “579” (xuất S ra màn hình) Bài 7. Viết chương trình cho phép nhập vào một chuỗi S. Đổi toàn bộ ký tự thường thành ký tự hoa. Đổi toàn bộ ký tự hoa thành ký tự thường. Bài 8. Nhập và xuất mảng một chiều. Tìm phần tử max, min, tính tổng các phần tử trong mảng. Ví dụ: N = 5 A[N] = {3,1,2,7,4} => max = 7, min = 1, tổng = 17. Bài 9. Thiết lập thuật toán Bubble Sort dùng ASM. Thuật toán Bubble Sort theo ngôn ngữ C như sau: for (int i = 0; ivàlt; N-1; i++) for(int j=N-1;j > i; j ) if(a[j] < a[j-1]) Hoan_Vi (a[j], a[j-1]); Bài 10. Nhập và xuất mảng A hai chiều. a. Tính tổng các phần tử trên đường chéo chính, đường chéo phụ. b. Đếm số phần tử 0 và phần tử khác 0 trong mảng. c. Tìm phần tử max của mỗi dòng, mỗi cột. Tính tổng của mỗi dòng, mỗi cột. d. Nhập 1 mảng hai chiều B, tạo một mảng hai chiều C có các phần tử trên dòng chẵn bằng với các phần tử trên dòng chẵn của A, các phần tử trên dòng lẻ bằng các phần tử trên dòng lẻ của B. Mở rộng 1. Trong bài tập 5, làm sao để đếm số từ có trong chuỗi kí tự? 2. Trong bài tập 10, làm sao để trổ tài một thực đơn cho phép người dùng chọn trong các kí tự từ „a‟ đến „d‟ sau đó thực hiện công việc ứng với chữ cái đó. Hướng dẫn Bài 1. Xem ví dụ: .MODEL SMALL .STACK 100H .DATA CBS DB “CHAO BUOI SANG$” CBT DB “CHAO BUOI TRUA$” CBC DB “CHAO BUOI CHIEU$” .CODE MOV AX, @DATA MOV DS, AX ;nhập 1 ký tự bất kỳ MOV AH, 1 INT 21H CMP AL, ‘S’ JE CHAO_BUOI_SANG CMP AL, ‘s’ JE CHAO_BUOI_SANG CMP AL, ‘T’ JE CHAO_BUOI_TRUA CMP AL, ‘t’ […]… dụng để báo cho trình biên dịch biết đây là một đối số Tài liệu tham khảo 1 2 3 4 Nguyễn Minh Tuấn, Giáo trình xác minh một biểu thức đại số có chứa các dấu ngoặc (như (), [] và {}) là hợp lệ hay không hợp lệ Ví dụ: (a +… f) là hợp lệ nhưng (a + [b – { c * ( d – e )] } + f) là không hợp lệ Bài 2: Tính giá trị biểu thức đã nhập ở bài tập 2 theo thứ tự từ trái sang phải Bài 3: Viết lại các bài tập tuần trước dưới dạng các thủ tục Bài 4: Xây dựng một thư viện các macro Mở rộng 1 Có những cách nào để truyền tham số cho thủ tục ? để nhận kết quả trả về ? 2 Thử viết một thủ tục đệ quy 3 Tìm hiểu cách phân tách chương trình. .. Khoa Công Nghệ Thông Tin – Trường ĐH KHTN Tp.HCM -2- Hướng dẫn thực hành môn Hợp Ngữ File Nếu CF = 1 thì có lỗi, xét AX: Nếu AX = 1: AL không hợp lệ Nếu AX = 3: đường dẫn không hợp lệ hoặc file không tìm thấy Nếu AX = 5: không thể thay đổi tính chất Khoa Công Nghệ Thông Tin – Trường ĐH KHTN Tp.HCM -3- Bài thực hành số 7 Lập trình màn hình Mục đích   Hiểu được cách tổ chức bộ nhớ lưu trữ màn hình cho cơ chế… khác với 004Fh thì hệ thống không thể chuyển sang SVGA Tài liệu tham khảo 1 2 3 4 Nguyễn Minh Tuấn, Giáo trình đồ họa PC, ĐHKHTN, 1998 Dan Rollins, TechHelp v.6.0 Bài tập 1 Viết chương trình (VCT) đổi một số dạng thập phân sang thập lục phân Ví dụ: Nhập một số hệ 10 : 26 Dạng thập lục phân: 1A 2 VCT nhập… như bài tập 1, làm sao để trổ tài hai dòng chữ luân phiên tiến lại gần nhau, rồi lại lùi xa nhau, rồi lại gần nhau… 3 Tìm cách pha lại (khái niệm lại) bảng màu, để sau khoảng thời gian nhấn Enter các vạch trổ tài trong bài tập 2 đột nhiên biến thành một dải màu thay đổi từ sáng trắng đến xám, đến đen Nhấn Enter lần nữa sẽ phục hồi lại dải màu như trước 4 Tìm hiểu một thuật toán vẽ đường thẳng và viết chương trình. .. qua lại giữa trang 0 và 1 cho đến khi một phím được nhấn Bài 2 Vạch màu Khởi động cơ chế 103h (SVGA) Bằng cách truy xuất trực tiếp vùng nhớ màn hình, hãy trổ tài 256 màu trong bảng màu mặc định bằng các vạch màu nằm cạnh nhau, mỗi vạch độ rộng 3 điểm ảnh Sau thời điểm nhấn phím bất kì, trở về cơ chế 03 và kết thúc chương trình Mở rộng 1 Trong bài tập 1, có nhận xét gì về vận tốc chuyển giữa hai trang ? Có… chương trình thành nhiều file và cách biên dịch, liên kểt chúng Hướng dẫn Bài 1 dùng ngăn xếp để PUSH các dấu ngoặc trái ( „(„, ‟{„, „[„ ) vào ngăn xếp Nếu gặp dấu ngoặc phải ( „)‟, „}‟, „]‟ ) thì POP từ stack ra Nếu không POP được, hoặc POP ra không đúng loại với dấu ngoặc phải -> không hợp lệ Trái lại là biểu thức hợp lệ Bài thực hành số 4 Làm việc với số nguyên Mục đích   Biết sử dụng các phép… tiếp trong chươnng trình:  Các macro thường được khai báo ở đầu chương trình trước phần code  Ví dụ: Xuất một chuỗi ra màn hình sử dụng macro model small stack 100h data chuoi1 db “hello”,10,13,‟$‟ chuoi2 db “bye”,10,13,‟$‟ @xuatchuoi macro chuoi lea dx,chuoi mov ah,9 int 21h endm code … @xuatchuoi chuoi1 @xuatchuoi chuoi2 … end  Xây dựng thư viện các macro:  Tạo 1 thư viện (tập tin) chứa các macro… thứ hai : 16 Tổng hai số là : 30 Hiệu: -2 Tích: 224 Thương: 0 Phần dư: 14 Mở rộng 1 Tìm hiểu về BCD Viết chương trình nhập 2 số nguyên ở hệ 10, chuyển sang BCD, tính tổng, hiệu và in kết quả ở hệ 10 2 Liệu có thể viết chương trình tính được 20!, 30!, kết quả in ra ở dạng hex ? dạng cơ số 10 ? Bài thực hành số 5 Làm việc với xâu kí tự Mục đích   Biết sử dụng các phép toán trên chuỗi Biết làm một số thao . + f) là không hợp lệ. Bài 2: Tính giá trị biểu thức đã nhập ở bài tập 2 theo thứ tự từ trái sang phải. Bài 3: Viết lại các bài tập tuần trước dưới dạng các thủ tục Bài 4: Xây dựng. Bài tập Bài 1: Viết chương trình xác minh một biểu thức đại số có chứa các dấu ngoặc (như (), [] và {}) là hợp lệ hay không hợp lệ . Ví dụ: (a + [b – { c * ( d – e ) } ] + f) là hợp. Bài thực hành số 1 Nhập môn Mục đích  Làm quen với ngôn ngữ lập trình Assembly  Biết cách viết, dịch, chạy và chẩn lỗi (debug) một vài chương trình đơn giản Tóm tắt lý thuyết Hợp ngữ

Xem Thêm :   Hướng Dẫn Mailchimp Là Gì? Hướng Dẫn Sử Dụng Mailchimp “Đúng Luật”

Xem thêm :  Kinh nghiệm chọn tàu superdong đi Côn Đảo

Bài tập lập trình hợp ngữ asemblythực hành số 1 Nhập môn Mục đích  Làm quen với ngônAssembly  Biết cách viết, dịch, chạy và chẩn lỗi (debug) một vài chươngđơn giản Tóm tắt lý thuyết(assembler) là ngônbậc thấp, giúp cho ngườikhông phải ghi nhớ mã máy (opcode) mà sử dụng các từgợi nhớ (pseudo-code) gần với ngôntự nhiên để mô tả công việc cần thực hiện. Tuy vậy, assembler rất gần với ngônmáy, đòi hỏi ngườiphải hiểu biết tương đối đầy đủ về cấu trúc phần cứng PC. Với mỗi kiểu thiết kế của bộ vi xử lý, có một bộ lệnh riêng, do đó, có một ngônassembler riêng cho nó. Ở đây, tất cả chúng ta tìm hiểu assembler cho các bộ vi xử lý Intel thuộc họ x86. Các chươngsẽ được viết cho cơ chế thực (real mode) trong DOS và được biên dịch bằng Turbo Assembler. Cấu trúc thông thường của một chương.model .stack .data .code end Ví dụ: Chươngsau in ra màn hình dòng chữ “Hello !” .model small .stack 100h .data s DB “Hello !$” ; khai báo xâu kí tự cần in .code mov AX,@data ; lấy địa chỉ data segment ghi vào DS mov DS,AX ; Vì model small, đây cũng là địa chỉ ; segment của xâu s ; xuất chuỗi mov DX, OFFSET s ; lấy địa chỉ offset ghi vào DX mov AH , 9 int 21h ; gọi hàm 9, ngắt 21h để in mov AH, 4Ch ; Thoát khỏi chươngint 21h end Lưu ý: – Mọi chươngđều phải có đoạn code thoát khỏi chương trình, nếu không chươngsẽ không dừng khi hết chươngcủa mình. Khai báo biến trongCú pháp: D hoặc D dup() Các kiểu dữ liệu: B (1 byte), W (2 bytes), D (4 bytes) Nếu không khởi tạo, dùng dấu hỏi “?” Ví dụ: Khai báo trong C Khai báo trongchar ch; ch DB ? char ch = „a‟; ch DB „a‟ char ch = 5; ch DB 5 char s[]=”nhello world!” s DB 10,13,”hello world!$” int i=100; i DW 100 long l; l DD ? char a[] = {1,2,3}; a DB 1,2,3 char a[100]; a DB 100 dup(?) char a[100][50]; a DB 100 dup(50 dup(?)) Dịch, link, chạy và chẩn lỗi chươngtừ dấu nhắc DOS Cần phải có các file: tasm.exe (dịch), tlink.exe (link), td.exe (chẩn lỗi). Các bước như sau:  B1. Thiếtđường dẫn path = %path%;  B2. Biên dịch từ file .ASM sang file .OBJ Tasm .ASM  B3. Biên dịch từ file .OBJ sang file .EXE Tlink .OBJ  B4: chạy chương trình: .EXE  B5: chẩn lỗi (nếu thiết yếu) Td .EXE Để tự động hóa, ta có thể tạo file .BAT chứa các lệnh trên. Ví dụ: Tạo file RunASM.bat trong cùng thư mục vớitin .ASM với nội dung như sau : tasm %1 tlink %1 %1 (%1 là lấy tham số thứ nhất trong command line) Sau đó để biên dịch, link và thực thi chươnghello.ASM ta chỉ cần gõ : RunASM hello Công cụ EditPlus Đây là công cụ soạn thảo văn bản tiện lợi, cho phép tự động đổi màu chữ theo cú pháp. Ngoài ra còn có thể thiết đặt phím tắt để gọi các tiện ích khác. Để dùng cho soạn thảo chươngassembler, cần sao chép file khái niệm cú pháp vào thư mục thiết lập và đăng kí sử dụng nó cho những file có tên mở rộng “.asm”.  B0. Cấu hình Edit Plus: xem trong file hướng dẫn  B1. Biên dịch file .ASM : nhấn Ctrl + 1 sẽ biên dịch file đang soạn thảo thành .OBJ  B2. Link : nhấn Ctrl + 2 sẽ biên dịch file .OBJ thành .EXE  B3. Chạy chương: nhấn Ctrl + 3 sẽ chạy chương.EXE  B4. Chẩn lỗi chương: nhấn Ctrl + 4 sẽ debug chương.EXE Lưu ý: – Để tránh phiền toái khi làm việc với Turbo Assembler, tránh đặt tên thư mục có chứa khoảng trắng. – Trước khi nhấn Ctrl + 1 lần trước hết, nhớ lưu chươngvới tên thiết yếu. Một số lệnh cơ bản MOV des,src : chép dữ liệu từ src sang des INC des : tăng des một nhà cung cấp DEC des : giảm des một nhà cung cấp ADD des,src : des = des + src SUB des,src : des = des – src INT num : gọi ngắt Tài liệu tham khảo 1. Nguyễn Minh Tuấn, Giáo- Chương 1, ĐHKHTN, 2002 2. Randal Hyde, The art of assembly language programming – Chapter 1. 3. Norton Guide 4. Dan Rollins, TechHelp v.6.01. Viết CT nhập vào 1 ký tự, xuất ra ký tự đó Ví dụ: Moi ban nhap 1 ky tu: b Ky tu vừa nhập: b2. Viết chươngxuất ra màn hình một số dòng. Ví dụ: De chay duoc 1 CTban can thuc hien cac buoc sau: Dich file ASM thanh file OBJ Lien ket file OBJ thanh file EXE Chay file EXE3. Viết CT nhập vào 1 ký tự, xuất ra ký tự liền trước và liền sau. Ví dụ: Moi ban nhap 1 ky tu: b Ky tu lien truoc: a Ky tu lien sau: c4. Viết CT nhập vào 1 ký tự thường. In ra ký tự Hoa Ví dụ: Moi ban nhap 1 ky tu: b Ky tu Hoa: B5. Viết CT nhập vào 1 ký tự hoa. In ra ký tự thường Ví dụ: Moi ban nhap 1 ky tu: B Ky tu thường: b6. Viết chươngnhập vào 2 số nguyên dương x1, x2 (1  x2 < x1 < 9). Xuất ra kết quả các phép tính: x1-1, x1 +2, x1+x2, x1-x2 Ví dụ: x1 = 5 x2 = 3 x1 – 1 = 4 x1 + 1 = 6 x1 + x2 = 8 x1 – x2 = 7 Mở rộng 1. Tự tìm hiểu xem hàm nào trong ngắt 21h dùng để nhập một xâu kí tự ? Ngoài ngắt 21h, còn ngắt nào có thể dùng để nhập xuất từ keyboard ? (dùng NortonGuide hoặc TechHelp). 2. Viết chươngnhập tên và in ra màn hình câu “Hello ” + tên đã nhập. 3. Tìm hiểu xem vì sao không có lệnh MOV x1, x2 (x1,x2 là hai biến trong bộ nhớ lưu trữ) 4. Hai lệnh “INC AX” và “ADD AX, 1” khác nhau nơi đâu ? Hướng dẫn1. Để nhập 1 một ký tự sử dụng hàm 1 của ngắt 21h, để xuất, sử dụng hàm 2. Ví dụ: mov AH,1 int 21h ; kết quả trong AL mov DL,AL ; kí tự cần xuất trong DL mov AH,2 int 21h2. Cặp kí tự xuống dòng là 10,13. Có thể khai báo nhiều xâu kí tự hoặc chung một xâu. Ví dụ: Msg3 DB 10,13,9,“1. Dich file ASM thanh file OBJ.$” Msg4 DB 10,13,9,“2. Lien ket file OBJ thanh file EXE.$” Hoặc Msg34 DB 10,13,9,“1. Dich file ASM thanh file OBJ.” DB 10,13,9,“2. Lien ket file OBJ thanh file EXE.$”3, 4. Kí tự hoa và kí tự thường của cùng một chữ cái tiếng Anh cách nhau 20h. Do đó, để chuyển hóa chữ hoa thành chữ thường và trái lại, chỉ cần dùng lệnh ADD, SUB.5. Để chuyển hóa các kí tự „0‟ – „9‟ thành số 0 – 9 chỉ cần thực hiện phép trừ đi 48 (mã của „0‟). Sau thời điểm thực hiện phép tính, chuyển hóa thành kí tự và in ra màn hình (có thể dùng trình diễn Hex).thực hành số 2 Lệnh so sánh – Lệnh nhảy – LệnhMục đích  Hiểu cách so sánh hai số trong Hiểu cách thay đổi thứ tự thực hiện các lệnh  Biết cách sử dụng các lệnh so sánh, nhảy vàTóm tắt lý thuyết Lệnh so sánh Trongngữ, muốn so sánh hai số, ta phải thực hiện một phép toán số học hoặc logic trên hai số đó và căn cứ vào các bit trong thanh ghi cờ rồi mang ra tổng kết. Để làm việc này, có thể dùng lệnh CMP và TEST. Bản chất của lệnh CMP Des,Src là lệnh SUB Des,Src (thực hiện phép tính Des – Src) nhưng kết quả của phép tính không được lưu vào Des như trong lệnh SUB. Ví dụ: so sánh hai số nguyên dương MOV AH,1 MOV AL,2 CMP AH,AL Sau thời điểm thực hiện hai lệnh trên, cờ Carry (CF) bật, báo hiệu rằng AH < AL Bản chất của lệnh TEST Des,Src là lệnh AND Des,Src (thực hiện phép tính Des AND Src) nhưng kết quả của phép tính không được lưu vào Des như trong lệnh AND. Ví dụ: xác minh hai bit cuối cùng của AL TEST AL,3 ; 3h = 11b Nếu cờ Zero (ZF) bật, có nghĩa là cả hai bit 0 và 1 của AL đều bằng 0. Lệnh nhảy Thông thường, khi một lệnh (instruction) được thực hiện, giá trị của thanh ghi IP (instruction pointer) được tự động update để trỏ đến lệnh tiếp theo. Ngoài ra, nội dung của thanh ghi IP chỉ có thể bị thay đổi thông qua một số lệnh đặc biệt. Đó là: các lệnh nhảy (J*), lệnh(LOOP*), lệnh gọi hàm (call, ret), lệnh gọi ngắt (int, iret). Các lệnh này được xếp vào nhóm “Lệnh điều khiển luồng” (Program flow control instructions). Trongthực hành này, tất cả chúng ta sẽ học cách sử dụng các lệnh nhảy và các lệnh lặp.  Lệnh nhảy không điều kiện JMP Có các trườngsau:  JMP SHORT (short jump). Khi đó trong mã lệnh lưu 1 byte khoảng cách (offset) giữa vị trí hiện tại và vị trí cần nhảy đến. Kiểu này chỉ nhảy trong phạm vi từ –128 đến +127 byte so với vị trí hiện tại. Ví dụ: JMP SHORT Calculate  JMP (near jump). Khi đó trong mã lệnh lưu 2 byte khoảng cách (offset) giữa vị trí hiện tại và vị trí cần nhảy đến. Kiểu này nhảy tùy ý trong phạm vi segment. Ví dụ: JMP Calculate  JMP FAR PTR (far jump). Khi đó trong mã lệnh lưu offset và segment của vị trí cần nhảy đến. Kiểu này nhảy đến bất kì nơi đâu. Ví dụ: JMP FAR PTR Calculate  JMP (near indirect jump). Khi đó trong mã lệnh lưu địa chỉ offset của một ô nhớ. Khi thực hiện, IP sẽ được gán bằng giá trị lưu tại địa chỉ này. Có thể kếtdùng với định vị chỉ số. Ví dụ: myPointer DW Prepare, Calculate, Test, Output MOV bx,2 ; chỉ số trong mảng con trỏ SHL bx,1 ; nhân đôi JMP myPointer[bx] Prepare: ; công việc 0 Calculate: ; công việc 1 Test: ; công việc 2 – nơi cần nhảy đến Output: ; công việc 3  JMP (far indirect jump). Tương tự trườngtrên, nhưng con trỏ gồm cả segment và offset. Chỉ khác ở khai báo con trỏ Ví dụ: myPointer DD Prepare, Calculate, Test, Output MOV bx,1 ; chỉ số trong mảng con trỏ MOV cl,2 SHL bx,cl ; nhân 4 JMP myPointer[bx] Prepare: ; công việc 0 Calculate: ; công việc 1 – nơi cần nhảy đến  JMP (indirect jump via regs). Nhảy đến địa chỉ lưu trong thanh ghi AX. Ví dụ: MOV ax, offset Calculate JMP ax ; (IP ← AX)  Lệnh nhảy có điều kiện J Các lệnh nhảy có điều kiện khởi đầu bằng chữ J sau đó là các chữ cái biểu thị điều kiện (ví dụ JGE ah,5: Jump if Greater than or Equal, nhảy nếu AH to hơn hay bằng 5), tiếp sau là một tên nhãn. Tùy thuộc vào trạng thái các cờ hiệu mà bộ vi xử lý có thực hiện việc nhảy đến nhãn hay không. So với bộ vi xử lý 80286 trở xuống, lệnh nhảy có điều kiện có độ dài 2 byte, byte trước hết chứa mã lệnh, byte thứ hai chứa khoảng cách tương đối từ lệnh đến nhãn, vì vậy trong lệnh nhảy có điều kiện phải nằm trong khoảng từ -128 đến 127 so với vị trí lệnh nhảy. Muốn nhảy xa hơn ta phải dùng kếtlệnh nhảy không điều kiện JMP Từ 80386 trở lên, bộ lệnh được bổ sung, cho phép sử dụng lệnh nhảy có điều kiện có độ dài 4 byte, do đó có quyền nằm tùy ý trong cùng phạm vi segment. Khi sử dụng lệnh nhảy có điều kiện sau khoảng thời gian thực hiện phép so sánh, phải đặc biệt lưu ý toán hạng trong phép so sánh là số có dấu (signed) hay không có dấu (unsigned) để lựa chọn lệnh cho thích hợp. Ví dụ: MOV AH,AL ; AL hiện bằng 128 CMP AH,1 JGE Greater ; AH > 1 nhưng không nhảy ???? . . . Greater: Một số lệnh nhảy có điều kiện thường dùng (tham khảo thêm trong SGK trang 81):  JE, JZ (nhảy nếu bằng).  JA (nhảy nếu to hơn, không dấu), JG (nhảy nếu to hơn, có dấu), JB (nhảy nếu nhỏ hơn, không dấu), JL (nhảy nếu nhỏ hơn, có dấu).  JAE (nhảy nếu to hơn hay bằng, không dấu), JGE (nhảy nếu to hơn hay bằng, có dấu), JBE (nhảy nếu nhỏ hơn hay bằng, không dấu), JLE (nhảy nếu nhỏ hơn hay bằng, có dấu).  JNE, JNZ (nhảy nếu không bằng). Ví dụ: nếu AL là số nguyên không dấu thì đoạn chươngở trên phải sửa lại như sau: MOV AH,AL CMP AH,1 JAE Greater . . . Greater: LệnhBằng cách sử dụng các lệnh nhảy có thể tạo ra vòng lặp. Tuy nhiên, để viết chươngtiện lợi và ngắn gọn, có thể dùng thêm các lệnhnhư LOOP, LOOPZ,… Lệnh LOOP tự động giảm CX một nhà cung cấp, sau đó xác minh xem CX có bằng 0, nếu không bằng thì nhảy đến nhãn Lệnh LOOPZ tự động giảm CX một nhà cung cấp, sau đó xác minh xem CX có bằng 0 hoặc cờ ZF có bật không, nếu cả hai điều này không xảy ra thì nhảy đến nhãn Ví dụ: Nhập mảng A gồm 10 ký tự MOV SI, 0 ; chỉ số mảng MOV CX, 10 ; số lầnLAP: ;nhập ký tự MOV AH, 1 INT 21H MOV A[SI], AL INC SI ; xuất ký tự MOV AH, 2 INT 21H LOOPTài liệu tham khảo 1. Nguyễn Minh Tuấn, Giáo- Chương 4, ĐHKHTN, 2002 2. Randal Hyde, The art of assembly language programming – Chapter 6, 10. 3. Dan Rollins, TechHelp v.6.0 4. NortonGuide1. Viết chươngcho nhập 1 ký tự từ màn hình và xuất câu thông báo chào buổi sáng, giữa trưa hay buổi chiều tương ứng với ký tự nhậpvào là ‘S’, ‘s’, ‘T’, ‘t’, ‘C’, ‘c’.2. Nhập 2 số nguyên dương thuộc N,M thuộc [0 9], nhập 1 ký tự Char. Xuất ra màn hình ma trận gồm N dòng và M cột gồm ký tự Char. Ví dụ: N=3, M=4, C=’*’  * * * * * * * * * * * *3. Nhập 2 số nguyên dương A, B. Tính A/B, A*B (không dùng lệnh DIV, MUL) Ví dụ: A=18, B=3 Tính A/B: 18 – 3 – 3 – 3 – 3 – 3 – 3 = 0, vậy A/B = 6 (tổng số lần A trừ B cho đến khi A = 0). Tính A*B = 18 + 18 + 18 = 544. Tìm USCLN của 2 số nguyên dương N, M nhập từ keyboard. Xác minh N,M có là hai số nguyên tố cùng nhau không? Ví dụ: N = 15, M = 6 => USCLN(15, 6) = 3 Ví dụ: N = 3, M = 5 => USCLN(3, 5) = 1 => 3, 5 là 2 số nguyên tố cùng nhau.5. Dùng lệnh lặp, viết chươngnhập vào 1 chuỗi ký tự. Sau thời điểm nhập xong đếm xem chuỗi có bao nhiêu ký tự. Xuất số ký tự có trong chuỗi. Ví dụ: S = “Hello world !” ==> Số kí tự trong chuỗi là 13.6. Nhập vào 2 chuỗi số, đổi 2 chuỗi thành số, sau đó cộng hai số, đổi ra chuỗi và xuất chuỗi tổng. Ví dụ: S1 = “123” => N1 = 123 S2 = “456” => N2 = 456 N = N1 + N2 = 123 + 456 = 579 => S = “579” (xuất S ra màn hình)7. Viết chươngcho phép nhập vào một chuỗi S. Đổi toàn bộ ký tự thường thành ký tự hoa. Đổi toàn bộ ký tự hoa thành ký tự thường.8. Nhập và xuất mảng một chiều. Tìm phần tử max, min, tính tổng các phần tử trong mảng. Ví dụ: N = 5 A[N] = {3,1,2,7,4} => max = 7, min = 1, tổng = 17.9. Thiết lập thuật toán Bubble Sort dùng ASM. Thuật toán Bubble Sort theo ngônC như sau: for (int i = 0; ivàlt; N-1; i++) for(int j=N-1;j > i; j ) if(a[j] < a[j-1]) Hoan_Vi (a[j], a[j-1]);10. Nhập và xuất mảng A hai chiều. a. Tính tổng các phần tử trên đường chéo chính, đường chéo phụ. b. Đếm số phần tử 0 và phần tử khác 0 trong mảng. c. Tìm phần tử max của mỗi dòng, mỗi cột. Tính tổng của mỗi dòng, mỗi cột. d. Nhập 1 mảng hai chiều B, tạo một mảng hai chiều C có các phần tử trên dòng chẵn bằng với các phần tử trên dòng chẵn của A, các phần tử trên dòng lẻ bằng các phần tử trên dòng lẻ của B. Mở rộng 1. Trong5, làm sao để đếm số từ có trong chuỗi kí tự? 2. Trong10, làm sao để trổ tài một thực đơn cho phép người dùng chọn trong các kí tự từ „a‟ đến „d‟ sau đó thực hiện công việc ứng với chữ cái đó. Hướng dẫn1. Xem ví dụ: .MODEL SMALL .STACK 100H .DATA CBS DB “CHAO BUOI SANG$” CBT DB “CHAO BUOI TRUA$” CBC DB “CHAO BUOI CHIEU$” .CODE MOV AX, @DATA MOV DS, AX ;nhập 1 ký tự bất kỳ MOV AH, 1 INT 21H CMP AL, ‘S’ JE CHAO_BUOI_SANG CMP AL, ‘s’ JE CHAO_BUOI_SANG CMP AL, ‘T’ JE CHAO_BUOI_TRUA CMP AL, ‘t’ […]… dụng để báo chobiên dịch biết đây là một đối số Tài liệu tham khảo 1 2 3 4 Nguyễn Minh Tuấn, Giáo trình hợp ngữ – Chương 6, ĐHKHTN, 2002 Randal Hyde, The art of assembly language programming – Chapter 11,12 Norton Guide Dan Rollins, TechHelp v.6.0 Bài tập Bài 1: Viết chươngkiểm tra một biểu thức đại số có chứa các dấu ngoặc (như (), [] và {}) làlệ hay khônglệ Ví dụ: (a +… f) làlệ nhưng (a + [b – { c * ( d – e )] } + f) là khônglệ2: Tính giá trị biểu thức đã nhập ở2 theo thứ tự từ trái sang phải3: Viết lại cáctuần trước dưới dạng các thủ tục4: Xây dựng một thư viện các macro Mở rộng 1 Có những cách nào để truyền tham số cho thủ tục ? để nhận kết quả trả về ? 2 Thử viết một thủ tục đệ quy 3 Tìm hiểu cách phân tách chương trình. .. Khoa Công Nghệ Thông Tin – Trường ĐH KHTN Tp.HCM -2- Hướng dẫn thực hành mônFile Nếu CF = 1 thì có lỗi, xét AX: Nếu AX = 1: AL khônglệ Nếu AX = 3: đường dẫn khônglệ hoặc file không tìm thấy Nếu AX = 5: không thể thay đổi tính chất Khoa Công Nghệ Thông Tin – Trường ĐH KHTN Tp.HCM -3-thực hành số 7màn hình Mục đích   Hiểu được cách tổ chức bộ nhớ lưu trữ màn hình cho cơ chế… khác với 004Fh thì hệ thống không thể chuyển sang SVGA Tài liệu tham khảo 1 2 3 4 Nguyễn Minh Tuấn, Giáo trình hợp ngữ – Chương 10, ĐHKHTN, 2002 Randal Hyde, The art of assembly language programming – Chapter 23 Dương Anh Đức, Giáođồ họa PC, ĐHKHTN, 1998 Dan Rollins, TechHelp v.6.0 Bài tập Bài 1 ChangePage Chọn cơ chế 03 Trên trang 0, ở tọa độ (8,10) viết dòng chữ “VIET NAM” màu đỏ trên nền… EAX Note : phải xoá giá trị DX hoặc EDX trước khi nhân, hoặc chia Tài liệu tham khảo 1 2 3 4 Nguyễn Minh Tuấn, Giáo trình hợp ngữ – Chương 7, ĐHKHTN, 2002 Randal Hyde, The art of assembly language programming – Chapter 9 Norton Guide Dan Rollins, TechHelp v.6.01 Viết chương(VCT) đổi một số dạng thập phân sang thập lục phân Ví dụ: Nhập một số hệ 10 : 26 Dạng thập lục phân: 1A 2 VCT nhập… như1, làm sao để trổ tài hai dòng chữ luân phiên tiến lại gần nhau, rồi lại lùi xa nhau, rồi lại gần nhau… 3 Tìm cách pha lại (khái niệm lại) bảng màu, để sau khoảng thời gian nhấn Enter các vạch trổ tài trong2 đột nhiên biến thành một dải màu thay đổi từ sáng trắng đến xám, đến đen Nhấn Enter lần nữa sẽ phục hồi lại dải màu như trước 4 Tìm hiểu một thuật toán vẽ đường thẳng và viết chương trình. .. qua lại giữa trang 0 và 1 cho đến khi một phím được nhấn2 Vạch màu Khởi động cơ chế 103h (SVGA) Bằng cách truy xuất trực tiếp vùng nhớ màn hình, hãy trổ tài 256 màu trong bảng màu mặc định bằng các vạch màu nằm cạnh nhau, mỗi vạch độ rộng 3 điểm ảnh Sau thời điểm nhấn phím bất kì, trở về cơ chế 03 và kết thúc chươngMở rộng 1 Trong1, có nhận xét gì về vận tốc chuyển giữa hai trang ? Có… chươngthành nhiều file và cách biên dịch, liên kểt chúng Hướng dẫn1 dùng ngăn xếp để PUSH các dấu ngoặc trái ( „(„, ‟{„, „[„ ) vào ngăn xếp Nếu gặp dấu ngoặc phải ( „)‟, „}‟, „]‟ ) thì POP từ stack ra Nếu không POP được, hoặc POP ra không đúng loại với dấu ngoặc phải -> khônglệ Trái lại là biểu thứclệ Bài thực hành số 4 Làm việc với số nguyên Mục đích   Biết sử dụng các phép… tiếp trong chươnng trình:  Các macro thường được khai báo ở đầu chươngtrước phần code  Ví dụ: Xuất một chuỗi ra màn hình sử dụng macro model small stack 100h data chuoi1 db “hello”,10,13,‟$‟ chuoi2 db “bye”,10,13,‟$‟ @xuatchuoi macro chuoi lea dx,chuoi mov ah,9 int 21h endm code … @xuatchuoi chuoi1 @xuatchuoi chuoi2 … end  Xây dựng thư viện các macro:  Tạo 1 thư viện (tập tin) chứa các macro… thứ hai : 16 Tổng hai số là : 30 Hiệu: -2 Tích: 224 Thương: 0 Phần dư: 14 Mở rộng 1 Tìm hiểu về BCD Viết chươngnhập 2 số nguyên ở hệ 10, chuyển sang BCD, tính tổng, hiệu và in kết quả ở hệ 10 2 Liệu có thể viết chươngtính được 20!, 30!, kết quả in ra ở dạng hex ? dạng cơ số 10 ?thực hành số 5 Làm việc với xâu kí tự Mục đích   Biết sử dụng các phép toán trên chuỗi Biết làm một số thao . + f) là không hợp lệ. Bài 2: Tính giá trị biểu thức đã nhập ở bài tập 2 theo thứ tự từ trái sang phải. Bài 3: Viết lại các bài tập tuần trước dưới dạng các thủ tục Bài 4: Xây dựng. Bài tập Bài 1: Viết chương trình xác minh một biểu thức đại số có chứa các dấu ngoặc (như (), [] và {}) là hợp lệ hay không hợp lệ . Ví dụ: (a + [b – { c * ( d – e ) } ] + f) là hợp. Bài thực hành số 1 Nhập môn Mục đích  Làm quen với ngôn ngữ lập trình Assembly  Biết cách viết, dịch, chạy và chẩn lỗi (debug) một vài chương trình đơn giản Tóm tắt lý thuyết Hợp ngữ

Xem Thêm :   Hướng Dẫn Đảo Vùng Chọn Trong Photoshop Cs6, Đảo Vùng Chọn Trong Photoshop Cs6

Xem thêm bài viết thuộc chuyên mục: Kĩ Năng Sống

Xem thêm bài viết thuộc chuyên mục: Tổng Hợp

Related Articles

Back to top button