A Challengers Handbook - General considerations

Chung chung

Tôi đã giải quyết các thử thách và hầu hết tôi không giữ lại ghi chú về các giải pháp. Chỉ gần đây khi tôi bắt đầu viết xuống và giữ lại các ghi chú cho các thử thách. Lợi thế của việc này là rất lớn. Tôi đã hoàn thành 40 thử thách trên một site và không ghi chú. Sau đó ở trình độ mới cái mà yêu cầu 40 cái trước và ghi xuống một ký tự đã được thêm ở cuối mỗi giải pháp. Vào một lần khác tôi đã giải quyết được vài thử thách và nhìn thấy chính xác các vấn đề đó trên một site khác, nhưng tôi lại quên mất cách đã giải quyết lần trước. … Vì thế tôi hi vọng bạn sẽ giữ lại ghi chú về các thử thách bạn đã giải.

Một vài lời khuyên khi bạn thực sự stuck ở đâu đó. Bạn gặp phải một vấn đề và bạn thực sự không tìm thấy bất kỳ cách nào để thử tiếp. Đây là những thứ tốt nhất mà bạn theo:

  • Đợi vài ngày, hãy nghỉ ngơi và sau đó trở lại với một đầu óc tỉnh táo và bắt đầu lại.
    Luôn luôn xem kỹ html source. Chọn tất cả các thứ và ghi chú nếu có điều gì lạ trong mã nguồn. Tôi đã biết các tin nhắn mã hóa trong các tabs và khoảng trắng của mỗi dòng trước khi phân tích cẩn thận. Ghi lại tất cả các script names, và tất cả các pathnames. Nhìn vào bất kỳ cái gì không theo thứ tự. Có thể bạn sẽ tìm thấy những cái như /level1/level2/index.html và nó refer tới images/blah.jpg. Tại sao lại có một thư mục hình ảnh trong level2, hay bất kỳ thứ gì khác?

  • Đọc các comments hiển thị một cách cẩn thận, chúng cung cấp các đầu mối? Tìm kiếm trên google? Suy nghĩ cẩn thận về cái mà bạn tìm thấy và thứ các từ khóa.

  • Tự hỏi bản thân điều gì khiến level này khác với các level khác. Hiện tại Tôi kết thúc một level trên một site và đi tiếp sang cái tiếp theo. Tôi phải nhìn lại xem tên nhiệm vụ khác gì so với cái trước. Tìm trên google về các tên và đoán.

  • Thường xuyên bạn sẽ nhận được các trang html được viết bằng tay trong số rất nhiều các chương trình được generated và đây là quà tặng thực sự. Các code viết tay thường khéo léo và nhỏ. Các đoạn code được generated là một đống lộn xộn. Nếu bạn xem xét kĩ source html, bạn sẽ nhận ra được những khác biệt.

  • Đọc forums. Các sites có forums đọc chúng. Đọc tất cả mọi thứ, thường có các hints tìm thấy trong các bài viết, câu hỏi của mọi người.

  • Nhìn xung quay site. Tôi sẽ đi thẳng vào levels nơi mà bạn thực sự stuck nhìn xem có có links hay downloads nào được ẩn trong challenge nơi nào khác trong site.

Đây là nơi tốt để gợi nhắc bạn một vài công cụ thường ngày được nhiều người sử dụng. Ngày này mọi người thường nói những thứ như “hey I am a Linux user, what about us”? Thật thà mà nói đây là ý kiến của tôi: Tôi sử dụng windows, tôi không thích Linux, trong khi những người dùng bình thường những người thường sử dụng Linux dường như thích cách khó. Họ thích đọc các manuals và họ thích command line tools. Họ thích viết các scripts và họ cài đặt trên hệ điều hành của họ, compiling kernels và làm rối tung mọi thứ. Câu hỏi của tôi là “Bạn đang làm gì vậy”? Vì vậy mà nói, các công cụ tôi nói sẽ là các windows tools, chúng có thể có trên các hệ điều hành khác( và nếu bạn là Mac user thì xin lỗi, …):

  • Một good text editor/multi-purpose editting program. Wordpad là rát rưởi, Notepad cũng lộn xộn, chúng ta cần một cái có thể đọc được nhiều hơn 64k. Lựa chọn của tôi là Ultraedit. UE sẽ tự phát hiện Unix format file và hỏi bạn có muốn chuyển đổi nó khi bạn tải nó. UE là nhanh, UE sẽ sắp xếp, chuyển đổi hiển thị theo dạng hex, syntax highlighting rất nhiều ngôn ngữ từ C tới Perl, so sánh file và formatting phức tạp các macros và tất cả các thứ.

  • Một good hexeditor. Tôi sử dụng Hex Workshop. Tôi đã sử dụng nó trong nhiều năm và tôi thích nó. Nó sẽ làm nhiều thứ tôi mong muốn ở một hexeditor như chỉnh sửa các bytes,… Nó cũng sẽ xors; xoay, … so sánh. Khi bạn thực sự muốn tạo một file bạn cần một hex editor.

  • Một ngôn ngữ. Bạn cần lập trình với ít nhất một ngôn ngữ. Nó sẽ giúp bạn nhiều trong các thử thách. Lựa chọn của tôi là C, và tôi sử dụng MSVC và Borland phụ thuộc vào tính tình của tôi. Đó không phải là tất cả bởi về tôi có thể sử dụng một vài thứ như VBA/Excel, Maple, ASM hay bất kỳ ngôn ngữ nào tôi đã sử dụng và biết trong quá khứ. Học một cái và chuyển qua cái tiếp theo bạn sẽ có 10 lần dễ hơn để học.

    Một numbẻ cruncher. Đây không phải là công cụ thường dùng để … và một vài người sẽ … Tôi đã học Pure Maths và sau đó là MSc vì thế tôi thích có một vài number cruncher/symbolic manipulation program có sẵn cho tôi. Tôi đã mua Maple và tôi học nó. Tôi sử dụng Maple cho nhiều vấn đề.

A Challengers Handbook - 1 Choose Your Destination

Giới thiệu

Các challenge sites ngày nay có mặt ở khắp nơi, về nội dung cơ bản là giống nhau. Trong sách này tôi định đưa cho bạn vài hints và típ cho việc giải quyết các thứ thách đó trong tầm hiểu biết của tôi, tôi sẽ không đưa bạn lời giải cho các site đó, nhưng tôi sẽ chỉ bạn các kĩ thuật mà tôi sử dụng để giải quyết các vấn đề này. Bạn có thể coi đây như là một crash course cho việc giải quyết các vấn đề.

Rất nhiều sites chia các vấn đề thành các danh mục khác nhau. Site này cũng thế bạn có thể bỏ qua và đi thẳng vào một số mục mà bạn quan tâm, nhưng tốt hơn nên nhớ rằng mọi thứ đều có thể vượt qua được. Nếu bạn là hoàn toàn chưa biết gì trong các mục này, hay bạn chỉ cần làm mới suy nghĩ thì bạn sẽ thích đọc tất cả.

Các trang dưới sẽ tập trung vào giới thiệu vào giới thiệu về lĩnh vực đó, điều đó đủ để bạn bắt đầu, từ đó hãy chinh phục các thử thách, học các thứ khác. Mục đích của các trang web là giúp bạn học từ các thử thách, nhưng thực tế bạn sẽ chẳng học được gì nhiều nếu chỉ nhìn chằm chằm vào các biểu thức trống rỗng từ trang web không có gì ngoài javascipt và steganography (không hiểu);

Tôi không tập trung vào giới thiệu vào một công cụ nào cả, tôi sẽ nhắc tới nhiều các công cụ hữu dụng. Tôi tin rằng bạn có kinh nghiệm và sẽ tự tìm thấy công cụ hữu dụng của riêng mình, tôi sẽ gửi bạn các công cụ mà tôi yêu thích và sử dụng

General considerations
Javascript
Applets
Flash (SWF)
Encryption
Logic
Programming
Cracking
Hidden
Internet
Steganography
Linux/Unix
Exploits

UNIX network programming volumn 1: 1 Introduction

Giới thiệu

Khi viết các chương trình để giao tiếp thông qua mạng máy tính, đầu tiên ta cần một giao thức, để thỏa thuận cách các chương trình sẽ giao tiếp với nhau. Trước khi đào sâu vào thiết kế chi tiết của một giao thức.

UNIX network programming volumn 1: foreword

Lời tựa

Khi cuốn sách này được phát hành vào năm 1990, nó nhanh chóng được các lập trình viên đón nhận như là tài liệu để học về lập trình mạng. Kể từ đó, nghệ thuật lập trình mạng đã thay đổi.

Ngày nay, mạng UUCP đã không còn nữa và các kỹ thuật mới nhưng mạng không dây trở có mặt ở khắp nơi. Với sự thay đổi này, các giao thức mạng mới và mô hình lập trình đã phát triển. Nhưng, những lập trình viên lại thiếu các nguồn tài liệu để học các kĩ thuật mới.

Cuốn sách này sinh ra để điền vào chỗ trống đó.

Giới thiệu

Cuốn sách này dành cho nhữn người muốn viết các chương trình có thể giao tiếp với những chương trình khác sử dụng một API hay còn gọi là sockets. Một số bạn đọc đã quen với sockets rồi, sẽ biết sockets là đồng nghĩa với lập trình mạng. Một số bạn cần được giới thiệu lại về sockets từ đầu. Mục đích của sách là hướng dẫn từ những người mới bắt đầu tới những chuyên gia, cho những người đã …

Dich sach Building Scabable Web Sites Chương 1

Chương 1 Giới thiệu

Trước khi chúng ta đi sâu vào thiết kế và lập trình, chúng ta cần lùi lại một bước và định nghĩa một số thuật ngữ. Chúng ta đang muốn làm gì và khác gì với những thứ chúng ta đã làm trước đây? Nếu bạn đã xây dựng vài ứng dụng web, bạn có thể chuyển ngay sang chương tiếp theo (Nơi chúng ta sẽ đi vào một chút lý thuyết(nerdier))m nhưng nếu bạn thích việc xem chút tổng quan thì hãy bắt đầu từ trang này.

Web application là gì?

Nếu bạn đang đọc sách này, bạn có thể sẽ có khái niệm về ứng dụng web là gì, nhưng nó chưa thực chính xác. Một ứng dụng web không phải là một web site cũng không phải là một ứng dụng theo nghĩa là ứng dụng desktop. Một ứng dụng web là kết hợp cả hai.

Trong khi một website bao gồm các trang của dữ liệu, một ứng dụng web bao gồm dữ liệu được chia ra bởi các cơ chế. Trong khi người dùng web thích việc chia thành html vs css, web application designer thích việc chia dữ liệu: dữ liệu trong web application không làm gì với markup(mặc dù chúng có thể chứa markup). Chúng ta lưu trữ các tin nhắn tách biệt với markup. Đến khi muốn hiển thị dữ liệu tới người dùng, chúng ta sẽ lấy tin nhắn từ nơi lưu trữ dữ liệu (thường là csdl) và chuyển dữ liệu tới cho người dùng (điển hình là HTML thông qua HTTP). Chúng ta không nhất thiết phải chuyển dữ liệu sử dụng HTML, chúng ta có thể chuyển PDF qua email.

Web applications không có các trang theo cách các web site làm. Trong khi một web application chỉ có 10 trang, thêm dữ liệu vào đã lưu trữ và tăng các trang không cần thêm các trang hay source code. Với các tính năng search, nhập vào từ người dùng, một ứng dụng web có thể có số lượng trang không giới hạn mà không cần phải tạo các trang HTML. Một tập template nhỏ và chút logic cho phép chúng ta có thể tạo ra trang on the fly dựa vào các tham số từ URL hoặc POST data.

Đối với người dùng, ứng dụng web là không khác gì với một web site bình thường. Một blog đơn giản, chúng ta không thể đâu là trang được tạo ra từ dữ liệu hay được viết như một trang HTML tĩnh. Phần mở rộng file có thể giúp ta phân biệt được, nhưng cũng có thể làm giả được điều đó. MỘt ứng dụng web thường giống như một trang cho phép người dùng nhập dữ liệu. Điều này là thông thường, khong phải luôn luôn là thông qua giao diện HTML, nhưng có thể chỉ đơn giản là thông qua ứng dụng desktop để sửa dữ liệu trực tiếp hoặc remote.

Với AJAX, trước đây được coi như là remote scripting hay “remoting”, mô hình thao tác trên ứng dụng web đã được mở rộng, Trong quá khứ, người dùng thao tác với ứng dụng web sử dụng page-based model. Một người dùng gửi yêu cầu về trang web từ server, gửi lên các thay đổi thông qua HTTP POST, và nhận về một trang mới, xác nhận thay đổi hoặc xem dữ liệu đã thay đổi. Với Ajax, chúng ta có thể gửi dữ liệu đã thay đổi in the background mà không cần thay đổi trang người dùng trên đó, như là tương tác với giao diện desktop application.

Web application thay đổi một cách chậm chạp. Với ứng dụng giống như Google Gmail và Microsoft Office Live, chợ ứng dụng đã chuyển được điểm tốt của ứng dụng desktop lên môi trường web kết hợp với lợi ích của wbe applications. Trong khi ứng dụng desktop giàu tương tác và nhanh chóng, ứng dụng web lại có khả năng nâng cấp với zero-effort, hoàn toàn portable data, giảm client requerement.

Vậy xây dựng web application như thế nào?

Để xây dựng một web applications, chúng ta cần tạo ít nhất 2 components: hardware platform và software platform. Với ứng dụng đơn giản, phần cứng chỉ đơn giản là một máy chủ chia sẻ một web server và một database. Ở mức nhỏ chúng ta không cần nghĩ về hardware như một component của ứng dụng của chúng ta, nhưng nó lớn lên, nó trở thành một phần quan trọng. Trong cuốn sách này sẽ nhìn cả 2 phía của application design và engineering, cách chúng ảnh hưởng đến nhau, và kết hợp chúng để tạo nên một kiến trúc hiệu quả.

Lập trình viên những người làm việc với small scale có thể hỏi rằng tại sao chúng ta lại phải lo lắng về “platform desigin”. Chúng ta tiết kiệm thời gian và tiền bạc để làm việc với các ứng dụng servicable. Vấn đề sẽ xảy ra ở mức lớn - không có công cụ nào cho phép bạn xây dựng những thứ giống Amazon hoặc Friendster. Trong khi với chức năng bình thường, nhưng những chức năng đó làm việc cho hàng triệu sản phẩm, hàng triệu người dùng, không yêu cầu quá nhiều về phần cứng để có thể customized và optimized chính xác những gì chúng ta cần. There’s a good reason why the largest applications on the Internet are all bespoke creations: no other approach can create massively scalableapplications within a reasonable budget.

Chúng ta đã nói về core của web applications, chúng ta có tập dữ liệu có thể truy cập và có thể sửa chữa. Chúng ta cần quyết định phải lưu trữ dữ liệu như nào (a schema), và làm sao có thể truy cập vào sửa chữa nó (business logic), và trình bày chúng tới người dùng của chúng ta (interaction logic). Trong chương 2, chúng t asex xem các phần khác nhau, cách chúng tương tác. Một thiết kế tốt làm việc từ dưới lên, từ kiến trúc phần mềm và phần cứng.

Cuốn sách này nhắm đến thiết kế và xây dựng một large scale applications. Tới cuối cuốn sách, bạn sẽ có những ý tưởng về thiết kế ứng dụng và kiến trúc của nó, và làm sao để mở rộng hệ thống và đi vào cài đặt chi tiết và thực hiện các thiết kế.

Kiếm trúc là gì?

Chúng ta thích nói về architecting application, nhưng nó thực sự là gì? Khi nào một kiến trúc sư thiết kế một ngôi nhà, anh ấy có một nhiệm vụ cụ thể: thu thập nguyên vật liệu, cân nhắc các lựa chọn và tạo ra bản blueprint. Khi xây dựng blueprint cho một ngôi nhà, chúng ta mong muốn vài thứ, ngôi nhà nên đặt ở đâu, tránh được giỏ mưa, đủ ánh sáng. Nhưng architecting application không giống như thế.

Để bắt đầu, nếu ngôi nhà giống phần mềm, kiến trúc sư phải tham gia vào tiến trình xây dựng, từ móng đặt nội thất. Khi anh ấy thiết kế và xây dựng nhà

Bắt đầu như thế nào?

Để bắt đầu thiết kế và xây dựng large-scale web application, bạn cần 4 thứ. Đầu tiên, bạn cần một ý tưởng. Đây là thứ khó nhất và không thường làm với vai trò kỹ sư. Trong khi các kĩ thuật và công nghệ trong sách có thể áp dụng cho ứng dụng nhỏ, chúng có thể optimal cho dự án lớn với sự tham gia của nhiều lập trình viên và nhiều người sử dụng. Nếu bạn có một ứng dụng chưa được launched hoặc nhỏ và cần scaling, bạn đã hoàn thành phần khó nhất và bạn có thể bắt đầu thiết kế việc large scale. Nếu bạn đã có một large scale application, nó vẫn cần một ý tưởng tốt là thông qua sách có thể kiểm tra lại.

Mỗi lần bạn có ý tưởng, bạn cần tìm vài người để xây nó. Ứng dụng vừa và nhỏ có thể xây dựng bởi một kĩ sư, ứng dụng lớn cần một đội lớn hơn. Tháng 12 năm 2005, Flickr có hơn 100,000 dòng source code, 50,000 dòng template code, 10,000 dòng JavaScript. Quá nhiều để một kỹ sư maintain, vì thế cần có nhiều kĩ sư để cùng maintain. Chúng ta cũng xem vài kỹ thuật để quản lý phát triển với nhiều kỹ sư trong chương 3. Để xây dựng một ứng dụng với bất kỳ kích cỡ team, bạn sẽ cần một môi trường phát triển và một staging environment (giả sử bạn thực sự muốn release nó). Chúng ta nói về development và staging environment đi kèm các công cụ trong chương 3, nhưng ở mức cơ bản, bạn cần một máy tính chạy web server và database server.

Thứ quan trọng nhất bạn cần là phương pháp thảo luận và lưu trữ trong tiến trình phát triển. Các tài liệu chi tiết có thể là tẻ nhạt, nhưng không viết gì có thể sẽ là thảm họa. Một good pad hoặc paper có thể đủ với một team nhỏ, hoặc một whiteboard (sau đó chụp ảnh), Wiki cũng là một lựa chọn. Với một đội lớn Wiki là cách tốt cho việc ghi chú và viết tài liệu, cho phpes tất cả lập trình viên của bạn có thể thêm, sửa và xem tài liệu của những người khác.
….

Với bút và Wiki trong tay, chúng ta sẽ bắt đầu thiết kế kiến trúc ứng dụng của chúng ta và bắt đầu thay đổi thế giới ứng dụng.

Dịch sách Programming Ground Up Chương 3 Chương trình đầu tiên

Trong chương này bạn sẽ học cách viết và build chương trình hợp ngữ. Thêm vào đó, bạn sẽ học được cấu trúc của chương trình hợp ngữ, và một vài lệnh hợp ngữ. Trong suốt chương, bạn có thể tham khảo trong phụ lục B và F.

Các chương trình dưới đây có thể áp đảo bạn trong lần đầu tiên, vượt qua chúng bằng sử siêng năng, đọc code và các giải thích nhiều lần, và bạn sẽ có nền tảng để xây dựng chúng. Mỗi lần thất bại đều giúp bạn học điều gì đó.

Viết chương trình.

OK, chương trình đơn giản đầu tiên. Thực tế nó sẽ không làm gì cả!. Ngắn gọn, nhưng là cơ bản về hợp ngữ và lập trình linux. Nhập đoạn code vào editor của bạn và lưu với tên file exit.s. Đừng lo lắng nếu bạn không hiểu. Hãy chỉ gõ và chạy nó. Trong mục Outline of an Assembly Language Program chúng ta sẽ mô tả cách nó hoạt động

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#PURPOSE: Simple program that exits and returns a
# status code back to the Linux kernel
#
#INPUT: none
#
#OUTPUT: returns a status code. This can be viewed
# by typing
#
# echo $?
#
# after running the program
#
#VARIABLES:
# %eax holds the system call number
# %ebx holds the return status
#
.section .data
.section .text
.globl _start
_start:
movl $1, %eax # this is the linux kernel command
# number (system call) for exiting
# a program
movl $0, %ebx # this is the status number we will
# return to the operating system.
# Change this around and it will
# return different things to
# echo $?
int $0x80 # this wakes up the kernel to run
# the exit command

Cái bạn vừa gõ được gọi là source code. Source code là dạng đọc được của chương trình. Để biến đổi nó thành dạng máy tính có thể chạy được, chúng ta cần dịch assemble và link nó.

Bước đầu tiên là assemble. assembling là quá trình chuyển cái mà bạn gõ thành các chỉ thị lệnh cho máy. Bản thân máy tính chỉ đọc được tập hợp các con số, nhưng người lại thích chữ hơn. Hợp ngữ là human-readable hơn so với các chỉ thị cho máy tính hiểu. assembling chuyển các tập tin human-readable thành machine-readable. Để assembly gõ lệnh

1
as exit.s -o exit.o

as là lệnh cái mà chạy trình hợp dịch, exit.s là tập tin mã nguồn, -o exit.o nói với trình hợp dịch đặt output vào file exit.o, exit.o là object file. Một object file cũng là file ngôn ngữ máy, nhưng không hoàn toàn như thế. Hầu hết các chương trình lớn, bạn sẽ có vài file mã nguồn, bạn sẽ chuyển mỗi cái thành object file. Liker là chương trình chịu trách nhiệm đặt các object file cùng nhau và thêm thông tin vào nó, vì thể kernel biết cách tải và chạy chúng. Trong trường hợp của chúng ta chúng ta chỉ có một object file, vì thế linker chỉ thêm thông tin để cho phép nó chạy được. Để link file, nhập:

1
ld exit.o -o exit

ld là lệnh để chạy linker, exit.o là object file bạn muốn link, -o exit để chỉ ra file output là file exit. Nếu bất kỳ lệnh báo lỗi, bạn phải chạy lại tất cả các lệnh. Bạn chạy exit bằng cách gõ:

1
./exit

./ được sử dụng để nói với máy tính file thực thi ở thư mục hiện tại. Bạn sẽ được nhắc khi bạn gõ lệnh này, kết quả sẽ xuất hiện khi bạn gõ

1
echo $?

Kết quả là 0. Đây là exit status code, nó nói rằng mọi thứ đều đúng. Nếu mọi thứ đều ok nó sẽ trả về 0. UNIX program trả về số khác 0 nếu errors, warnings, hoặc statuses. Các lập trình viên định nghĩa các con số này. Bạn có thể xem nó khi gõ echo $?.

Outline of an Assembly Language Program

Hãy nhìn vào chương trình chúng ta đã nhập. Ở vị trí bắt đầu. Có nhiều dòng bắt đầu với ký tự hashs(#). Đây là chú thích (comment). Các chú thích không được dịch bởi trình hợp dịch. Chúng chỉ được sử dụng bởi lập trình viên để nói với những người khác, những người đọc code của họ trong tương lai. Hầu hết chương trình bạn viết sẽ được sửa bởi người khác. Hãy tập thói quen viết chú thích trong code của bạn. Luôn luôn bao gồm những thứ sau trong chú thích của bạn.

  • Mục đích của code.
  • Tổng quan về những thứ được xử lý.
  • Bất cứ thứ gì lạ trong chương trình bạn làm và tại sao lại vậy

Sau các dòng comment là dòng

.setion .data

Bất cứ thứ gì bắt đầu bằng dấu chấm không được dịch trực tiếp ra mã máy. Thay vào đó nó là chỉ thị cho trình biên dịch. Chúng được gọi là assembler directives hay pseudo-operations bởi vì chúng được handle bởi assembler. Lệnh .section chia chương trình ra thành các phần. Lệnh trên để bắt đầu section data. Chương trình của chúng ta không sử dụng gì khác, vì thế chúng ta không cần phần này. Hầu hết các chương trình bạn viết trong tương lai sẽ có data.

Ngay sau đó là

.section .text

cái mà bắt đầu text section. Text section của chương trình là nơi các lệnh chương trình cư trú.

.globl _start
Chỉ thị này giúp trình hợp dịch biết _start là quan trọng để nhớ. _start là một symbol, nghĩa là

_start
Định nghĩa giá trị _start. Một label là một symbol theo sau bởi một dấu colon. Labels định nghĩa các giá trị của symbol’s value. Khi trình hợp dịch, hợp dịch chương trình, nó phải gán mỗi dữ liệu và chỉ thị một địa chỉ. Labels nói cho trình hợp dịch tạo các giá trị

movl $1, %eax

Khi chương trình chạy, chỉ thị này chuyển số 1 vào thanh ghi %eax. Trong hợp ngữ, nhiều chỉ thị có các toán hạng. movl có 2 toán tử - the source và the destination. Trong trường hợp này, the source là số 1, và the destination là thanh ghi %eax. Các toán tử có thể là số, địa chỉ hoặc thanh ghi. Các chỉ thị khác nhau cho phép các toán tử khác nhau. Xem phụ lục B để xem thêm về các chỉ thị nhận các kiểu toán tử nào.

Hầu hết các chỉ thị có 2 toán hạng, đầu tiên là nguồn (source), thứ 2 là đích (destination). Trong hầu hết trường hợp source không bị sửa đổi.

Trong x86 processor, có vài thanh ghi đa mục đích (tất cả đều có thể sử dụng movl):

  • %eax, %ebx, %ecx, %edx, %edi, %esi

Thêm vào đó có vài thanh ghi với mục đích đặc biệt:

  • %ebp, %esp, %eip, %eflags

Chúng ta sẽ thảo luận sau. Một vài thanh ghi như %eip và %eflags có thể được truy cập bởi các chỉ thị đặc biệt. Các cái khác có thể truy cập sử dụng cùng chỉ thị các thanh ghi đa mục tiêu.

Vì thếm lệnh movl di chuyển số 1 vào thanh ghi %eax. Ký hiệu $ ở trước để nói rằng chúng ta muốn sử dụng immediate mode addressing (refer back to Section Data Accessing Methods trong chương 2). Nếu không có dấu $ nó sẽ là sử dụng direct addressing mode, tải số ở địa chỉ 1. Chúng ta muốn sử dụng số 1 để load vào nên chúng ta phải sử dụng immediate mode.

Lý do để chúng ta di chuyển số 1 vào thanh ghi %eax là bởi vì chúng ta chuẩn bị gọi Linux Kernel. Số 1 là số của exit system call. Chúng ta sẽ thảo luận về system calls sâu hơn sắp tới, nhưng cơ bản chúng ta sẽ yêu cầu hệ điều hành giúp. Các chương trình bình thường không làm tất cả. Nhiều hoạt động như gọi chương trình khác, làm việc với tập tin hay thoát phải được handled bởi hệ điều hành thông qua system calls. Khi bạn muốn tạo system calls, đơn giản chúng ta sẽ load một số vào thanh ghi %eax (Một danh sách tất cả system calls và số tương ứng có trong phụ lục C). Phụ thuộc vào system call, các thanh ghi khác có thể có những giá trị khác. System calls không phải mục đích chính của các thanh ghi. Các chương trình sau sẽ sử dụng các thanh ghi cho các tác vụ tính toán.

Hệ điều hành, cần các thông tin để thực hiện system calls. Ví dụ, để dealing with files, hệ điều hành cần biết được tập tin nào cần mở, dữ liệu nào cần được ghi và các thứ khác. Các thông tin chi tiết thêm vào được gọi là các tham số được lưu trữ ở các thanh ghi. Trong trường hợp exit system calls, hệ điều hành yêu cầu status code được load vào thanh ghi %ebx. Giá trị này sẽ được trả về cho hệ thống. Giá trị này bạn có có được khi bạn gõ echo $?. Vì thế, chúng ta tải %ebx với 0 bằng cách gõ: movl $0, %ebx

1
2
3
Phần chân trang 26:

Tiền tố e để chỉ định phiên bản mở rộng của thanh ghi. Thương xuyên bạn sẽ sử dụng các phiên bản mở rộng. Model mới hơn là phiên bản 64 bit, các tahanh ghi với tiền tố r nói đến các thanh ghi lớn hơn (ví dụ rax là 64 bit version của %eax). Tuy nhiên các vi xử lý không được sử dụng rộng rãi không được bao gồm trong cuốn sách này.

Bây giờ, Việc tải các số vào thanh ghi không có tác dụng gì. Các thanh ghi được sử dụng cho nhiều mục đích không chỉ là system calls. Chúng là nơi các program logic như cộng, trừ, so sánh sử dụng. Linux yêu cầu các thanh ghi nhất định được tải với các tham số nhất định trước khi tạo một system call. %eax luôn yêu cầu được sử dụng với một con số. Tuy nhiêu mỗi system call lại yêu cầu khác nhau. Như trong exit system call, %eba được yêu cầu được nạp giá trị exit stattus. Chúng ta sẽ thảo luận về các system calls khác khi cần. Chỉ thị tiếp theo:

int $0x80

int viết tắt của interupt. 0x80 là interupt number được sử dụng. Một interunp sẽ ngắt luồng chương trình, và chuyển luồng điểu khiển chương trình của chúng ta cho Linux, nó sẽ gọi lệnh system call.

Bạn có thể không hiểu tại sao dùng 0x80 thay vì 80. Lý do là số chúng ta viết ở dạng cơ số 16.

Lên kế hoạch cho chương trình

Trong chương trình tiếp theo, chúng ta sẽ tìm số lớn nhất trong danh sách các số. Chúng ta cần lập kế hoạch một cách chi tiết:

  • Nơi lưu danh sách các số?
  • Thủ tục cần để tìm số lớn nhất?
  • Chúng ta cần bao nhiêu bộ nhớ?
  • Tất cả có thể lưu vừa trong các thanh ghi, hay chúng ta cần thêm bộ nhớ.

Bạn có thể nghĩ rằng thật đơn giản để tìm số lớn nhất trong danh sách. Bạn có thể hỏi vài người cách tìm số lớn nhất, họ có thể gặp vài rắc rối. Tuy nhiên, trong đầu chúng ta có thể làm các tác vụ phức tạp một cách tự động. Máy tính cần được chỉ thị.

Chúng ta cần các thanh ghi:

  • %edi sẽ giữ vị trí hiện tại trong danh sách
  • %ebx sẽ giữ giá trị lớn nhất trong danh sách
  • %eax sẽ giữ phần tử hiện tại

Khi chúng ta bắt đầu chương trình hãy xem giá trị đầu tiên trong danh sách.

Finding a Maximum Value

Dịch sách Programming Ground Up Chương 2 Kiến trúc máy tính

Trước khi học lập trình, bạn cần hiểu được cách máy tính hiểu được chương trình. Bạn không cần phải có bằng kĩ sư điện tử, nhưng bạn cần vài thứ cơ bản.

Các kiến trúc máy tính hiện tại đều dựa vào một kiến trúc gọi là kiến trúc Von Neumann, được đặt tên theo người sáng tạo ra nó. Kiến trúc Von Neumann chia máy tính thành hai phần chính - CPU (Đơn vị xử lý trung tâm) và bộ nhớ. Kiến trúc này được sử dụng trong các máy tính hiện đại, bao gồm cả PC, SuperComputers, MainFrames, và cả điện thoại.

Cấu trúc bộ nhớ máy tính.

Để hình dung bộ nhớ máy tính trông như thế nào, hãy tưởng tượng ra các văn phòng. Chúng thường có một phòng với rất nhiều ngăn làm việc (PO boxes). Các ngăn làm việc tương tự như bộ nhớ máy tính được đánh số thứ tự. Ví dụ, nếu bạn có 256 MB bộ nhớ máy tính, có nghĩa là máy tính của bạn có sấp xỉ 256 triệu địa chỉ hay 256 triệu ngăn làm việc. Mỗi địa chỉ có một số, cùng kích cỡ. Khác nhau giữa ngăn làm việc văn phòng và bộ nhớ máy tính là bạn có thể lưu trữ tất cả mọi thứ trong một ngăn làm việc, nhưng bạn chỉ có thể lưu trữ một số trong bộ nhớ máy tính.

Bạn sẽ ngạc nhiêu tại sao máy tính lại được lưu trữ theo cách này. Là bởi vì nó dễ cài đặt. Nếu máy tính tổ chức bộ nhớ với các ngăn nhớ khác kích cỡ, hoặc có thể lưu trữ các dữ liệu khác nhau, chúng sẽ ra khó và đắt đỏ để cài đặt.

Bộ nhớ máy tính được sử dụng cho nhiều mục đích khác nhau. Tất cả các kết quả và các tính toán được lưu trữ trong bộ nhớ. Sự thật, mọi thứ được lưu trữ trong bộ nhớ. Bộ nhớ máy tính lưu trữ

  • Địa chỉ con trỏ trên màn hình
  • Kích cỡ mỗi cửa sổ trên màu hình
  • Hình dạng các ký tự của mỗi font
  • Bố trí các controls trên mỗi cửa sổ.
  • Đồ họa cho các icon
    ….

Không chỉ dữ liệu được lưu trữ trong bộ nhớ, các chương trình cũng cư trú trong đó. Thực tế không có sự khác nhau giữa chương trình và dữ liệu chương trình ngoại trừ cách mà chúng được sử dụng bởi máy tính. Chúng được lưu trữ và truy cập theo cùng một cách.

CPU

Vài thuật ngữ

Bộ nhớ máy tính là tập hợp các địa chỉ được đánh số. Kích cỡ của một ô nhớ được gọi là byte.

Bạn sẽ ngạc nhiêu vì sao máy tính có thể hiểu thị chữ, đồ họa và các số lớn trong khi tất cả chúng được lưu trữ giữa 0 và 255.