nguyenanhque .asm.lenh

Màu nền
Font chữ
Font size
Chiều cao dòng

LẬP TRÌNH HỢP NGỮ

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 - Ngôn ngữ máy ­ Machine languages - Hợp ngữ Assembly languages - Ngôn ngữ cấp cao High level languages

• Phân chia làm 3 nhóm chính

• Ngôn ngữ duy nhất của máy tính CPU

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ông được sử dụng trong thực tế để viết chương trình

• Khó nhớ hàng chục ngàn lệnh dạng {0,1}* • Rất khó xác định & sửa lỗi

• 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

Hợp ngữ Assembly Languages

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. • Được phân làm nhiều lớp

- Source code & Executed code - Lập trình goto - Lập trình cấu trúc - Structured - Lập trình hướng đối tượng -

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ữ

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

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

• Biến (Variable) & Hằng (Constant) • Giải thuật: khái niệm, công cụ biểu diễn

- Kiểu dữ liệu có cấu trúc: array, string, record,..

• integer, long, character, byte, .... • Real (double, float) • Kiểu khác: string

Cấu trúc điều khiển cơ bả n

If <condition> then Statement; If <condition> then Statement 1 else Statement 2; Case <Value> of value 1 : Statement 1; ........... value n : Statement n; else : Statement 0 end; While <condition> do Statement; Repeat Statement until <condition>; For counter=start value to end value do Statement; For counter=start value downto end value do

• 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 - Chạy thử với các dữ liệu mẫu để kiểm tra lỗi semantic và runtime

Chu kỳ sống của phần mềm

• Thử nghiệm Testing

• Vận hành và bảo trì • Phát triển theo yêu cầu

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#

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.

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.

Trường Tên ( Name Field) Trường tên được dùng cho nhãn

Phân biệt

Tên hợp lệ không hợp lệ COUNTER1 @CHARACTER SUM_OF_DIGITS DONE? .TEST REPEAT Tên TWO WORDS 2ABC A45.28 YOU&ME ADD

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)

Nhắc lại phương pháp định • Tức thời (trực hằng) địa chỉ

- Toán hạng trong lệnh

• Thanh ghi

- Toán hạng trong thanh ghi

• Trực tiếp

- Địa chỉ trong lệnh là địa chỉ ô nhớ của toán hạng

• Gián tiếp qua thanh ghi

- Thanh ghi chứa địa chỉ ô nhớ của toán hạng

• Gián tiếp ô nhớ

- Địa chỉ trong lệnh là địa chỉ ô nhớ của toán hạng

• Chỉ số (dịch chuyển)

- Địa chỉ toá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 toán hạng

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ờ

Thanh ghi đa dụng

• AX (Accumulator register)

- Sử dụng cho tính toá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

Thanh ghi cờ (Flag)

Flags Register Tắt OF DF IF TF SF ZF AF PF CF Tên Overflow Direction Interrupt Trap Sign Zero Auxiliary Carry Parity Carry bit n 11 10 9 8 7 6 4 2 0 Kiểm tra số bit 1 chẵn Tràn số không dấu "Mô tả" Tràn số có dấu Hướng xử lý chuỗi Cho phép ngắt CPU thực hiện từng bước Kiểm tra kết quả là số âm Kiểm tra kết quả bằng 0

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

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

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)

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,

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 EQU constant Ví dụ : LF EQU 0AH • 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 ' ↔

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 .

• Độ 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

Các kiểu bộ nhớ ( memory models)

Đ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 WORD1DW 2 WORD2DW 5 MSG DB 'THIS IS A MESSAGE ' MASK EQU 10010010B

Đ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 . .STACK100h ; dành 256 bytes cho vùng stack

Đ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

Cấu trúc chương trình

.MODELSMALL .STACK100h .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ó

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

Các lệnh cơ bản

• • • • • • • MOV XCHG ADD SUB INC DEC NEG

Lệnh MOV

• • MOV dst,src Chuyển nội dung toán hạng src vào toán hạng dst. Toán hạng nguồn src có thể là thanh ghi (reg), bộ nhớ (mem) hay giá trị tức thời (immed); toá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

• •

Lệnh MOV

• MOV AX, WORD1

Lệnh MOV

Lệnh XCHG

• XCHG dst,src: (Exchange) hoán chuyển nội dung 2 toán hạng. • Toá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

Lệnh XCHG

• XCHG AH, BL:

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 .

Ngắt 21h

MOV AH,1 INT 21H AL

;Hàm vào 1 phím ;Mã ASCII trong

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ự

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 MOV DL,9 tab

;sử dụng hàm 2 ;cách một khoảng

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

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ị

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 MOV AH, 9 INT 21h ;Lấy thông báo ;Hàm hiển thị chuỗi ;Hiển thị chuỗi

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 MOV AX, @DATA DS, AX

Ví dụ

.model small .stack 100h .data s DB "Hello !$" in .code Main proc mov AX,@data ghi vào DS mov DS, AX ; xuất chuỗi lea DX, s mov AH , 9 int 21h mov AH, 4Ch int 21h Main Endp

; Khai báo xâu kí tự cần

; Lấy địa chỉ data segment

; Gọi hàm 9, ngắt 21h để in ; Thoát khỏi chương trình

Nhóm lệnh tính toán số học ADD SUB INC DEC NEG MUL , IMUL DIV , IDIV + ++ a * /

Lệnh ADD

• Dạng lệnh :

ADD ADD ADD reg,reg mem,reg reg,mem thđ ← ADD ADD ADD reg,immed mem,immed accum,immed

• Giải thích :

thđ + thn

Cộng toán hạng nguồn vào toán hạng đích. Kết quả cất vào toán hạng đích.

• Tác động cờ :

Ví dụ

ADD ADD ADD ADD ADD ADD ADD CX,SI ; CX ← CX + SI DH,BL ; DH ← DH + BL [1000h],BX ;[1001h,1000h] ← [1001h,1000h] + BX [2000h],CL ; [2000h] ← [2000h] + CL AL,[0000h] ; AL ← AL + [0000h] BYTE PTR [SI+8],5 ; [SI+8] ← [SI+8] + 05h WORD PTR [SI+8],5

Lệnh SUB

• Dạng lệnh :

SUB SUB SUB reg,reg mem,reg reg,mem SUB SUB SUB reg,immed mem,immed accum,immed

• Giải thích : thđ ← thđ - thn Trừ toán hạng đích cho toán hạng nguồn. Kết quả cất vào toán hạng đích. • Tác động cờ :

 Xem thêm SBB

Ví dụ

SUB DL,AL ; DL ; CX ← ← DL - AL CX - [DI+1,DI] ← BP - 4 SUB CX,[DI] SUB BP,4

; BP

Lệnh INC

• Dạng lệnh : INC reg INC • Giải thích : thđ ← thđ + 1 mem

cộng 1 vào toán hạng đích nhưng không ảnh hưởng cờ nhớ.

• Tác động cờ : • Ví dụ :

INC INC CH WORD PTR [1000h]

Lệnh DEC

• Dạng lệnh : DEC reg DEC • Giải thích : thđ ← thđ 1 mem

trừ 1 vào toán hạng đích nhưng không ảnh hưởng cờ nhớ.

• Tác động cờ : • Ví dụ :

DEC DEC AX Byte PTR ES:[1000h]

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 NEG AX Byte PTR ES:[SI]

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 toán hạng nguồn là 8 bit thì :

AX ← AL * thn8

- Trường hợp toán hạng nguồn là 16 bit thì :

{DX AX} ← AX * thn16 • Tác động cờ :

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 *

Lệnh IMUL

• Tương tự lệnh MUL, nhưng xử lý trên số có dấu

• Dạng lệnh : DIV reg DIV mem • Giải thích : chia hai số không dấu

- Nếu toán hạng nguồn là 8 bit thì :

Lệnh DIV

AL ← (AX / thn8)

AH ← số dư của (AX / thn8) - Toán hạng nguồn 16 bit thì : AX ← (DXAX / thn16) DX ← số dư của (DXAX / thn16)

• Tác động cờ :

Lệnh IDIV

• Tương tự lệnh DIV nhưng làm việc trên số có dấu

Nhóm lệnh xử lý logic AND OR XOR NOT SHL SHR SAL SAR ROL ROR RCL RCR

Lệnh AND

• Dạng lệnh :

AND AND AND reg,reg AND mem,reg AND reg,mem AND reg,immed mem,immed accum,immed

• Giải thích : thđ ← thđ AND thn. • Tác động cờ:

Ví dụ:

MOV AL, 'a' 01100001b AND AL, 11011111b 01000001b ('A') 01100001 11011111 -------01000001 ; AL = ; AL =

1 AND 1 = 1 1 AND 0 = 0 0 AND 1 = 0 0 AND 0 = 0

Lệnh OR

• Dạng lệnh :

OR OR OR reg,reg mem,reg reg,mem OR OR OR reg,immed mem,immed accum,immed

• Giải thích : thđ ← thđ OR thn. • Tác động cờ :

Ví dụ:

MOV AL, 'A' ; AL = 01000001b OR AL, 00100000b ; AL = 01100001b ('a') 1 OR 1 = 1 01000001 00100000 -------01100001

1 OR 0 = 1 0 OR 1 = 1 0 OR 0 = 0

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ờ:

Ví dụ:

MOV AL, 00000111b XOR AL, 00000010b ; AL = 00000101b 00000111 00000010 -------00000101

1 XOR 1 = 0 1 XOR 0 = 1 0 XOR 1 = 1 0 XOR 0 = 0

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

Lệnh SHL/SAL

• Dạng lệnh :

SHL SHL reg,1 reg,CL SHL SHL mem,1 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ờ :

Ví dụ

MOV AL, 11100000b SHL AL, 1 ; AL=11000000b ; CF=1

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

Söï caàn thieát cuûa leänh nhaûy

• ÔÛ caùc chöông trình vieát baèng ngoân ngöõ caáp cao thì vieäc nhaûy (leänh GoTo) laø ñieàu neân traùnh nhöng ôû laäp trình heä thoáng thì ñaây laø vieäc caàn thieát vaø laø ñieåm maïnh cuûa 1 chöông trình vieát baèng Assembly. Moät leänh nhaûy  CPU phaûi thöïc thi 1 ñoaïn leänh ôû 1 choã khaùc vôùi nôi maø caùc leänh trình, ñöôïc thöïc thi. Trong laäp ñang coù nhöõng nhoùm phaùt bieåu caàn phaûi laëp ñi laëp laïi nhieàu laàn trong 1 ñieàu kieän naøo ñoù. Ñeå ñaùp öùng ñieàu kieän naøy ASM cung caáp 2 leänh JMP vaø LOOP.

Chuong 8 : Cau truc DK va Vong lap 71

Leänh JMP (Jump)

• Coâng duïng :Chuyeån ñieàu khieån khoâng ñieàu kieän. Cuù

phaùp : JMP ñích • Nhaûy gaàn (NEAR) : 1 taùc vuï nhaûy trong cuøng 1 segment. • Nhaûy xa (FAR) : 1 taùc vuï nhaûy sang segment khaùc. • VD: mov ax,a •Jmp boqua: •Add ax,b •Boqua:

Chuong 8 : Cau truc DK va Vong lap

72

Lệnh CMP

• Cú pháp: CMP đích, nguồn • Công dụng : so sánh toán hạng đích với toán hạng nguồn bằng cách lấy toán hạng đích - toán hạng nguồn. • Hoạt động : dùng phép trừ nhưng không có toán hạng đích nào bị thay đổi. • Lệnh CMP giống hệt lệnh SUB trừ việc toán hạng đích không thay đổi.

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

LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TOÁ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

LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TOÁ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 thì JMP label

• Lệnh JLE label: (Jump if Less or Equal)

- Nếu CF <> OF hoặc ZF = 1 thì JMP label

LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TOÁ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

LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TOÁ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

LỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TOÁ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

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

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

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

• Thuật toán: IF AX<0 THEN replace AX by AX END IF • Mã hoá: ; if AX<0 CMP AX,0 JNL END_IF ; no , exit ;then NEG AX , yes , change sign END_IF :

Ví dụ 1: Thay thế giá trị trên AX bằng giá trị tuyết đối của nó

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 • Thuật toán thứ tự ký tự )

IF AL<= BL THEN display AL ELSE display character in BL END_IF Mã hoá : 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 :

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

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 toán : CASE AX < 0 put 1 in BX = 0 put 0 in BX > 0 put 1 in BX

Cài đặt

; case AX CMP JL JE JG NEGATIVE: MOV JMP MOV JMP BX, 1 END_CASE BX,0 END_CASE BX,1 END_CASE AX,0 NEGATIVE ZERO positive ;test AX ;AX<0 ;AX=0 ;AX>0

ZERO:

POSITIVE:

MOV JMP END_CASE :

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

• Thuật toán : Read a character ( into AL) IF ( 'A'<= character ) AND ( charater <= 'Z') THEN display character END_IF

Ví dụ 1: Đọc một ký tự và nếu nó là ký tự hoa thì in nó ra màn hình

Cài đặt

;read a character MOV AH,2 INT 21H ; character in AL ; IF ( 'A'<= character ) AND ( charater <= 'Z') CMP AL,'A' ; char >='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

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 toán Read a charcter ( into AL) IF ( character ='Y') OR ( character='y') THEN dispplay it ELSE terminate the program END_IF

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 :

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

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ư

Ví dụ : Dùng vòng lặp in ra 1 hàng 80 dấu '*' MOV lặ p MOV tự MOV '*' TOP: INT LOOP CX,80 AH,2 DL,'*' ; CX chưá số lần ; hàm xuất ký ;DL chưá ký tự

21h TOP

; in dấu '*' ; lặp 80 lần

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ả

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 MOV AH,1 INT 21h AL WHILE_: tự CR? thoát INC DX ;tăng DX lên 1 CMP AL,0DH JE ; có phải là ký ; đúng , ; DX để đếm số ký tự ;hàm đọc 1 ký tự ; đọc ký tự vào

END_WHILE

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 .

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

Lập trình với cấu trúc cấp cao

• Bài toá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 toán này ta dùng kỹ thuật lập trình TOP DOWN , nghĩa là chia nhỏ bài toán thành nhiều bài toán con . Có thể chia bài toán thành 3 bài toá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

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 INT 21H ; xuất chuỗi Dấu nhắc có thể mã hoá như trong đoạn số liệu: PROMPT DB 'Type a line of text :',0DH,0AH,'$'

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')

Cài đặt

MOV AH,1 INT 21H ; đọc ký tự ; 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, thoá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 <= 'Z'? JNLE END_IF ; không phải ký tự hoa thì nhảy đến END_IF ; thì ; nếu ký tự nằm trước biến FIRST ( giá trị ban đầu là'[' : ký tự sau Z ) CMP AL,FISRT ; char < FIRST ? JNL CHECK_LAST ; >= ; thì ký tự viết hoa đầu tiên = ký tự MOV FIRST,AL ; FIRST=character ;end_if

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

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= '

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

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ã hoá 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ó toá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

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

HẾT

Bạn đang đọc truyện trên: Truyen2U.Pro