Tính tổng hai số nguyên được nhập từ bàn phím...8 Chương 2... Nhập một mảng các số nguyên n phần tử...2 Chương 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
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 4 phím h, j, k, l để di chuyển con trỏ lần lượt qua trái, xuống, lên trên, qua phải.
- Khi nhập không chắc chắn, nhấn phím ESC rồi tiến hành nhập lại.
- Để thoát Vim, nhấn phím ESC, nhập :q! rồi nhấn phím 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.
- Sử dụng :wq để lưu và thoát.
- Để xoá từ con trỏ đến từ tiếp theo, sử dụng :dw
- Để xoá từ con trỏ đến cuối hàng, sử dụng :d$
- Để xoá một hàng, sử dụng :dd
- Để lặp lại một chuyển động, thêm vào trước nó một số :2w
- 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 vi
+ motion: là di chuyển qua văn bản để thao tác (w – word, $ – đến cuối hàng)
- Để di chuyển về đầu hàng, sử dụng :0 (:zero)
- Để hoàn tác hành động trước, sử dụng :u
- Để hoàn tác những thay đổi trên một hàng, sử dụng :U
- Để hoàn tác những gì đã bỏ, sử dụng tổ hợp phím Ctrl+R
- Để trở về văn bản vừa bị xoá: p, đặt những văn bản bị xoá sau con trỏ.
- Để thay thế ký tự tại chân con trỏ: r
- Ấn ce để thay đổi từ con trỏ đến cuối một từ.
- Ấn c$ để thay đổi đến cuối hàng.
- ctrl + G : hiển thị vị trí trong file 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ừ giống vậy ở hướng ngược lại, nhấn N
- Tìm cụm từ theo hướng lùi, nhấn ? thay cho /
- Để trở về từ nơi bạn nhấn: Ctrl + O (giữ Ctrl trong lúc nhấn o), lặp lại để trở về Nhấn Ctrl + I để tiến tớ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 2 hàng #, nhấn :#,#s/old/new/g
- Thay thế tất cả lần xuất hiện trong một file, nhấn :%s/old/new/g
- Để hỏi xác nhận sau mỗi lần thêm ‘c’, nhấn :%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 vii
- :r FILENAME: lấy lại đĩa FILENAME và đặt nó dưới vị trí con trỏ
- :r !dir: đọc output của lệnh dir 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”) viii
- Có 32 thanh ghi đa dụng (từ 0->31).
- 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 ix
8 andi andi $t1, $t2, 100 Gán $t1 là “and” của giátrịluậnlý tại $t2 & giátrịbấtkỳ
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
11 lw lw $t1, label Đưa giá trị của label vào thanh ghi $t1 ở kiểu word
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ươngtự lệnh slti nhưng dùng quytắcsosánhkhông dấu
17 syscal l Gọi chức năng nhập xuất tuỳ thuộc theo giá trị của $v0
Bảng 1.2 – Ý nghĩa của các chương trình mẫu
.text start: lw $t0, var1 li $t1, 5 sw $t1, var1 var1 = 23
.text start: la $t0, array1 li $t1, 5 sw $t1, ($t0) li $t1, 13 sw $t1, 4($t0) li $t1, –7 sw $t1, 8($t0) array1[12], array1=&array1[0]
$v0 = 5 Gọi syscall với chức năng đọc số nguyên
.data string1: asciiz “Print this.\n”
.text main: li $v0, 4 la $a0, string1 syscall string1 = “Print this.\n\0”
$a0 = &string1 Gọi syscall với chức năng xuất chuỗi, với $a0 chứa địa chỉ của chuỗi kết thúc bằng null x
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:
- Chuỗi 1: Chao ban! Ban la sinh vien nam thu may?
- Chuỗi 2: Hihi, minh la sinh vien nam thu 1 ^-^ b Sơ đồ giải thuật:
Hình 1.1 – Sơ đồ giải thuật xuất chuỗi được khai báo xi
(Xuất chuỗi thứ hai) c Chương trình:
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
- Xuất: Truong Dai hoc Cong nghe thong tin b Sơ đồ giải thuật: xii
data chuoi1: asciiz "Chao ban! Ban la sinh vien nam thu may?\n" chuoi2: asciiz "Hihi, minh la sinh vien nam thu 1 ^-^\n"
text main: lui $1, 0x00001001 ori $4, $1, 0x00000000 addiu $2, $0, 0x00000004 syscall lui $1, 0x00001001 ori $4, $1, 0x00000029 addiu $2, $0, 00000004 syscall
Hình 1.3 – Sơ đồ giải thuật xuất đúng chuỗi đã nhập 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: xiii
text main: lui $1, 0x00001001 ori $4, $1, 0x00000000 addiu $5, $0, 0x00000064 addiu $2, $0, 0x00000008 syscall addiu $2, $0, 0x00000004 syscall
Hình 1.4 – Sơ đồ giải thuật tính tổng hai số nguyên nhập từ bàn phím c Chương trình: xiv
(Lưu giá trị số nguyên thứ nhất)
(Lưu giá trị số nguyên thứ hai)
text main: addiu $2, $0, 0x00000005 syscall add $5, $2, $0 addiu $2, $0, 0x00000005 syscall add $6, $2, $0 add $4, $5, $6 addiu $2, $0, 0x00000001 syscall
CÁC CẤU TRÚC ĐIỀU KHIỂN
Lí thuyết
2.1.1 Cấu trúc if, if-else
- Đầu tiên thực hiện việc so sánh điều kiện
+ 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.
(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) Trả lời: xv if (i==j) f = g + h; else f = g – h;
text main: beq $16, $17, cong sub $18, $8, $9 j exit cong: add $18, $8, $9 exit:
Chuyển đoạn code trong bảng theo sau sang MIPS.
(Với giá trị của i, N, Sum lần lượt chứa trong các thanh ghi $s0, $s1, $s2)
Bài tập
2.3.1 Phân biệt ký tự nhập vào và xuất ký tự liền trước, liền sau. a Đề bài:
Nhập một ký tự từ bàn phím và thực hiện theo yêu cầu.
Chương trình cho phép ký tự nhập vào chỉ gồm ba loại: số, chữ cái in thường và chữ cái in hoa Khi ký tự được nhập vào, chương trình sẽ nhận diện và hiển thị loại ký tự tương ứng: nếu ký tự là một chữ số, chữ cái in thường hoặc chữ cái in hoa thì xuất ra loại tương ứng; nếu ký tự nhập không thuộc ba loại trên thì hiển thị thông báo "invalid type".
Xuất ra cửa sổ ký tự liền trước và liền sau của ký tự nhập vào.
Nhap ky tu: b Chu thuong
Ky tu sau: c b Sơ đồ giải thuật: xvi int Sum = 0; for (int i = 1; i