CPU "lấy" data như thế nào?

Ví dụ có lệnh như thế này 1+2-5*6 , CPU sẽ lấy data theo từng chu kỳ, vậy nếu trong 1 chu kỳ CPU lấy 1+2-5* để xử lý thì nó sẽ xử lấy như thế nào ạ?

Nó phải qua bộ dịch để chuyển thành mã máy trước bạn ơi.

Em biết là nó sẽ dịch thành mã nhị phân nhưng khi dịch đoạn trên nó sẽ tính như thế nào ạ? Rồi nó lấy “6” lên thì lúc này sẽ sao ạ?c

Dịch làm sao thì bạn phải học 1 khóa về trình biên dịch mới biết được :smiley:

1 Like

Vậy lấy như nào thì nó cũng tính được ạ?

Đại loại là nó phải chạy qua câu đó trước, sau đó biến đổi thành 1 ngôn ngữ trung gian để tối ưu hóa (dead code, unroll, alias, …) rồi mới dịch thẳng.

1 Like

Ý em là CPU nó tính kiểu gì ấy ạ? Em không nói cái vụ compile! nó lấy đoạn kia lên tính toán rồi , sau đó lấy số 6 làm sao nó biết là nhân 6, với lại nhân chia trước thì phải nhân 5 với 6 trước! CPU tính kiểu gì mà ra đúng được kết quả ạ?

bạn học ctdl, stack với bài toán tiền tồ trung tố hậu tố chưa, hình như tương tự thế

Chưa anh ạ! (20 characters)

Trình biên dịch sẽ phải phân tích phép toán đó ra thành các phép toán đơn giản hơn như cộng trừ nhân chia 2 số. Sau đó sẽ dịch ra mã máy. CPU sẽ thực hiện tuần tư các mã này. Kết thúc 1 chuỗi mã thì sẽ thực hiện xong 1 phép toán.

1 Like

Sử dụng Reverse Polish Notation để phân tích cú pháp của phép toán trước, xem toán tử nào thực hiện trước, sau đó thành mã mày, chuyển đến phần tính toán thì chỉ cần tính toán lần lượt là ra.

1 Like

chắc ý bạn là học kiến trúc máy tính à?

cái hình này là của MIPS, đơn giản nhất rồi đó. Nhưng mà học xong quên rồi :stuck_out_tongue: Giải thích thì mất công lắm :joy:

CPU của MIPS có khoảng 32 registers.
ví dụ tính x = a+b với a=1, b=2 thì:

li   $t1, 1         # gán $t1 = 1
li   $t2, 2         # gán $t2 = 2
add  $t0, $t1, $t2  # tính $t0 = $t1 + $t2

x = a + b*c, a,b,c=1,2,5

li   $t1, 2         # gán $t1 = 2
li   $t2, 5         # gán $t2 = 5
mutl $t1, $t2       # tính $lo = $t1 * $t2
li   $t3, 1         # gán $t3 = 1
add  $t0, $lo, $t3  # tính $t0 = $t3 + $lo

rồi ý bạn là lo tìm data path của nó trên cái hình MIPS ở trên hả? Học lâu quá quên rồi :joy:

3 Likes

đoạn mã của bạn chắc là assembly rồi, assembly cũng là NN bậc cao hơn so với mã máy rồi, cpu đâu có hiểu được lệnh phức hợp như lệnh mutl đâu, nên đoạn mã này chắc chắn sẽ được dịch tiếp để chuyển thành mã máy cấp thấp hơn chỉ có mấy phép tính cơ bản như cộng/bit shift/…

3 Likes

Theo mình biết thì đầu tiên phải biên dịch ra mã máy, mà cách để mình hiểu mã máy là dùng hợp ngữ hay ngôn ngữ Assembly. Phép nhân trong hợp ngữ đã là một phép toán phức tạp rồi. Phép toán của bạn nó biên dịch ra khá nhiệu lệnh mã máy. CPU từ đó thực hiện từng lệnh thôi. Nếu bạn từng học ngôn ngữ bậc thấp thì bạn biết, phép nhân là một phép khá phức tạp.

1 Like

Đây đây:

Đọc ở phần step, 4 bước đó.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?