LÀM QUEN VỚI LẬP TRÌNH HỢP NGỮ
Lý thuyết
1.1.1 Cách cài đặt Ubuntu, Vim và Perl
Bước 1 Cài ứng dụng Ubuntu trên Windows 10
+ Start → Turn Windows features on or off → Windows Subsystem for Linux
+ Start → Store → Ubuntu → Get → Launch
Bước 2 Cài đặt Perl và Vim trên Ubuntu
+ Sudo apt-get install perl
+ Sudo apt-get install vim
+ Sudo apt-get install vimtutor
Bước 3 Vimtutor để học cách sử dụng Vim.
Sử dụng các phím h, j, k, l để điều hướng con trỏ trong Vim: h để di chuyển sang trái, j xuống dưới, k lên trên và l sang phải Nếu bạn không chắc chắn về thao tác, hãy nhấn phím ESC và nhập lại Để thoát khỏi Vim, nhấn phím ESC, sau đó gõ :q! và nhấn ENTER.
Nhấn phím x để xoá ký tự nằm dưới con trỏ.
Nhấn phím i để chèn thêm văn bản vào trước con trỏ.
Nhấn phím a để thêm văn bản.
Để lưu và thoát trong chế độ soạn thảo, sử dụng lệnh :wq Để xoá từ bắt đầu từ con trỏ đến từ tiếp theo, dùng lệnh :dw; để xoá từ con trỏ đến cuối hàng, sử dụng :d$ Nếu bạn muốn xoá toàn bộ một hàng, hãy dùng lệnh :dd Để lặp lại một chuyển động, thêm số vào trước lệnh, ví dụ :2w để lặp lại hai lần.
Format để thay đổi câu lệnh: operator [number] motion
+ operator: là lệnh cần thực hiện
+ number: là số lần lặp lại 6 download by : skknchat@gmail.com
Trong việc di chuyển qua văn bản, bạn có thể sử dụng các lệnh như w để di chuyển đến từ tiếp theo và $ để đến cuối hàng Để quay về đầu hàng, sử dụng :0 Nếu bạn muốn hoàn tác hành động trước đó, hãy dùng :u, trong khi :U sẽ hoàn tác những thay đổi trên một hàng Để khôi phục văn bản đã bị xóa, sử dụng Ctrl+R và để dán văn bản đã xóa sau con trỏ, chỉ cần ấn p Để thay thế ký tự tại vị trí con trỏ, sử dụng r; ấn ce để thay đổi từ con trỏ đến cuối từ và c$ để thay đổi đến cuối hàng Cuối cùng, nhấn Ctrl + G để hiển thị vị trí và trạng thái của file.
+ G: di chuyển đến cuối file
+ Number G: di chuyển đến hàng số đã điền
+ gg: di chuyển đến hàng đầu tiên
Nhấn / để tìm một cụm từ theo sau một cụm từ
+ Tìm một cụm từ một lần nữa, nhấn n
Để tìm một cụm từ ngược lại, hãy nhấn N Nếu bạn muốn tìm cụm từ theo hướng lùi, hãy nhấn ? thay cho / Để trở về vị trí trước đó, giữ phím Ctrl và nhấn O, lặp lại để quay lại Để tiến tới, nhấn Ctrl + I.
Nhấn % trong lúc con trỏ đang ở (, [, { để tìm ra ), ], } phù hợp còn lại (dễ debug hơn) Thay thế mới cho cái cũ nhất trong một hàng, nhấn :s/old/new
Thay mới mới cho tất cả cái cũ trên một hàng, nhấn :s/old/new/g
Để thay thế những cụm từ giữa hai dấu #, bạn sử dụng lệnh :#,#s/old/new/g Để thay thế tất cả các lần xuất hiện trong một file, hãy dùng lệnh :%s/old/new/g Nếu bạn muốn được hỏi xác nhận sau mỗi lần thay thế, hãy thêm 'c' vào lệnh như sau :%s/old/new/gc.
:!command thi hành một câu lệnh
:w FILENAME: viết file Vim hiện tại với tên FILENAME v montion :w FILENAME: lưu những dòng được chọn trong file FILENAME
7 download by : skknchat@gmail.com
:r FILENAME: lấy lại đĩa FILENAME và đặt nó dưới vị trí con trỏ
Gõ o để mở một hàng dưới con trỏ và bắt đầu chế độ
Insert Gõ O để mở một hàng trên con trỏ Gõ a để chèn văn bản sau con trỏ
Gõ A để chèn văn bản sau hàng cuối cùng
Gõ e để di chuyển câu lệnh tới cuối từ y để sao chép văn bản, p để dán
Nhấn R in hoa để thay thế chế độ Replace cho đến khi phím được nhấn
Gõ “:set xxx” cài lựa chọn cho “xxx”
Bỏ trước “no” để một lựa chọn tắt: :set noic
Gõ :help hoặc nhấn F1 để mở cửa sổ trợ giúp Gõ :help cmd để tìm trợ giúp trên cmd
Gõ ctrl + W ctrl + W để nhảy đến một cửa sổ khác Gõ :q để đóng cửa sổ trợ giúp
Gõ : command, nhấn ctrl + D để nhìn những hoàn thành khả dụng, nhấn phím để sử dụng một hoàn thành
1.1.3 Lí thuyết chương trình hợp ngữ
Lưu dữ liệu theo byte, half, word.
Một ký tự được lưu trong 1 byte.
- Một số nguyên được lưu trong 1 word.
- Một lệnh được lưu trong 1 word.
+ Hệ thập phân: Viết bình thường (17)
- + Hệ thập lục phân: Thêm tiền tố 0x (0x11)
- Ký tự: Đặt trong cặp nháy đơn (‘d’)
Chuỗi: Đặt trong cặp nháy kép (“Integrated circuit”) hoặc (“d”)
- Có 32 thanh ghi đa dụng (từ 0->31) 8 download by : skknchat@gmail.com
Biểu diễn: Tiền tố $ theo sau là chỉ số hoặc tên ($2 hay $sp).
Thanh ghi Hi và Lo được dành riêng cho phép nhân và phép chia (mfhi , mflo).
- + $at dành cho Trình biên dịch hợp ngữ, $k0 và $k1 dành cho OS.
+ $gp, $sp, $fp, $ra dành cho các lệnh chuyên biệt, không nên sử dụng để lưu trữ tạm trong quá trình tính toán.
# Chú thích bằng ký tự #
.data # Khai báo dữ liệu ngay sau hàng này
# Khai báo dữ liệu text # Viết chương trình ngay sau hang này main: # Nhãn thể hiện bắt đầu chương trình
-[:]
+ var1: word 3# biến nguyên var1 có kích thước 1 word và giá trị là 3
+ arr1: byte ‘a’,’k’ # mảng arr1 có 2 phần tử, mỗi phần tử 1 byte
+ arr2: space 40# mảng arr2 có kích thước 40 byte liên tục
+ str1: ascciz “ahihi” # chuỗi str1 có kết thúc bởi null
Thực hành
1.2.1 Mô phỏng việc thực thi các lệnh
Bảng 1.1 – Chức năng của một số lệnh trong MIPS
STT LỆNH VÍ DỤ CHỨC NĂNG
1 add add $t1, $t2, $t3 Gán $t1 là tổng của giá trị tại $t2 và $t3
2 addi addi $t1, $t2, -100 Gán $t1 là tổng của giá trị tại $t2 và giá trị bất kỳ
3 addu addu $t1, $t2, $t3 Tương tự lệnh add, kết quả trả về là số không dấu
4 addiu addiu $t1, $t2, -100 Tương tự lệnh addi, kết quả trả về là số không dấu
5 sub sub $t1, $t2, $t3 Gán $t1 là kết quả phép trừ giữa giá trị tại $t2 và $t3
6 subu subu $t1, $t2, $t3 Tương tự lệnh sub, kết quả trả về là số không dấu
7 and and $t1, $t2, $t3 Gán $t1 là “and” của các giá trị luận lý tại $t2 và $t3
8 andi andi $t1, $t2, 100 Gán $t1 là “and” của giá trị luận lý tại $t2 & giá trị bất kỳ
9 or or $t1, $t2, $t3 Gán $t1 là “or” của các giá trị luận lý tại $t2 và $t3
10 nor nor $t1, $t2, $t3 Gán $t1 là “nor” của các giá trị luận lý tại $t2 và $t3 9
11 lw lw $t1, label Đưa giá trị của label vào thanh ghi $t1 ở kiểu word download by : skknchat@gmail.com
12 sw sw $t1, label Lưu giá trị kiểu word tại thanh ghi $t1 vào địa chỉ label
13 slt slt $t1, $t2, $t3 Nếu $t2 < $t3 thì $t1 = 1, nếu không thì $t1 = 0
14 slti slti $t1, $t2, - 100 Nếu $t2 < -100 thì $t1 = 1, nếu không thì $t1 = 0
15 sltu sltu $t1, $t2, $t3 Tương tự lệnh slt nhưng dùng quy tắc so sánh không dấu
16 sltiu sltiu $t1, $t2, -100 Tương tự lệnh slti nhưng dùng quy tắc so sánh không dấu
Gọi chức năng nhập xuất tuỳ thuộc theo giá trị của $v0 l
Bảng 1.2 – Ý nghĩa của các chương trình mẫu
$t1 = 5 li $t1, 5 var1 = $t1 sw $t1, var1 data array1[12], array1=&array1[0] array1: space 12
3 li $v0, 5 $v0 = 5 syscall Gọi syscall với chức năng đọc số nguyên
.data string1 = “Print this.\n\0” string1: asciiz “Print this.\n”
4 text $v0 = 4 main: li $v0, 4 $a0 = &string1 la $a0, string1 Gọi syscall với chức năng xuất chuỗi, syscall với $a0 chứa địa chỉ của chuỗi kết thúc bằng null
Bài tập
1.3.1 Khai báo chuỗi và xuất các chuỗi được khai báo a Đề bài:
Khai báo và xuất ra cửa sổ I/O 2 chuỗi có giá trị như sau:
10 download by : skknchat@gmail.com
Chuỗi 1: Chao ban! Ban la sinh vien nam thu may? b Sơ đồ giải thuật:-
Hình 1.1 – Sơ đồ giải thuật xuất chuỗi được khai báo c Chương trình:
data chuoi1: asciiz "Chao ban! Ban la sinh vien nam thu may?\n" chuoi2: asciiz "Hihi, minh la sinh vien nam thu 1 ^-^\n"
11 download by : skknchat@gmail.com
1.3.2 Biểu diễn chuỗi trên dưới bộ nhớ
Các chuỗi trên được mã hóa vào trong thanh ghi dưới dạng mã thập lục phân.
Hình 1.2 – Biểu diễn chuỗi dưới bộ nhớ
1.3.3 Xuất ra đúng chuỗi đã nhập a Đề bài:
Nhập chuỗi và xuất ra đúng chuỗi đã nhập Ví dụ:
Nhập: Truong Dai hoc Cong nghe thong tin - b Sơ đồ giải thuật:
Hình 1.3 – Sơ đồ giải thuật xuất đúng chuỗi đã nhập
12 download by : skknchat@gmail.com c Chương trình:
1.3.4 Tính tổng hai số nguyên được nhập từ bàn phím a Đề bài:
Nhập vào 2 số nguyên, sau đó xuất tổng của 2 số nguyên này. b Sơ đồ giải thuật:
(Lưu giá trị số nguyên thứ nhất)
(Lưu giá trị số nguyên thứ hai) (Tính tổng)
Hình 1.4 – Sơ đồ giải thuật tính tổng hai số nguyên nhập từ bàn phím
13 download by : skknchat@gmail.com c Chương trình:
0x00000005 addiu $2, $0, syscall add $5, $2,$0 addiu $2, $0, 0x00000005 syscall
14 download by : skknchat@gmail.com
CÁC CẤU TRÚC ĐIỀU KHIỂN
Lí thuyết
2.1.1 Cấu trúc if, if-else
- tiên thực hiện việc so sánh điều kiện Đầu+ So sánh bằng (a == b)
+ So sánh bé hơn, bé hơn hoặc bằng (a < b, a b, a >= b)
Nếu điều kiện đúng, thực hiện lệnh và có thể là đoạn lệnh ở bên trong, nếu sai thì không thực thi đoạn mã.
- Kiểm tra từng điều kiện để đưa vào trường hợp đúng tương ứng.
Có thể chuyển thành cấu trúc if, if-else.
Kiếm tra điều kiện, để quyết định có nhảy hay không, điều kiện không thỏa thì thoát.
Thực hành
Chuyển đoạn code trong bảng theo sau sang MIPS. if (i==j) f = g + h; else f = g – h;
(Với giá trị của i, j, f, g, h lần lượt chứa trong các thanh ghi $s0, $s1, $s2, $t0, $t1)
.text main: beq $16, $17, cong sub $18, $8, $9 j exit cong: add $18, $8, $9 exit:
15 download by : skknchat@gmail.com
Chuyển đoạn code trong bảng theo sau sang MIPS. int Sum = 0; for (int i = 1; i