LAP TRINH HE THONG

7
Luôn luôn lắng nghe, lâu lâu mới hiểu Phạm Thái Bình_1117959 1 | Page Lập Trình Assembly 0. Khai báo biến và hng: Bien db ? Hang EQU <gia tr> 1. Hoán chuyn dliu: XCHG Đích, Nguồn ; Đích ↔ Nguồn Nguồn, đích: Reg, Mem. 2. Nhóm tính toán shc • Cú pháp: ADD đích, nguồn ; đích ← đích + nguồn SUB đích, nguồn ; đích ← đích - ngun Ngun : Reg, Mem, Immed. Đích : Reg, Mem. • Cú pháp: INC đích ; đích ← đích + 1 DEC đích ; đích ← đích - 1 Đích : Reg, Mem. • Khác nhau không giữa 2 lnh sau: DEC AL SUB AL,1 DEC không ảnh hưởng CF; SUB thì có. 3.Nhân - Chia MUL ngun ; NHÂN Ngun: Reg, Mem • Nhân 8 bít khi nguồn là 8 bit: AX AL * ngun • Nhân 16 bít khi nguồn là 16 bit: DX:AX AX * ngun DIV ngun ; CHIA Ngun: Reg, Mem • Chia 8 bit khi nguồn là 8 bit: AL AX / ngun; AH AX % ngun • Chia 16 bit khi nguồn là 16 bit: AX DX:AX / ngun; DX DX:AX % ngun. 4. Nhóm logic AND đích, nguồn ; đích đích ngun OR đích, nguồn ; đích đích ngun XOR đích, nguồn ; đích đích ngun TEST đích, nguồn ; C đích ngun NOT đích ; đích đích NEG đích ; bù 2 5.ghi dch SHL đích, 1 ; dch toán hạng đích sang trái 1 bit. SHL đích, CL ; dch sang trái CL bít SHR đích, 1 ; dch trái toán hạng đích 1 bit. SAL đích, 1 ; dch toán hạng đích sang trái 1 bit. SAR đích, 1 ; dch toán hạng đích sang phải 1 bit. ROL đích, 1; quay vòng TH đích sang trái 1 bit ROR đích, 1 ; Quay vòng sang phi 1 bít RCL đích, 1 ; quay vòng qua csang trái RCR đích, 1 ; quay vòng qua csang phi. Đích: Reg, Mem 6.Lnh MOV - Lnh MOV không nh hưởng đến các c. - Không thchuyn trc tiếp dliu gia hai ô nhmà phi thông qua mt thanh ghi MOV AX,mem1 MOV mem2,AX - Không thchuyn giá trtrc tiếp vào thanh ghi đoạn MOV AX,1010h MOV DS,AX - Không thchuyn trc tiếp giữa 2 thanh ghi đoạn - Không thdùng thanh ghi CS làm toán hạng đích 7. Các ngắt thường dùng (21h ca DOS) • Hàm 01h: Đợi đọc 1 ký ttbàn phím lưu vào AL • Hàm 02h: Hin th1 ký ttrong DL lên màn hình • Hàm 07h: Ging hàm 1, không hin thli ký t• Hàm 08h: Ging hàm 7 • Hàm 09h: Hin th1 chui ký tự, DS:DX địa chchui • Hàm 0Ah: Đọc 1 chuỗi vào vùng đệm bnh• Hàm 4ch: Kết thúc chương trình trở vDos 8. Truy xut tp tin Trình ttruy xut 1. Mhay To tp tin mi 2. Truy xut ni dung (Đọc hay Ghi) 3. Xlý ni dung (Nếu cn) 4. Đóng tập tin Các hàm phc vtp tin: Hàm 3Ch: To tp tin mi Hàm 3Dh: Mtp tin trên đĩa Tenfile DB ‘C:\ASM\DATA.TXT’,0 • Hàm 3Fh: Đọc ni dung tp tin vào bnh• Hàm 40h: Ghi dliu trong bnhvào tp tin • Hàm 3Eh: Đóng file • Hàm 41h: Xóa tập tin trên đĩa • Hàm 42h: Thay đổi con trtp tin 9. Nhảy không điều kin: luôn luôn nhy • Cú pháp: JMP <Đích> ; IP Đích ; đích: Immed16, Reg16, Mem16 JMP SHORT <Đích> ; Nhy ngn JMP NEAR <Đích> ; Nhy gn JMP FAR <Đích> ; Nhy xa

description

su dung ngon ngu asm

Transcript of LAP TRINH HE THONG

Page 1: LAP TRINH HE THONG

Luôn luôn lắng nghe, lâu lâu mới hiểu Phạm Thái Bình_1117959

1 | P a g e L ậ p T r ì n h A s s e m b l y

0. Khai báo biến và hằng:

Bien db ?

Hang EQU <gia trị>

1. Hoán chuyển dữ liệu:

XCHG Đích, Nguồn ; Đích ↔ Nguồn

Nguồn, đích: Reg, Mem.

2. Nhóm tính toán số học

• Cú pháp:

ADD đích, nguồn ; đích ← đích + nguồn

SUB đích, nguồn ; đích ← đích - nguồn

Nguồn : Reg, Mem, Immed.

Đích : Reg, Mem.

• Cú pháp:

INC đích ; đích ← đích + 1

DEC đích ; đích ← đích - 1

Đích : Reg, Mem.

• Khác nhau không giữa 2 lệnh sau:

DEC AL

SUB AL,1

DEC không ảnh hưởng CF; SUB thì có.

3.Nhân - Chia

MUL nguồn ; NHÂN

Nguồn: Reg, Mem

• Nhân 8 bít khi nguồn là 8 bit: AX AL * nguồn

• Nhân 16 bít khi nguồn là 16 bit: DX:AX AX *

nguồn

DIV nguồn ; CHIA

Nguồn: Reg, Mem

• Chia 8 bit khi nguồn là 8 bit: AL AX / nguồn;

AH AX % nguồn

• Chia 16 bit khi nguồn là 16 bit: AX DX:AX /

nguồn;

DX DX:AX % nguồn.

4. Nhóm logic

AND đích, nguồn ; đích đích ∧ nguồn

OR đích, nguồn ; đích đích ∨ nguồn

XOR đích, nguồn ; đích đích ⊕ nguồn

TEST đích, nguồn ; Cờ đích ∧ nguồn

NOT đích ; đích đích

NEG đích ; bù 2

5.ghi dịch

SHL đích, 1 ; dịch toán hạng đích sang trái 1 bit.

SHL đích, CL ; dịch sang trái CL bít

SHR đích, 1 ; dịch trái toán hạng đích 1 bit.

SAL đích, 1 ; dịch toán hạng đích sang trái 1 bit.

SAR đích, 1 ; dịch toán hạng đích sang phải 1 bit.

ROL đích, 1; quay vòng TH đích sang trái 1 bit

ROR đích, 1 ; Quay vòng sang phải 1 bít

RCL đích, 1 ; quay vòng qua cờ sang trái

RCR đích, 1 ; quay vòng qua cờ sang phải.

Đích: Reg, Mem

6.Lệnh MOV

- 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

MOV AX,mem1

MOV mem2,AX

- Không thể chuyển giá trị trực tiếp vào thanh ghi

đoạn

MOV AX,1010h

MOV DS,AX

- Không thể chuyển trực tiếp giữa 2 thanh ghi đoạn

- Không thể dùng thanh ghi CS làm toán hạng đích

7. Các ngắt thường dùng (21h của DOS)

• Hàm 01h: Đợi đọc 1 ký tự từ bàn phím lưu vào

AL

• Hàm 02h: Hiển thị 1 ký tự trong DL lên màn

hình

• Hàm 07h: Giống hàm 1, không hiển thị lại ký tự

• Hàm 08h: Giống hàm 7

• Hàm 09h: Hiển thị 1 chuỗi ký tự, DS:DX địa chỉ

chuỗi

• Hàm 0Ah: Đọc 1 chuỗi vào vùng đệm bộ nhớ

• Hàm 4ch: Kết thúc chương trình trở về Dos

8. Truy xuất tập tin

Trình tự truy xuất

1. Mở hay Tạo tập tin mới

2. Truy xuất nội dung

(Đọc hay Ghi)

3. Xử lý nội dung (Nếu cần)

4. Đóng tập tin

Các hàm phục vụ tập tin:

• Hàm 3Ch: Tạo tập tin mới

• Hàm 3Dh: Mở tập tin trên đĩa

Tenfile DB ‘C:\ASM\DATA.TXT’,0

• Hàm 3Fh: Đọc nội dung tập tin vào bộ nhớ

• Hàm 40h: Ghi dữ liệu trong bộ nhớ vào tập tin

• Hàm 3Eh: Đóng file

• Hàm 41h: Xóa tập tin trên đĩa

• Hàm 42h: Thay đổi con trỏ tập tin

9. Nhảy không điều kiện: luôn luôn

nhảy

• Cú pháp: JMP <Đích> ; IP Đích

; đích: Immed16, Reg16, Mem16

JMP SHORT <Đích> ; Nhảy ngắn

JMP NEAR <Đích> ; Nhảy gần

JMP FAR <Đích> ; Nhảy xa

Page 2: LAP TRINH HE THONG

Luôn luôn lắng nghe, lâu lâu mới hiểu Phạm Thái Bình_1117959

2 | P a g e L ậ p T r ì n h A s s e m b l y

10. Lệnh so sánh:

CMP Trái, Phải

; Cờ Trái – Phải

Trái > Phải : C=Z=0

Trái < Phải: C=1, Z=0

Trái = Phải: C=0, Z=1

11. Nhảy có điều kiện:

Jxx <Đích>

; đích: immed16, Reg16, Mem16

Trong đó:

B,L: <

A,G: >

E,Z: =

C: có nhớ

S: có dấu

O: có tràn

Vd: JCXZ ; nhảy nếu CX =0

12. Vòng Lập:

* LOOP for

MOV CX, n ; n là số lần lặp

nhan:

Các lệnh cần lặp lại

LOOP nhan

Ví dụ: in ra màn hình các ký tự từ A đến Z

MOV DL, ‘A’ ; DL ← ‘A’

MOV CX, 26 ; A→Z: 26 ký tự

inkytu: MOV AH, 02h

INT 21h

INC DL ; DL tăng lên 1 để có ký tự kế

LOOP inkytu

*LOOPZ/LOOPE do...while

Tự động giảm CX một đơn

vị, nếu

CX ≠ 0 và ZF = 1 thì nhảy đến

Đích để thực hiện lệnh.

Ngược lại, nếu CX = 0 hay ZF

= 0 thì không nhảy, khi đó

lệnh viết sau lệnh nhảy được

thực hiện.

Cấu trúc vòng lặp do … while

viết bằng LOOPZ:

MOV CX, n

nhan: <Các lệnh cần lập>

LOOPZ nhan

*LOOPNZ/LOOPNE

Tự động giảm CX một đơn vị,

nếu CX ≠ 0 và ZF = 0 thì nhảy

đến Đích để thực hiện lệnh.

Ngược lại, nếu CX = 0 hay ZF

= 1 thì không nhảy, khi đó

lệnh viết sau lệnh nhảy được

thực hiện

Cấu trúc vòng lặp do … while

viết bằng LOOPNZ:

MOV CX, n

nhan: <Các lệnh cần lập>

LOOPNZ nhan

Page 3: LAP TRINH HE THONG

Luôn luôn lắng nghe, lâu lâu mới hiểu Phạm Thái Bình_1117959

3 | P a g e L ậ p T r ì n h A s s e m b l y

MỘT SỐ BÀI TẬP :

Bài 1: Nhập vào 1 ký tự thường. In ra màn hình

chuỗi ký tự từ ký tự vừa nhập đến z.

comment *

coder: Pham Thai Binh

***********************

data segment

string1 db 'hay nhap 1 ky tu thuong: $'

string2 db 10,13,'chuoi ky tu den z la: $'

kytu db ?

data ends

code segment

assume cs:code, ds:data

start:

mov ax,data

mov ds,ax

mov ah,09h

lea dx,string1

int 21h

mov ah,07h

int 21h

mov kytu,al

mov dl,kytu

mov ah,02h

int 21h

mov ah,09h

lea dx,string2

int 21h

mov dl,kytu

nhan:

mov ah,02h

int 21h

mov [si],dl

mov dl,20h

mov ah,02h

int 21h

mov dl,[si]

inc dl

cmp dl,'z'

jna nhan

mov ah,08h

int 21h

mov ah,4ch

int 21h

code ends

end start

Bài 2: Chương trình :

Nhập ký tự c,C in ra “Good afternoon!”

Nhập ký tự t,T in ra “'Good evening!”

Nhập ký tự s,S in ra “Good morning!”

comment *

coder: Pham Thai Binh

***********************

Nhập vào t,T in ra “Good evening!”

Nhập vào s,S in ra “ Good morning!”

data segment

string1 db 'Hay nhap vao 1 trong cac ky tu: c, C, s,

S, t, T: $'

strings db 10,13,'Good morning!$'

stringt db 10,13,'Good Afternoon!$'

stringc db 10,13,'Good everning!$'

nhap db 10,13,'Ky tu vua nhap khong thoa man yeu

cau!$'

hoi db 10,13,'Ban co muon tiep tuc khong? (y/n): $'

lai db 10,13,'Ban phai nhap y or n $'

xuongdong db 10,13, '$'

data ends

code segment

assume cs:code, ds:data

start:

mov ax,data

mov ds,ax

mov ah,09h

lea dx,string1

int 21h

mov ah,01h

int 21h

cmp al,'c'

je chieu

cmp al,'C'

je chieu

cmp al,'s'

je sang

cmp al,'S'

je sang

cmp al,'t'

je trua

cmp al,'T'

je trua

mov ah,09h

lea dx,nhap

int 21h

jmp tiep

sang:

mov ah,09h

Page 4: LAP TRINH HE THONG

Luôn luôn lắng nghe, lâu lâu mới hiểu Phạm Thái Bình_1117959

4 | P a g e L ậ p T r ì n h A s s e m b l y

lea dx,strings

int 21h

jmp tiep

trua:

mov ah,09h

lea dx,stringt

int 21h

jmp tiep

chieu:

mov ah,09h

lea dx,stringc

int 21h

jmp tiep

tiep:

mov ah,09h

lea dx,hoi

int 21h

mov ah,01h

int 21h

cmp al,'n'

je exit

cmp al,'y'

mov ah,09h

lea dx,xuongdong

int 21h

je start

je hoilai

hoilai:

mov ah,09h

lea dx,lai

int 21h

jmp tiep

exit:

mov ah,4ch

int 21h

code ends

end start

Bài 3: Đổi ký tự hoa vừa nhập thành ký tự Hoa

comment *

coder: Pham Thai Binh

***********************

data segment

string1 db 'Hay nhap vao 1 ky tu thuong: $'

string2 db 10,13,'In hoa ky tu vua nhap: $'

inhoa db ?

data ends

code segment

assume cs:code, ds:data

begin:

mov ax,data

mov ds,ax

mov ah,09h

lea dx,string1

int 21h

mov ah,01h

int 21h

mov inhoa,al

mov ah,09h

lea dx,string2

int 21h

sub inhoa,20h

mov dl,inhoa

mov ah,02h

int 21h

mov ah,08h

int 21h

mov ah,4ch

int 21h

code ends

end begin

Bài 4: Nhận diện ký tự vừa nhập là hoa hay

thường

comment *

coder: Pham Thai Binh

***********************

data segment

string1 db 'Hay nhap vao 1 ky tu: $'

string2 db 10,13,'Ky tu HOA$'

string3 db 10,13,'Ky tu thuong$'

data ends

code segment

assume cs:code, ds:data

start:

mov ax,data

mov ds,ax

mov ah,09h

lea dx,string1

int 21h

mov ah,01h

int 21h

cmp al,'Z'

ja thongbao

mov ah,09h

lea dx,string2

int 21h

jmp exit

thongbao:

mov ah,09h

lea dx,string3

int 21h

exit:

Page 5: LAP TRINH HE THONG

Luôn luôn lắng nghe, lâu lâu mới hiểu Phạm Thái Bình_1117959

5 | P a g e L ậ p T r ì n h A s s e m b l y

mov ah,08h

int 21h

mov ah,4ch

int 21h

code ends

end start

Bài 5: Nhập ký tự .. hiện ký tự trc và sau nó

comment *

coder: Pham Thai Binh

***********************

data segment

string1 db 'Hay nhap vao 1 ky tu: $'

string2 db 10,13,'Ky tu truoc no la: $'

string3 db 10,13,'Ky tu sau no la: $'

kt db ?

data ends

code segment

assume cs:code, ds:data

begin:

mov ax,data

mov ds,ax

mov ah,09h

lea dx,string1

int 21h

mov ah,01h

int 21h

mov kt,al

mov ah,09h

lea dx,string2

int 21h

mov dl,kt

sub dl,1

mov ah,02h

int 21h

mov ah,09h

lea dx,string3

int 21h

mov dl,kt

add dl,1

mov ah,02h

int 21h

mov ah,08h

int 21h

mov ah,4ch

int 21h

code ends

end begin

Bài 6: Đề thi học kỳ 1 (2013-2014):

Viết 1 chương trình:

Hiển thị họ tên và mã số sinh viên. Sau đó, cho

nhập vào 1 chuỗi bất kỳ (tối đa 30 ký tự) , đỗi

tât cả các ký tự trong chuỗi vừa nhập từ chữ hoa

sang chữ thường và in ra chuỗi thường.

comment *

coder: Pham Thai Binh

***********************

data segment

string1 db 'Ho va Ten: Pham Thai Binh $'

string2 db 10,13,'MSSV: 1117959 $'

string3 db 10,13,'Hay nhap vao 1 chuoi bat ky: $'

string4 db 10,13,'Chuoi sau khi xu ly la: $'

xuongdong db 10,13,'$'

max db 30

len db ?

nhap db 31 dup('$')

data ends

code segment

assume cs:code,ds:data

begin:

mov ax,data

mov ds,ax

mov ah,09h

lea dx,string1

int 21h

mov ah,09h

lea dx,string2

int 21h

mov ah,09h

lea dx,string3

int 21h

mov ah,0ah

lea dx,max

int 21h

mov di,0

start:

cmp nhap[di],' '

jz exit

cmp nhap[di],'Z'

jbe thuong

jmp exit

thuong:

add nhap[di],32

exit:

inc di

mov ax,di

cmp len,al

jne start

mov ah,09h

lea dx,string4

int 21h

mov ah,09h

Page 6: LAP TRINH HE THONG

Luôn luôn lắng nghe, lâu lâu mới hiểu Phạm Thái Bình_1117959

6 | P a g e L ậ p T r ì n h A s s e m b l y

lea dx,nhap

int 21h

mov ah,08h

int 21h

mov ah,4ch

int 21h

code ends

end begin

Bài 7: Nhập vào một tên, hiển thị lời chào tên

vừa nhập

comment *

coder: Pham Thai Binh

***********************

data segment

string1 db 'Hay nhap ten ban vao: $'

string2 db 10,13,'Xin chao ban: $'

nhapten db 30,?,31 dup('$')

data ends

code segment

assume cs:code,ds:data

start:

mov ax,data

mov ds,ax

mov ah,09h

lea dx,string1

int 21h

mov ah,0ah

lea dx,nhapten

int 21h

mov ah,09h

lea dx,string2

int 21h

mov ah,09h

lea dx,nhapten+2

int 21h

mov ah,08h

int 21h

mov ah,4ch

int 21h

code ends

end start

Bài 8: Phân biệt kí tự nhập vào là kí tự Hoa,

thường ,chữ số hay kí tự đặc biệt.

comment *

coder: Pham Thai Binh

***********************

dseg segment

msg1 db 'Nhap vao 1 ky tu: $'

msg2 db 10,13,"Loai cua ky tu vua nhap la: $"

tb1 db " ky tu dac biet $"

tb2 db " chu cai thuong $"

tb3 db " chu cai in hoa $"

tb4 db " chu so $"

kytu db ?

dseg end

cseg segment

assume cs: cseg, ds: dseg

start:

mov ax, dseg

mov ds, ax

mov ah, 09h

lea dx, msg1

int 21h

mov ah, 01h

int 21h

mov kytu, al

mov ah, 09h

lea dx, msg2

int 21h

cmp kytu, 30h

jb dacbiet

cmp kytu, 39h

jb chuso

cmp kytu, 41h

jb dacbiet

cmp kytu, 5Bh

jb chuhoa

cmp kytu, 61h

jb dacbiet

cmp kytu, 7Bh

jb chuthuong

jmp dacbiet

dacbiet:mov ah, 09h

lea dx, tb1

int 21h

jmp exit

chuthuong: mov ah, 09h

lea dx, tb2

int 21h

jmp exit

chuhoa: mov ah, 09h

lea dx, tb3

int 21h

jmp exit

chuso: mov ah, 09h

Page 7: LAP TRINH HE THONG

Luôn luôn lắng nghe, lâu lâu mới hiểu Phạm Thái Bình_1117959

7 | P a g e L ậ p T r ì n h A s s e m b l y

lea dx, tb4

int 21h

jmp exit

exit: mov ax, 4ch

int 21h

cseg ends

end start

Bài 9: In chuỗi kí tự từ A đến Z.

comment *

coder: Pham Thai Binh

***********************

code segment

assume cs:code

start:

mov ax,data

mov ds,ax

mov dl,'A'

mov cx,26

inkytu:

mov ah,02h

int 21h

inc dl

loop inkytu

mov ah,08h

int 21h

mov ah,4ch

int 21h

code ends

end start