Tin học cơ bản

Học tập, chia sẻ kiến thức cơ bản về tin học.

Hiển thị các bài đăng có nhãn Phat trien he thong. Hiển thị tất cả bài đăng

LẬP TRÌNH ASSEMBLY TRÊN VI XỬ LÝ 8088/8086


1. Giới thiệu về Hợp ngữ:

Hợp ngữ (Assembly) là một ngôn ngữ lập trình cấp thấp, nó thực chất là dạng gợi nhớ (Mnemonic), hay dạng kí hiệu, của ngôn ngữ máy.

Như đã biết, lệnh ngôn ngữ máy là một dãy các con số 0, 1 nên rất khó đọc và khó lập trình, vì thế các nhà thiết kế vi xử lý đã đưa ra tập lệnh hợp ngữ gần với ngôn ngữ tự nhiên hơn nên dễ đọc và dễ lập trình hơn. Tuy vậy, các lệnh hợp ngữ vẫn giao tiếp với phần cứng máy tính một cách rất chặt chẽ, nhờ đó việc tiếp cận với lập trình hợp ngữ giúp chúng ta hiểu rõ hơn về kiến trúc và tổ chức hoạt động của máy tính.

Ngoài ra nó còn giúp chúng ta thấy rõ hơn mối quan hệ giữa các thành phần chức năng bên trong máy tính và hệ điề hành. Có thể nói ngược lại là, việc tìm hiểu và lập trình trên hợp ngữ giúp chúng ta hiểu rõ hơn về kiến trúc máy tính, tổ chức hoạt động bên trong máy tính và hệ điều hành.

Trong giới hạn của tài liệu này chúng ta chỉ tìm hiểu tập lệnh hợp ngữ của các vi xử lý họ Intel 8088/8086, để  lập trình chạy trên các máy IBM-PC: Sử dụng họ vi xử lý này và hoạt động trong sự phối hợp với hệ điều hành MS_DOS.

Một trong những đặc điểm của hợp ngữ là chương trình viết trên nó có kích thước nhỏ hơn và tốc độ nạp/thực hiện chương trình nhanh hơn so với viết (chương trình cùng chức năng) trên các ngôn ngữ lập trình bậc cao.

Ngoài ra, hầu hết các ngôn ngữ lập trình bậc cao hiện nay đều cho phép viết (“nhúng”) mã lệnh hợp ngữ trong nó. Điều này giúp người lập trình khai thác tối đa thế mạnh của các ngôn ngữ lập trình, hợp ngữ rất mạnh trong các thao tác can thiệp sâu vào các thành phần bên trong hệ thống, trong khi đó ngôn ngữ bậc cao mạnh trong các thao tác xử lý dữ liệu và thiết kế giao diện. Như vậy sẽ là rất thuận lợi nếu sử dụng ngôn ngữ bậc cao để viết chương trình xử lý thông tin hệ thống, khi đó nhiệm vụ truy xuất hệ thống (thanh ghi, bộ nhớ, cổng vào/ra, thiết bị,...) để lấy dữ liệu sẽ được giao cho các đoạn mã lệnh hợp ngữ được nhúng trong chương trình này.

Hợp ngữ hỗ trợ 2 chế độ tương tác hệ thống: (1) Nhập trực tiếp từng lệnh/đoạn lệnh vào bộ nhớ rồi cho phép thực hiện ngay trên bộ nhớ mà không cần qua bước biên dịch chương trình. Chương trình gỡ rối Debug (đi kèm hệ điều hành MS_DOS: Debug.exe) là một trong những chương trình hỗ trợ chế độ này cho hợp ngữ 16 bít; (2) Viết chương trình hợp ngữ, rồi sau đó sử dụng các chương trình biên dịch để dịch nó sang chương trình thực thi (dạng EXE hoặc COM) và cho thực hiện chương trình này.

Hiện nay có hai loại trình biên dịch được sử dụng để biên dịch chương trình hợp ngữ (từ tập lệnh hợp ngữ của các vi xử lý họ Intel) sang chương trình thực thi: Trình biên dịch hợp ngữ 16 bít, MASM (Macro Assembler), được sử dụng để dịch thành các chương trình chạy trên nền hệ điều hành 16 bít MS_DOS; Trình biên dịch hợp ngữ 32 bít, MASM32 (Macro Assembler 32 bít), được sử dụng để dịch thành các chương trình chạy trên nền hệ điều hành 32 bít MS_Windows. Trong thực tế, để chuyển một chương trình hợp ngữ sang dạng chương trình thực thi EXE 16 bít hoặc COM 16 bít thì cần phải có sự hỗ trợ của chương trình tiện ích của hệ điều hành MS_DOS: Link (Link.exe) và EXE2Bin (EXE2Bin.com).

Chương trình hợp ngữ 16 bít sử dụng hệ thống các ngắt mềm (Interrupt) của BIOS và DOS như là thư viện lập trình của nó, trong khi đó chương trình hợp ngữ 32 bít sử dụng tập hàm API làm thư viện lập trình của nó.

2. Biến – Hằng trong chương trình hợp ngữ:

Biến và hằng

Biến và hằng (hằng có tên) trong chương trình hợp ngữ có tính chất, mục đích sử dụng, kiểu dữ liệu, quy tắc đặt tên, quy tắc gán giá trị,... tương tự như biến và hằng trong các ngôn ngữ lập trình bậc cao khác. Biến trong chương trình hợp ngữ chỉ có các kiểu dữ liệu là: Byte, Word, Doubleword,... và hằng trong chương trình hợp ngữ có thể là số, kí tự hoặc một xâu kí tự.  

Khi viết chương trình hợp ngữ chúng ta cần quan tâm đến địa chỉ của biến trong bộ nhớ. Một biến được khai báo trong chương trình sẽ được hệ thống gán cho một địa chỉ trong bộ nhớ (khi chương trình được nạp vào bộ nhớ để hoạt động). Cụ thể: mỗi biến trong chương trình sẽ được định vị tại một địa chỉ xác định trong bộ nhớ, và các biến được khai báo liên tiếp nhau trong chương trình (từ trên xuống dưới) sẽ được định vị tại các địa chỉ liên tiếp nhau trong bộ nhớ (từ offset thấp đến offset cao). Nhờ đó, nếu chương trình xác định được địa chỉ của một biến nào đó thì nó dễ dàng có được địa chỉ và nội dung của các biến khác trong chương trình.

Khác với biến, hằng trong chương trình hợp ngữ không được cấp phát bộ nhớ để lưu trữ, tức là, nơi nào trong chương trình chứa trên hằng thì sẽ được trình biên dịch thay bằng giá trị của nó một cách trực tiếp.

Hợp ngữ cung cấp các toán tử giả để định nghĩa/khai báo dữ liệu: DB (định nghĩa byte), DW (định nghĩa word), DD (định nghĩa doubleword),.... Và toán tử EQU để khai báo hằng. Biến có thể được khai báo ở đầu hoặc ở cuối chương trình. Trong khi đó, hằng có thể khai báo ở bất kỳ nơi đâu trong chương trình, khi đó ta có thể sử dụng toán tử dấu “=” để gán giá trị cho hằng.    

Khai báo biến – hằng:

Cú pháp khai báo:          

a:        <Tên biến>    DB       <Trị khởi tạo>        
b:        <Tên biến>    DW      <Trị khởi tạo>        
c:         <Tên biến>    DD      <Trị khởi tạo>        
d:        <Tên hằng>   EQU    <Hằng số>
            Trường hợp a được sử dụng để khai báo biến kiểu byte, trường hợp b được sử dụng để khai báo biến kiểu word, trường hợp c được sử dụng để khai báo biến kiểu doubleword, trường hợp d được sử dụng để khai báo hằng. <Trị khởi tạo> có thể một hoặc nhiều giá trị, nó có thể là một số, một kí tự hoặc một xâu kí tự, và cũng có thể là một dấu hỏi chấm (“?”). <Hằng số> có thể là một số, một kí tự hay một xâu kí tự.

Ví dụ 1:          
Spt                 DB      0
KiTu               DB      ‘a’
TieuDe           DB      ‘Tin hoc’
SoNguyen      DW     ?
DaySo           DD      1020, 1345, 2389, 5763
Trong ví dụ trên, hai biến Spt và Kitu đều là biến kiểu byte, kích thước 1byte. Biến TieuDe cũng là biến kiểu byte nhưng gồm 7 byte ô nhớ liên tiếp (kích thước 7 byte), mỗi byte chứa 1 kí tự ASCII. Biến SoNguyen là biến kiểu word, chưa được gán giá trị khởi tạo. Biến DaySo là biến kiểu doubleword, gồm 4 phần tử có giá trị lần lượt (từ thấp đến cao) là: 1020, 1345, 2389, 5763.

[Lập trình Windows] Kiến trúc ADO.NET

1. Kiến trúc ADO.NET

Kiến trúc ADO.NET - tinhoccoban.net


Kiến trúc ADO.NET - tinhoccoban.net


Kiến trúc ADO.NET khá đơn giản, bao gồm các thành phần, Máy chủ dữ liệu (Database Server), Lớp Connection, lớp Command, Lớp DataAdapter, Lớp Dataset.
Trong lớp SqlConnection, quan trọng là thuộc tính kết nối. SqlCommand có các thuộc tính quan trọng như kiểu lệnh: lênh viết trực tiếp, lệnh được gọi ra từ trong các thủ tục.

2. Ứng dụng hiển thị dữ liệu trong bảng Categories trên form frmCategories.
-  FrmMain có thêm menu để khi click vào thì chuyển sang frmCategories.

Menu chuyển sang form frmCategories - tinhoccoban.net

- FrmCategories

FrmCategories - tinhoccoban.net

Thủ tục hiển thị nội dung quan hệ Categories.

1.  USE [Northwind]
2.  GO
3.  /****** Object:  StoredProcedure [dbo].[sp_SelectAllCategories]    Script Date: 12/6/2016 6:14:31 PM ******/
4.  SET ANSI_NULLS ON
5.  GO
6.  SET QUOTED_IDENTIFIER ON
7.  GO
8.  -- =============================================
9.  -- Author:           <Hoangtn>
10. -- Create date: <06/12/2016,,>
11. -- Description:      <Xem dữ liệu trong bảng Categories,,>
12. -- =============================================
13. ALTER PROCEDURE [dbo].[sp_SelectAllCategories] 
14. AS
15. BEGIN
16.    select * from Categories
17.        -- SET NOCOUNT ON added to prevent extra result sets from
18.        -- interfering with SELECT statements.
19.        SET NOCOUNT ON;
20.  
21.     -- Insert statements for procedure here
22.       
23. END
24.  
25.                         

Viết code cho nút Hiển thị.
1.  private void btnHienthi_Click(object sender, EventArgs e)
2.          {
3.              //Tạo biến kết nối CSDL
4.              SqlConnection Conn = new SqlConnection(StrConn);
5.              DataSet ds = new DataSet();
6.              //Tạo biến lệnh SqlCommand
7.              SqlCommand sqlcomm = new SqlCommand();
8.              //Dùng biến kết nối Conn ở trên.
9.              sqlcomm.Connection = Conn;
10.             //khai báo sử dụng thủ tục
11.             sqlcomm.CommandType = CommandType.StoredProcedure;
12.             //gán tên thủ tục sử dụng
13.             sqlcomm.CommandText = "sp_SelectAllCategories";
14.             SqlDataAdapter sda = new SqlDataAdapter(sqlcomm);
15.             sda.Fill(ds);
16.             //hiển thị dữ liệu lên datagridview
17.             dgvCategories.DataSource = ds.Tables[0];18.             
19.             
20.                                }

3. Kết quả chạy chương trình:
- Bước 1 kết nối:

- Bước 2 chọn menu categories.
- Bước 3 Trong form frmCategories nhấn vào nút hiển thị ta có kết quả:
Hiển thị kết quả sau khi nhấn nút Hiển thị - tinhoccoban.net


[Lập trình Windows] Truyền chuỗi kết nối từ form frmConnection sang frmMain

Tạo form frmConnection, frmMain.
Trên form frmConnection nhập các thông tin kết nối cơ sở dữ liệu, và truyền thông tin kết nối tới form frmMain
STT
Tên điều khiển
Kiểu điều khiển
Form
1
txtServer
Textbox

2
txtDatabase
Textbox

3
txtUserID
Textbox

4
txtPassword
Textbox

5
btnTest
Button

6
btnOK
Button

7
lblThongbao
Label


Sau khi nhập thông tin vào trong các ô texbox, nếu nhấp nút Test Connection thì: nếu chương trình kết nối thành công với cơ cơ sở dữ liệu thì xuất hiện dòng chữ Connection successful và nếu không kết nối được thì sẽ xuất hiện dòng chữ Connection fail. Try again
Tạo một phương thức nhận thông tin cơ sở dữ liệu sẽ kết nối trong file frmConnection.cs
/// <summary>
        /// Phương thức này dùng để tạo ra thông tin trên chuỗi kết nối.
        /// </summary>
        void getconectionstring()
        {
            sqlConn = "";
            sqlConn += "Server="+txtServerName.Text.Trim().ToString() + ";";
            sqlConn +="database = "+ txtDatabase.Text.Trim().ToString() + ";";
            sqlConn +="User ID ="+ txtUserID.Text.Trim().ToString() + ";";
            sqlConn += "Password="+txtPassword.Text.Trim().ToString();           
        }
 
Form kết nối cơ sở dữ liệu - tinhoccoban.net
Form kết nối cơ sở dữ liệu
Viết code cho sự kiện click vào nút btnTest trên form frmConnection
private void btnTestConnection_Click(object sender, EventArgs e)
        {
            SqlConnection conn = new SqlConnection();
            getconectionstring();
            conn.ConnectionString = sqlConn;
            try { conn.Open(); }
            catch { MessageBox.Show("Fail "); }
        
            if (conn.State == ConnectionState.Open)
            {
                lblMessage.ForeColor = Color.Blue;
                lblMessage.Text = "Connection seccessful";
            }
            else {
                lblMessage.ForeColor = Color.Red;
                lblMessage.Text = "Connection fail. Try again";
            }           
        }

Viết code cho sự kiện click vào nút btnOK trên form frmConnection
private void btnOK_Click(object sender, EventArgs e)
        {                  
            frmMain frm = new frmMain(sqlConn);
            frm.ShowDialog();
        }

Lưu ý trong frmMain phải có phương thức khởi dựng sau:
string SqlConn;
public frmMain(String sqlConn)
        {
            SqlConn = sqlConn;
            InitializeComponent();
        }

Form frmMain - tinhoccban.net
Form chính trong ứng dụng

Như vậy, chuỗi kết nối được truyền từ frmConnection sang frmMain. Tất nhiên rằng, nếu chuỗi này không đúng thì nó vẫn cứ truyền sang frmMain, do vậy trước khi click OK nên kiểm tra trước xem chuỗi kết nối đó có thành công hay không?

Từ form frmMain, chuỗi kết nối này sẽ được truyền đến các form con của nó theo cùng một cách khi truyền chuỗi kết nối từ form frmConnection sang form frmMain.
Tiếp theo: Kiến trúc ADO.NET.

[Hệ thống thông tin] Phân tích nghiệp vụ hệ thống quản lý dự án.

Hệ thống quản lý dự án rất phức tạp vì nó liên quan đến nhiều nghiệp vụ, liên quan đến nhiều người, từ người quản lý dự án đến người làm trực tiếp.
Phân tích thiết kế hệ thống quản lý dự án - tinhoccoban.net
Phân tích nghiệp vụ quản lý dự án CNTT

Trong quá trình quản lý dự án, tạm chia 3 đối tượng sẽ thực hiện luồng công việc.
- PM là người quản lý dự án, người này sẽ quản lý tất cả các dự án.
- System: là hệ thống.
-PM1 là người quản lý 1 dự án nào đó.
PM sẽ khởi tạo ra dự án, lên danh sách người tham gia, viết kế hoạch dự án tổng thể cho các dự án, đánh giá kết quả làm việc, điều chỉnh, cho kết thúc dự án.
PM1 là người sẽ điều hành phát triển một dự án, lên kế hoạch chi tiết cho dự án đó và báo cáo thường xuyên trạng thái của dự án.

[Lập trình Windows] Viết ứng dụng nhiều Form

Ứng dụng nhiều form là 1 chương trình có sử dụng nhiều form, giữa các form có truyền giá trị cho nhau.
Ví dụ 1. Form 1 có mô tả như sau:


STT

Tên điều khiển

Kiểu điều khiển

Giá trị mặc định

1

label1

Label

FORM ĐẦU
TIÊN NHẬP DỮ LIỆU

2

label2

Label

Họ tên

3

txtHoVaTen

Texbox



5

btnOK

Button

OK

6

btnKiemtra

Button

Kiểm tra
Form 1 được thiết kế như sau:
Form 1- tinhoccoban.net
Form1 được thiết kế
Form 2 chỉ gồm 1 textbox là txthovaten, được thiết kế như sau:
Form 2 - tinhoccoban.net

Viết code:
Trong phương thức khởi dựng mặc định của Form 2 ta sửa lại như sau:
------------------------------------------------------------------------
 string str;
        public Form2(TextBox txt)
        {
            InitializeComponent();
            str = txt.Text;
        }
-----------------------------------------------------------------------------
Viết code cho sự kiện load form cho Form2:
-------------------------------------------------------------------------------
  private void Form2_Load(object sender, EventArgs e)
        {
            txtHovaten.Text = str;
        }
-------------------------------------------------------------------------------
Khi người dùng click vào nút OK trên Form1 thì giá trị trong txtHovaten của form 1 sẽ được gán cho giá trị của txtHovaten của form 2.
------------------------------------------------------------------------------
private void btnOK_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2(txtHoVaTen);
            f2.ShowDialog();
        }
------------------------------------------------------------------------------
Tham khảo: Giải bài toán cộng 2 số theo mô hình 3 lớp.
phần tiếp theo: Truyền chuỗi kết nối từ frmConnection sang form frmMain