Bài giảng Lập trình hợp ngữ

ppt 109 trang hapham 1090
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hợp ngữ", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptbai_giang_lap_trinh_hop_ngu.ppt

Nội dung text: Bài giảng Lập trình hợp ngữ

  1. LẬP TRÌNH HỢP NGỮ
  2. Ngơn ngữ lập trình • Ngơn ngữ lập trình – Phương tiện để viết chương trình cho máy tính – Hàng trăm ngơn ngữ lập trình khác nhau – Những quy định về cú pháp (syntax) & ngữ nghĩa (semantic) – Máy tính cĩ thể hiểu được • Phân chia làm 3 nhĩm chính – Ngơn ngữ máy - Machine languages • Ngơn ngữ duy nhất của máy tính - CPU – Hợp ngữ - Assembly languages – Ngơn ngữ cấp cao - High-level languages
  3. Ngơn ngữ máy - Machine languages • Ngơn ngữ duy nhất được máy tính (CPU) hiểu trực tiếp. • Được xác định bởi tập lệnh của CPU – Phụ thuộc vào máy tính cụ thể – Dạng nhị phân {0,1}* – Rất khĩ đọc hiểu – Khĩ cĩ khả năng viết chương trình trực tiếp • Khĩ nhớ hàng chục ngàn lệnh dạng {0,1}* • Rất khĩ xác định & sửa lỗi • Khơng được sử dụng trong thực tế để viết chương trình • Nền tảng xây dựng hợp ngữ
  4. Hợp ngữ - Assembly Languages • Sử dụng các từ khĩa tiếng Anh cho các lệnh hay nhĩm lệnh của mã máy. • Được dịch sang mã máy khi thực hiện • Chuyển đỗi nhanh chĩng • Dễ đọc và dễ hiểu hơn • Vẫn tương đối khĩ sử dụng do – Các lệnh cịn đơn giản nên phải dùng nhiều lệnh. – Chưa cĩ những cấu trúc điều khiển thuận tiện – Khả năng tìm và sửa lỗi cũng chưa thuận tiện. • Nền tảng xây dựng các ngơn ngữ cấp cao
  5. Ngơn ngữ cấp cao • Một câu lệnh diễn tả nhiều động thái • Cĩ cấu trúc ngày càng giống ngơn ngữ tự nhiên (tiếng Anh) • Được dịch sang assembly hay mã máy bằng các chương trình dịch trước khi thực thi. – Source code & Executed code • Được phân làm nhiều lớp – Lập trình goto – Lập trình cấu trúc – Structured – Lập trình hướng đối tượng – Object Oriented – Các dạng khác
  6. Học ngơn ngữ lập trình • Học ngữ pháp – Quy tắc ngữ pháp – Từ vựng – Cấu trúc câu • Ngữ nghĩa của các lệnh • Các “thành ngữ” • Học ngơn ngữ lập trình VS. Học ngơn ngữ tự nhiên – Quy tắc ngữ pháp đơn giản – Từ vựng ít, tự quy định – Cấu trúc câu đơn giản • Hạn chế và khĩ khăn của sử dụng ngơn ngữ lập trình.
  7. Chương trình dịch • Dùng để dịch từ một ngơn ngữ lập trình này sang ngơn ngữ lập trình khác • Mục tiêu cuối cùng là dịch sang mã máy để cĩ được executed code –> chương trình thực thi • Phân loại: – Intepreter – thơng dịch – Compiler – biên dịch – Intepreter vs. Compiler • Cơng cụ phát triển – Integrated Development Environment (IDE) – Soạn thảo – Dịch và sửa lỗi chương trình – Chạy thử và sửa lỗi
  8. Một số khái niệm khác • Lỗi và sửa lỗi – Syntax error – lỗi ngữ pháp – Semantic error- lỗi ngữ nghĩa – Runtime error - Lỗi thực thi • Debug – Tìm và sửa lỗi • Dữ liệu, kiểu dữ liệu – Các kiểu dữ liệu cơ bản • integer, long, character, byte, . • Real (double, float) • Kiểu khác: string – Kiểu dữ liệu cĩ cấu trúc: array, string, record, • Biến (Variable) & Hằng (Constant) • Giải thuật: khái niệm, cơng cụ biểu diễn • Flow chart – lưu đồ
  9. Cấu trúc điều khiển cơ bản If then Statement; If then Statement 1 else Statement 2; Case of value 1 : Statement 1; value n : Statement n; else : Statement 0 end; While do Statement; Repeat Statement until ; For counter=start value to end value do Statement; For counter=start value downto end value do Statement
  10. Chu kỳ sống của phần mềm • Thu thập yêu cầu • Phân tích thiết kế • Phát triển chương trình - codeing – Xác định giải thuật – Viết code và dịch thử , hiệu chỉnh các lỗi syntax • Thử nghiệm - Testing – Chạy thử với các dữ liệu mẫu để kiểm tra lỗi semantic và runtime • Vận hành và bảo trì • Phát triển theo yêu cầu
  11. Một số ngơn ngữ lập trình • Lập trình goto – Assembly – Basic • Lập trình cấu trúc – Pascal, C – Foxpro • Lập trình hướng đối tượng – Java, C++, Object Pascal, • Khác – Prolog, LISP, Visual basic (VB), VC++, J++, Delphi, ASP, PHP, – Visual studio .NET: VB.NET, ASP.NET, C++.NET, C#
  12. Lập trình hợp ngữ • Một chương trình hợp ngữ bao gồm một loạt các mệnh đề ( statement) được viết liên tiếp nhau , mỗi mệnh đề được viết trên 1 dịng • Một mệnh đề cĩ thể là : – một lệnh ( instruction) : được trình biên dịch ( Assembler =ASM) chuyển thành mã máy. – một chỉ dẫn của Assembler ( Assembler directive) : ASM khơng chuyển thành mã máy
  13. Trường Tên ( Name Field) • Trường tên được dùng cho nhãn lệnh , tên thủ tục và tên biến . ASM sẽ chuyển tên thành địa chỉ bộ nhớ . • Tên cĩ thể dài từ 1 đến 31 ký tự . Trong tên chứa các ký tự từ a-z , các số và các ký tự đặc biệt sau : ? ,@ , _ , $ và dấu . • Khơng được phép cĩ ký tự trống trong phần tên. Nếu trong tên cĩ ký tự thì nĩ phải là ký tự đầu tiên. • Tên khơng được bắt đầu bằng một số. ASM khơng phân biệt giữa ký tự viết thường và viết hoa .
  14. Phân biệt 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
  15. Các kiểu số liệu trong chương trình hợp ngữ • Các số • Các ký tự • Các biến ( variables)
  16. Nhắc lại phương pháp định địa chỉ • Tức thời (trực hằng) – Tốn hạng trong lệnh • Thanh ghi – Tốn hạng trong thanh ghi • Trực tiếp – Địa chỉ trong lệnh là địa chỉ ơ nhớ của tốn hạng • Gián tiếp qua thanh ghi – Thanh ghi chứa địa chỉ ơ nhớ của tốn hạng • Gián tiếp ơ nhớ – Địa chỉ trong lệnh là địa chỉ ơ nhớ của tốn hạng • Chỉ số (dịch chuyển) – Địa chỉ tốn hạng là tổng nội dung thanh ghi và độ dời • Tương đối – Tổng nội dung PC và độ dời • Stack – Thanh ghi SP chứa địa chỉ ơ nhớ của tốn hạng
  17. Thanh ghi CPU 8086 • 14 thanh ghi 16 bit • 5 nhĩm – Thanh ghi đoạn • CS (code segment), DS (data segment), SS (stack segment), ES (extra segment) – Thanh ghi con trỏ • IP (instruction pointer), SP (stack pointer), BP (base pointer) – Thanh ghi chỉ số • SI (source index), DI (Destination index) – Thanh ghi đa dụng – Thanh ghi cờ
  18. Thanh ghi đa dụng • AX (Accumulator register) – Sử dụng cho tính tốn và xuất nhập • BX (Base register) – Thanh ghi duy nhất cĩ thể sử dụng chỉ số • CX (Counter register) – Sử dụng cho vịng lặp • DX (Data register) – Sử dụng cho xuất nhập và các lệnh nhân chia • Các thanh ghi đa dụng cĩ thể “chia nhỏ” thành 2 thanh ghi 8-bit (cao và thấp) – AH,AL,BH,BL,CH,CL,DH,DL
  19. Thanh ghi cờ (Flag) Flags Register Tắt Tên bit n “Mơ tả” OF Overflow 11 Tràn số cĩ dấu DF Direction 10 Hướng xử lý chuỗi IF Interrupt 9 Cho phép ngắt TF Trap 8 CPU thực hiện từng bước SF Sign 7 Kiểm tra kết quả là số âm ZF Zero 6 Kiểm tra kết quả bằng 0 AF Auxiliary Carry 4 PF Parity 2 Kiểm tra số bit 1 chẵn CF Carry 0 Tràn số khơng dấu
  20. Các số • Một số nhị phân là một dãy các bit 0 và 1 và 2 phải kết thúc bằng b hoặc B Ví dụ: 10111b, 11111b • Một số thập phân là một dãy các chữ sĩ thập phân và kết thúc bởi d hoặc D ( cĩ thể khơng cần) Ví dụ: 64223, -2183d • Một số hex phải bắt đầu bởi 1 chữ số thập phân và phải kết thúc bởi h hoặc H Ví dụ: 183Dh, 1AC0h, 0FFFFH
  21. Các ký tự • Ký tự và một chuỗi các ký tự phải được đĩng giữa 2 dấu ngoặc đơn hoặc hai dấu ngoặc kép . Ví dụ: ‘ A ’ và “ HELLO ” . • Các ký tự đều được chuyển thành mã ASCII bởi ASM . Do đĩ trong một chương trình ASM sẽ xem khai báo ‘A’ và 41h ( mã ASCII của A) là giống nhau
  22. Các biến ( variables) Trong ASM biến đĩng vai trị như trong ngơn ngữ cấp cao. Mỗi biến cĩ một loại dữ liệu và nĩ được gán một địa chỉ bộ nhớ sau khi dịch chương trình 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)
  23. Chuỗi các ký tự ( character strings) • Một mảng các mã ASCII cĩ thể được định nghĩa bằng một chuỗi các ký tự Ví dụ : LETTERS DW 41h, 42h, 43h  LETTERS DW ‘ABC ’ • Bên trong một chuỗi , ASM sẽ phân biệt chữ hoa và chữ thường . Vì vậy chuỗi ‘abc’ sẽ được chuyển thành 3 bytes : 61h ,62h và 63h. • Trong ASM cũng cĩ thể tổ hợp các ký tự và các số trong một định nghĩa . Ví dụ : MSG DB ‘HELLO’, 0AH, 0DH, ‘$’  MSG DB 48H, 45H, 4CH, 4Ch, 4FH, 0AH, 0DH, 24H
  24. Các hằng ( constants) • Trong một chương trình các hằng cĩ thể được đặt tên nhờ chỉ dẫn EQU (equates) . Cú pháp của EQU là : NAME EQUconstant Ví dụ : LF EQU0AH • Cũng cĩ thể dùng EQU để định nghĩa một chuỗi: Ví dụ: PROMPT EQU ‘TYPE YOUR NAME ’ Sau khi cĩ khai báo này, thay cho MSG DB ‘TYPE YOUR NAME ’  MSG DB PROMPT
  25. Cấu trúc của một chương trình hợp ngữ • Một chương trình ngơn ngữ máy bao gồm : – Mã ( code) – Số liệu ( data) – Ngăn xếp (stack ) • Mỗi một phần chiếm một đoạn bộ nhớ . Mỗi một đoạn chương trình là được chuyển thành một đoạn bộ nhớ bởi ASM .
  26. Các kiểu bộ nhớ ( memory models) • Độ lớn của mã và số liệu trong một chương trình được quy định bởi chỉ dẫn MODEL nhằm xác định kiểu bộ nhớ dùng với chương trình . Cú pháp của chỉ dẫn MODEL như sau : .MODEL memory_model
  27. Đoạn số liệu • Đoạn số liệu của chương trình chứa các khai báo biến, khai báo hằng Để bắt đầu đoạn số liệu chúng ta dùng chỉ dẫn DATA với cú pháp như sau : .DATA ;khai báo tên các biến, hằng và mảng Ví dụ : .DATA WORD1 DW 2 WORD2 DW 5 MSG DB ‘THIS IS A MESSAGE ’ MASK EQU 10010010B
  28. Đoạn ngăn xếp • Mục đích của việc khai báo đoạn ngăn xếp là dành một vùng nhớ (vùng stack) để lưu trữ cho stack. Cú pháp của lệnh như sau : .STACK size • Nếu khơng khai báo size thì 1KB được dành cho vùng stack . .STACK 100h ; dành 256 bytes cho vùng stack
  29. Đoạn mã • Đoạn mã chứa các lệnh của chương trình. Bắt đầu đoạn mã bằng chỉ dẫn CODE như sau : .CODE • Bên trong đoạn mã các lệnh thường được tổ chức thành thủ tục (procedure) mà cấu trúc của một thủ tục như sau : name PROC ; body of the procedure name ENDP
  30. Cấu trúc chương trình .MODEL SMALL .STACK 100h .DATA ; định nghĩa số liệu tại đây .CODE MAIN PROC ; thân của thủ tục MAIN MAIN ENDP ; các thủ tục khác nếu cĩ END MAIN
  31. Tạo ra và chạy một chương trình hợp ngữ Cĩ 4 bước để tạo ra và chạy một chương trình hợp ngữ là : • Dùng một trình soạn thảo văn bản để tạo ra tập tin chương trình nguồn ( source program file ) . • Dùng một trình biên dịch (Assembler ) để tạo ra tập tin đối tượng (object file) ngơn ngữ máy • Dùng trình LINK để liên kết một hoặc nhiều tập tin đối tượng rồi tạo ra file thực thi được . • Cho thực hiện tập tin EXE hoặc COM .
  32. Các lệnh cơ bản • MOV • XCHG • ADD • SUB • INC • DEC • NEG
  33. Lệnh MOV MOV dst,src • Chuyển nội dung tốn hạng src vào tốn hạng dst. • Tốn hạng nguồn src cĩ thể là thanh ghi (reg), bộ nhớ (mem) hay giá trị tức thời (immed); tốn hạng đích dst cĩ thể là reg hay mem. • Lệnh MOV khơng ảnh hưởng đến các cờ. • Khơng thể chuyển trực tiếp dữ liệu giữa hai ơ nhớ mà phải thơng qua một thanh ghi
  34. Lệnh MOV • MOV AX, WORD1
  35. Lệnh MOV
  36. Lệnh XCHG • XCHG dst,src: (Exchange) hốn chuyển nội dung 2 tốn hạng. • Tốn hạng chỉ cĩ thể là reg hay mem. • Lệnh XCHG khơng ảnh hưởng đến các cờ • Khơng thể dùng cho các thanh ghi đoạn
  37. Lệnh XCHG • XCHG AH, BL:
  38. Các lệnh vào ra • Lệnh INT ( interrupt) • Lệnh INT 21h INT 21h được dùng để gọi một số lớn các các hàm ( function) của DOS. Tùy theo giá trị mà chúng ta đặt vào thanh ghi AH, INT 21h sẽ gọi chạy một routine tương ứng .
  39. Ngắt 21h MOV AH,1 ;Hàm vào 1 phím INT 21H ;Mã ASCII trong AL
  40. Ngắt 21h MOV AH,2 ;Sử dụng hàm 2 MOV DL,’?’ ;Đưa ký tự cần hiển thị vào DL INT 21H ;Hiển thị ký tự
  41. Ngắt 21h • Hàm 2 cũng dùng để thực hiện một chức năng điều khiển • Ví dụ: MOV AH,2 ;sử dụng hàm 2 MOV DL,9 ;cách một khoảng tab INT 21H
  42. Ví dụ .model small .stack 100h .data .code MAIN PROC ;Xuất dấu ? ra màn hình mov AH , 2 mov DL,'?' int 21h ;trở về dos mov AH, 4Ch int 21h MAIN endP END MAIN
  43. Ngắt 21h • Hiển thị một chuỗi • Ký tự $ đánh dấu kết thúc chuỗi và khơng được hiển thị
  44. Hàm LEA (Load Effective Address) • LEA đích, nguồn • Lấy ra và chép địa chỉ tương đối của nguồn sang đích • Ví dụ: LEA DX,MSG : nhập địa chỉ tương đối của biến MSG vào DX • Giả sử cĩ MSG BD “HELLO WORLD!$” • Khi đĩ: LEA DX, MSG ;Lấy thơng báo MOV AH, 9 ;Hàm hiển thị chuỗi INT 21h ;Hiển thị chuỗi
  45. Khởi tạo đoạn dữ liệu • Một chương trình cĩ đoạn chứa dữ liệu sẽ bắt đầu với 2 lệnh sau: MOV AX, @DATA MOV DS, AX
  46. Ví dụ .model small .stack 100h .data s DB “Hello !$” ; Khai báo xâu kí tự cần in .code Main proc mov AX,@data ; Lấy địa chỉ data segment ghi vào DS mov DS, AX ; xuất chuỗi lea DX, s mov AH , 9 int 21h ; Gọi hàm 9, ngắt 21h để in mov AH, 4Ch ; Thốt khỏi chương trình int 21h Main Endp End main
  47. Nhĩm lệnh tính tốn số học ADD + SUB - INC ++ DEC NEG -a MUL , IMUL * DIV , IDIV /
  48. Lệnh ADD • Dạng lệnh : ADD reg,reg ADD reg,immed ADD mem,reg ADD mem,immed ADD reg,mem ADD accum,immed • Giải thích : thđ ← thđ + thn Cộng tốn hạng nguồn vào tốn hạng đích. Kết quả cất vào tốn hạng đích. • Tác động cờ :
  49. Ví dụ ADD CX,SI ; CX ← CX + SI ADD DH,BL ; DH ← DH + BL ADD [1000h],BX ;[1001h,1000h] ← [1001h,1000h] + BX ADD [2000h],CL ; [2000h] ← [2000h] + CL ADD AL,[0000h] ; AL ← AL + [0000h] ADD BYTE PTR [SI+8],5 ; [SI+8] ← [SI+8] + 05h ADD WORD PTR [SI+8],5
  50. Lệnh SUB • Dạng lệnh : SUB reg,reg SUB reg,immed SUB mem,reg SUB mem,immed SUB reg,mem SUB accum,immed • Giải thích : thđ ← thđ - thn Trừ tốn hạng đích cho tốn hạng nguồn. Kết quả cất vào tốn hạng đích. • Tác động cờ : → Xem thêm SBB
  51. Ví dụ SUB DL,AL ; DL ← DL - AL SUB CX,[DI] ; CX ← CX - [DI+1,DI] SUB BP,4 ; BP ← BP - 4
  52. Lệnh INC • Dạng lệnh : INC reg INC mem • Giải thích : thđ ← thđ + 1 cộng 1 vào tốn hạng đích nhưng khơng ảnh hưởng cờ nhớ. • Tác động cờ : • Ví dụ : INC CH INC WORD PTR [1000h]
  53. Lệnh DEC • Dạng lệnh : DEC reg DEC mem • Giải thích : thđ ← thđ - 1 trừ 1 vào tốn hạng đích nhưng khơng ảnh hưởng cờ nhớ. • Tác động cờ : • Ví dụ : DEC AX DEC Byte PTR ES:[1000h]
  54. Lệnh NEG • Dạng lệnh : NEG reg NEG mem • Giải thích : thđ ← bù 2 ( thđ) • Tác động cờ : • Ví dụ : NEG AX NEG Byte PTR ES:[SI]
  55. Lệnh MUL • Dạng lệnh : MUL reg MUL mem • Giải thích : nhân số khơng dấu – Trường hợp tốn hạng nguồn là 8 bit thì : AX ← AL * thn8 – Trường hợp tốn hạng nguồn là 16 bit thì : {DX AX} ← AX * thn16 • Tác động cờ :
  56. Ví dụ • Nếu AL=5, CH=4, sau khi thực hiện lệnh MUL CH ta cĩ AX = AL*CH = 0014h. • Nếu AX=500h, [1001h,1000h]=0401h, sau khi thực hiện lệnh MUL WORD PTR [1000h] ta cĩ {DXAX} = AX * [1001h,1000h] = 500h * 401h = 00140500h Nghĩa là DX=0014h và AX=0500h.
  57. Lệnh IMUL • Tương tự lệnh MUL, nhưng xử lý trên số cĩ dấu
  58. Lệnh DIV • Dạng lệnh : DIV reg DIV mem • Giải thích : chia hai số khơng dấu – Nếu tốn hạng nguồn là 8 bit thì : AL ← (AX / thn8) AH ← số dư của (AX / thn8) – Tốn hạng nguồn 16 bit thì : AX ← (DXAX / thn16) DX ← số dư của (DXAX / thn16) • Tác động cờ :
  59. Lệnh IDIV • Tương tự lệnh DIV nhưng làm việc trên số cĩ dấu
  60. Nhĩm lệnh xử lý logic AND SHL ROL OR SHR ROR XOR SAL RCL NOT SAR RCR
  61. Lệnh AND • Dạng lệnh : AND reg,reg AND reg,immed AND mem,reg AND mem,immed AND reg,mem AND accum,immed • Giải thích : thđ ← thđ AND thn. • Tác động cờ:
  62. Ví dụ: MOV AL, 'a' ; AL = 01100001b AND AL, 11011111b ; AL = 01000001b ('A') 1 AND 1 = 1 01100001 1 AND 0 = 0 0 AND 1 = 0 11011111 0 AND 0 = 0 01000001
  63. Lệnh OR • Dạng lệnh : OR reg,reg OR reg,immed OR mem,reg OR mem,immed OR reg,mem OR accum,immed • Giải thích : thđ ← thđ OR thn. • Tác động cờ :
  64. Ví dụ: MOV AL, 'A' ; AL = 01000001b OR AL, 00100000b ; AL = 01100001b ('a') 01000001 1 OR 1 = 1 1 OR 0 = 1 00100000 0 OR 1 = 1 0 OR 0 = 0 01100001
  65. Lệnh XOR • Dạng lệnh : XOR reg,reg XOR reg,immed XOR mem,reg XOR mem,immed XOR reg,mem XOR accum,immed • Giải thích : thđ ← thđ XOR thn. • Tác động cờ:
  66. Ví dụ: MOV AL, 00000111b XOR AL, 00000010b ; AL = 00000101b 00000111 1 XOR 1 = 0 1 XOR 0 = 1 00000010 0 XOR 1 = 1 0 XOR 0 = 0 00000101
  67. Lệnh NOT • Dạng lệnh : NOT reg NOT mem • Giải thích : thđ ← đảo từng bit ( thđ ) • Tác động cờ : (khơng thay đổi) • Ví dụ: MOV AL, 00011011b NOT AL ; AL = 11100100b
  68. Lệnh SHL/SAL • Dạng lệnh : SHL reg,1 SHL mem,1 SHL reg,CL SHL mem,CL • Giải thích : Dịch trái. Dạng SHL reg,1 dùng để dịch trái 1 bit. Dạng SHL reg,CL dùng để dịch trái nhiều bit. Lúc đĩ thanh ghi CL chứa số bit cần dịch. • Tác động cờ :
  69. Ví dụ MOV AL, 11100000b SHL AL, 1 ; AL=11000000b ; CF=1
  70. Chuyển ngơn ngữ cấp cao thành ngơn ngữ ASM Giả sử A và B là 2 biến từ . Chúng ta sẽ chuyển các mệnh đề sau trong ngơn ngữ cấp cao ra ngơn ngữ ASM . Mệnh đề B=A MOV AX,A ; đưa A vào AX MOV B,AX ; đưa AX vào B Mệnh đề A=5-A MOV AX,5 ; đưa 5 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 Mệnh đề A=B-2*A MOV AX,B ;Ax=B SUB AX,A ;AX=B-A SUB AX,A ;AX=B-2*A MOV A,AX ;A=B-2*A
  71. Sự cần thiết của lệnh nhảy • Ở các chương trình viết bằng ngôn ngữ cấp cao thì việc nhảy (lệnh GoTo) là điều nên tránh nhưng ở lập trình hệ thống thì đây là việc cần thiết và là điểm mạnh của 1 chương trình viết bằng Assembly. Một lệnh nhảy ➔ CPU phải thực thi 1 đoạn lệnh ở 1 chỗ khác với nơi mà các lệnh đang được thực thi. Trong lập trình, có những nhóm phát biểu cần phải lặp đi lặp lại nhiều lần trong 1 điều kiện nào đó. Để đáp ứng điều kiện này ASM cung cấp 2 lệnh JMP và LOOP. Chuong 8 : Cau truc DK va Vong lap 71
  72. Lệnh JMP (Jump) • Công dụng :Chuyển điều khiển không điều kiện. Cú pháp : JMP đích Nhảy gần (NEAR) : 1 tác vụ nhảy trong cùng 1 segment. Nhảy xa (FAR) : 1 tác vụ nhảy sang segment khác. VD: mov ax,a Jmp boqua: Add ax,b Boqua: Chuong 8 : Cau truc DK va Vong lap 72 Subb ax,b
  73. Lệnh CMP • Cú pháp: CMP đích, nguồn • Cơng dụng : so sánh tốn hạng đích với tốn hạng nguồn bằng cách lấy tốn hạng đích – tốn hạng nguồn. • Hoạt động : dùng phép trừ nhưng khơng cĩ tốn hạng đích nào bị thay đổi. • Lệnh CMP giống hệt lệnh SUB trừ việc tốn hạng đích khơng thay đổi.
  74. Lệnh CMP • Ví dụ: Đoạn chương trình so sánh 2 số A và B: A >B thì nhảy đến label1, A = B thì nhảy đến label2, A < B thì nhảy đến label3. MOV AX,A CMP AX,B JG label1 JL label2 JMP label3
  75. LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TỐN HẠNG KHƠNG DẤU (1) • Lệnh JA label: (Jump if Above) – Nếu CF = 0 và ZF = 0 thì JMP label • Lệnh JAE label: (Jump if Above or Equal) – Nếu CF = 0 thì JMP label • Lệnh JB label: (Jump if Below) – Nếu CF = 1 thì JMP label • Lệnh JBE label: (Jump if Below or Equal) – Nếu CF = 1 hoặc ZF = 1 thì JMP label • Lệnh JNA label: (Jump if Not Above) – Giống lệnh JBE • Lệnh JNAE label: (Jump if Not Above or Equal) – Giống lệnh JB
  76. LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TỐN HẠNG KHƠNG DẤU (2) • Lệnh JNB label: (Jump if Not Below) – Giống lệnh JAE • Lệnh JNBE label: (Jump if Not Below or Equal) – Giống lệnh JA • Lệnh JG label: (Jump if Greater) – Nếu SF = OF và ZF = 0 thì JMP label • Lệnh JGE label: (Jump if Greater or Equal) – Nếu SF = OF thì JMP label • Lệnh JL label: (Jump if Less) – Nếu SF OF hoặc ZF = 1 thì JMP label
  77. LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TỐN HẠNG KHƠNG DẤU (3) • Lệnh JNG label: (Jump if Not Greater) – Giống lệnh JLE • Lệnh JNGE label: (Jump if Not Greater or Equal) – Giống lệnh JL • Lệnh JNL label: (Jump if Not Less) – Giống lệnh JGE • Lệnh JNLE label: (Jump if Not Less or Equal) – Giống lệnh JG • Lệnh JC label: (Jump if Carry) – Giống lệnh JB • Lệnh JNC label: (Jump if Not Carry) – Giống lệnh JNB
  78. LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TỐN HẠNG KHƠNG DẤU (4) • Lệnh JZ label: (Jump if Zero) – Nếu ZF = 1 thì JMP label • Lệnh JE label: (Jump if Equal) – Giống lệnh JZ • Lệnh JNZ label: (Jump if Not Zero) – Nếu ZF = 0 thì JMP label • Lệnh JNE label: (Jump if Equal) – Giống lệnh JNZ • Lệnh JS label: (Jump on Sign) – Nếu SF = 1 thì JMP label
  79. LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TỐN HẠNG KHƠNG DẤU (5) • Lệnh JNS label: (Jump if No Sign) – Nếu SF = 0 thì JMP label • Lệnh JO label: (Jump on Overflow) – Nếu OF = 1 thì JMP label • Lệnh JNO label: (Jump if No Overflow) – Nếu OF = 0 thì JMP label • Lệnh JP label: (Jump on Parity) – Nếu PF = 1 thì JMP label • Lệnh JNP label: (Jump if No Parity) – Nếu PF = 0 thì JMP label • Lệnh JCXZ label: (Jump if CX Zero) – Nếu CX = 1 thì JMP label
  80. Lệnh LOOP • LOOP label • Mơ tả: CX = CX – 1 Nếu CX <> 0 thì JMP label • Ví dụ: In ra màn hình các số từ 1 đến 9 MOV CX, 10 MOV AH,2 MOV DL, ‘0’ IN_: INT 21H INC DL LOOP IN_
  81. Cấu trúc của ngơn ngữ cấp cao • Chúng ta sẽ dùng các lệnh nhảy để thực hiện các cấu trúc tương tự như trong ngơn ngữ cấp cao
  82. Cấu trúc rẽ nhánh IF condition is true THEN execute true branch statements END IF Hoặc IF condition is true THEN execute true branch statements ELSE execute false branch statements END_IF
  83. Ví dụ 1: Thay thế giá trị trên AX bằng giá trị tuyết đối của nĩ • Thuật tốn: IF AX<0 THEN replace AX by - AX END-IF • Mã hố: ; if AX<0 CMP AX,0 JNL END_IF ; no , exit ;then NEG AX , yes , change sign END_IF :
  84. Ví dụ 2 : giả sử AL và BL chứa ASCII code của 1 ký tự .Hãy xuất ra màn hình ký tự trước ( theo thứ tự ký tự ) • Thuật tốn IF AL<= BL THEN display AL ELSE display character in BL END_IF • Mã hố : MOV AH,2 ; chuẩn bị xuất ký tự ;if AL<=BL CMP AL,BL ;AL<=BL? JNBE ELSE_ ; no, display character in BL ;then MOV DL,AL JMP DISPLAY ELSE_: MOV DL,BL DISPLAY: INT 21H END_IF :
  85. Rẽ nhánh nhiều hướng • Case là một cấu trúc rẽ nhánh nhiều hướng . Cĩ thể dùng để test một thanh ghi hay , biến nào đĩ hay một biểu thức mà giá trị cụ thể nằm trong 1 vùng các giá trị. • Cấu trúc của CASE như sau : CASE expression value_1 : Statements_1 value_2 : Statements_2 value_n : Statements_n
  86. Ví dụ – Nếu AX âm thì đặt -1 vào BX – Nếu AX bằng 0 thì đặt 0 vào BX – Nếu AX dương thì đặt 1 vào BX • Thuật tốn : CASE AX 0 put 1 in BX
  87. Cài đặt ; case AX CMP AX,0 ;test AX JL NEGATIVE ;AX 0 NEGATIVE: MOV BX,-1 JMP END_CASE ZERO: MOV BX,0 JMP END_CASE POSITIVE: MOV BX,1 JMP END_CASE END_CASE :
  88. Rẽ nhánh với một tổ hợp các điều kiện • Đơi khi tình trạng rẽ nhánh trong các lệnh IF , CASE cần một tổ hợp các điều kiện dưới dạng : Condition_1 AND Condition_2 Condition_1 OR Condition_2
  89. Ví dụ 1: Đọc một ký tự và nếu nĩ là ký tự hoa thì in nĩ ra màn hình • Thuật tốn : Read a character ( into AL) IF ( ‘A’<= character ) AND ( charater <= ‘Z’) THEN display character END_IF
  90. Cài đặt ;read a character MOV AH,2 INT 21H ; character in AL ; IF ( ‘A’ =‘A’? JNGE END_IF ;no, exit CMP AL,’Z ; char <=‘Z’? JNLE END_IF ; no exit ; then display it MOV DL,AL MOV AH,2 INT 21H END_IF :
  91. Ví dụ 2: Đọc một ký tự , nếu ký tự đĩ là ‘Y’ hoặc ‘y’ thì in nĩ lên màn hình , ngược lại thì kết thúc chương trình . • Thuật tốn Read a charcter ( into AL) IF ( character =‘Y’) OR ( character=‘y’) THEN dispplay it ELSE terminate the program END_IF
  92. Cài đặt ;read a character MOV AH,2 INT 21H ; character in AL ; IF ( character =‘y’ ) OR ( charater = ‘Y’) CMP AL,’y’ ; char =‘y’? JE THEN ;yes , goto display it CMP AL,’Y’ ; char =‘Y’? JE THEN ; yes , goto display it JMP ELSE_ ;no , terminate THEN : MOV DL,AL MOV AH,2 INT 21H JMP END_IF ELSE_: MOV AH,4CH INT 21h END_IF :
  93. Cấu trúc lặp • Một vịng lặp gồm nhiều lệnh được lặp lại , số lần lặp phụ thuộc điều kiện
  94. Vịng FOR • Lệnh LOOP cĩ thể dùng để thực hiện vịng FOR . LOOP destination_label • Số đếm cho vịng lặp là thanh ghi CX mà ban đầu nĩ được gán 1 giá trị nào đĩ . Khi lệnh LOOP được thực hiện CX sẽ tự động giảm đi 1 . Nếu CX chưa bằng 0 thì vịng lặp được thực hiện tiếp tục . Nếu CX=0 lệnh sau lệnh LOOP được thực hiện • Lưu ý rằng vịng FOR cũng như lệnh LOOP thực hiện ít nhất là 1 lần. Do đĩ nếu ban đầu CX=0 thì vịng lặp sẽ làm cho CX=FFFH, tức là thực hiện lặp đến 65535 lần
  95. Ví dụ : Dùng vịng lặp in ra 1 hàng 80 dấu ‘*’ MOV CX,80 ; CX chưá số lần lặp MOV AH,2 ; hàm xuất ký tự MOV DL,’*’ ;DL chưá ký tự ‘*’ TOP: INT 21h ; in dấu ‘*’ LOOP TOP ; lặp 80 lần
  96. Vịng WHILE • Vịng WHILE phụ thuộc vào 1 điều kiện .Nếu điều kiện đúng thì thực hiện vịng WHILE . Vì vậy nếu điều kiện sai thì vịng WHILE khơng thực hiện gì cả
  97. Ví dụ : Viết đoạn mã để đếm số ký tự được nhập vào trên cùng một hàng . MOV DX,0 ; DX để đếm số ký tự MOV AH,1 ;hàm đọc 1 ký tự INT 21h ; đọc ký tự vào AL WHILE_: CMP AL,0DH ; cĩ phải là ký tự CR? JE END_WHILE ; đúng , thốt INC DX ;tăng DX lên 1 INT 21h ; đọc ký tự JMP WHILE_ ; lặp END_WHILE :
  98. Vịng REPEAT • Cấu trúc của REPEAT là repeat statements until condition • Trong cấu trúc repeat mệnh đề được thi hành đồng thời điều kiện được kiểm tra. Nếu điều kiện đúng thì vịng lặp kết thúc .
  99. Ví dụ : viết đoạn mã để đọc vào các ký tự cho đến khi gặp ký tự trống . MOV AH,1 ; đọc ký tự REPEAT: INT 21h ; ký tự trên AL ;until CMP AL,’ ’ ; AL=‘ ‘? JNE REPEAT
  100. Lập trình với cấu trúc cấp cao • Bài tốn: Viết chương trình nhắc người dùng gõ vào một dịng văn bản . Trên 2 dịng tiếp theo in ra ký tự viết hoa đầu tiên và ký tự viết hoa cuối cùng theo thứ tự alphabetical . Nếu người dùng gõ vào một ký tự thường , máy sẽ thơng báo ‘No capitals’ Kết qủa chạy chương trình sẽ như sau : Type a line of text : truong dAi hoc sU pham First capital = A Last capital = U • Để giải bài tốn này ta dùng kỹ thuật lập trình TOP-DOWN , nghĩa là chia nhỏ bài tốn thành nhiều bài tốn con . Cĩ thể chia bài tốn thành 3 bài tốn con như sau : 1. Xuất 1 chuỗi ký tự ( lời nhắc) 2. Đọc và xử lý 1 dịng văn bản 3. In kết qủa
  101. Bước 1: Hiện dấu nhắc . MOV AH,9 ; hàm xuất chuỗi LEA DX,PROMPT ; lấy địa chỉ chuỗi vào DX INT21H ; xuất chuỗi Dấu nhắc cĩ thể mã hố như trong đoạn số liệu: PROMPT DB ‘Type a line of text :’,0DH,0AH,’$’
  102. Bước 2 : Đọc và xử lý một dịng văn bản Read a character WHILE character is not a carrige return DO IF character is a capital (*) THEN IF character precedes first capital Then first capital= character End_if IF character follows last character Then last character = character End_if END_IF Read a character END_WHILE Trong đĩ dịng (*) cĩ nghĩa là điều kiện để ký tự là hoa là điều kiện AND IF ( ‘A’<= character ) AND ( character <= ‘Z’)
  103. Cài đặt MOV AH,1 ; đọc ký tự INT 21H ; ký tự trên AL WHILE : ;trong khi ký tự gõ vào khơng phải là CR thì thực hiện CMP AL,0DH ; CR? JE END_WHILE ;yes, thốt ; nếu ký tự là hoa CMP AL,’A’ ; char >=‘A’? JNGE END_IF ;khơng phải ký tự hoa thì nhảy đến END_IF CMP AL,’Z’ ; char = ; thì ký tự viết hoa đầu tiên = ký tự MOV FIRST,AL ; FIRST=character ;end_if
  104. Cài đặt (tt) CHECK_LAST: ; nếu ký tự là sau biến LAST ( giá trị ban đầu là ‘@’: ký tự trước A) CMP AL,LAST ; char > LAST ? JNG END_IF ; <= ;thì ký tự cuối cùng = ký tự MOV LAST, AL ;LAST = character ;end_if END_IF : ; đọc một ký tự INT 21H ; ký tự trên AL JMP WHILE_ ; lặp END_WHILE: Các biến FIRST và LAST được định nghĩa như sau trong đoạn số liệu : FIRST DB ‘[ $‘ ; ‘[‘ là ký tự sau Z LAST DB ‘@ $ ’ ; ‘@’ là ký tự trước A
  105. Bước 3 : In kết quả • Bước 3 sẽ phải in ra các thơng báo : – NOCAP_MSG nếu khơng phải chữ in – CAP1_MSG chữ in đầu tiên – CAP2_MSG chữ in cuối cùng • Chúng được định nghĩa như sau trong đoạn số liệu : NOCAP_MSG DB 0DH,0AH,‘No capitals $’ CAP1_MSG DB 0DH,0AH, ‘First capital= ’ FIRST DB ‘[ $ ’ CAP2_MSG DB 0DH,0AH,‘Last capital=’ LAST DB ‘@ $’
  106. Bước 3 : In kết quả ;in kết quả MOV AH,9 ; hàm xuất ký tự ; IF khơng cĩ chữ hoa nào được nhập thì FIRST =‘[’ CMP FIRST,’[’ ; FIRST=‘[’ ? JNE CAPS ; khơng , in kết qủa ;THEN LEA DX,NOCAP_MSG INT 21H CAPS: LEA DX,CAP1_MSG INT 21H LEA DX,CAP2_MSG INT 21H ; end_if
  107. Lệnh XLAT • Trong một số ứng dụng cần phải chuyển số liệu từ dạng này sang dạng khác . Ví dụ IBM PC dùng ASCII code cho các ký tự nhưng IBM Mainframes dùng EBCDIC ( Extended Binary Coded Decimal Interchange Code) . Để chuyển một chuỗi ký tự đã được mã hố bằng ASCII thành EBCDIC , một chương trình phải thay mã ASCII của từng ký tự trong chuỗi thành mã EBCDIC tương ứng . • Lệnh XLAT ( khơng cĩ tốn hạng ) được dùng để đổi một giá trị byte thành một giá trị khác chứa trong một bảng . – AL phải chứa byte cần biến đổi – DX chứa điạ chỉ offset của bảng cần biến đổi • Lệnh XLAT sẽ : 1) cộng nội dung của AL với địa chỉ trên BX để tạo ra điạ chỉ trong bảng 2) thay thế giá trị của AL với giá trị tìm thấy trong bảng
  108. Ví dụ • Giả sử rằng nội dung của AL là trong vùng 0 đến Fh và chúng ta muốn thay nĩ bằng mã ASCII của số hex tương đương nĩ , tức là thay 6h bằng 036h=‘6’ , thay Bh bằng 042h=“B” . • Bảng biến đổi là : 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” , chúng ta thực hiện các lệnh sau : MOV AL,0Ch ; số cần biến đổi LEA BX,TABLE ; BX chưá điạ chỉ offset của bảng XLAT ; AL chứa “C” • Ở đây XLAT tính TABLE + Ch = TABLE +12 và thay thế AL bởi 043h. Nếu AL chứa một số khơng ở trong khoảng 0 đến 15 thì XLAT sẽ cho một giá trị sai .