Chương trình tính giá trị biểu thức bằng hợp ngữ MIPS
Số trang: 14
Loại file: pdf
Dung lượng: 180.21 KB
Lượt xem: 9
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Xây dựng chương trình MIPS sau (không bắt buộc dùng thủ tục/hàm): Nhập vào chuỗi biểu thức gồm có các toán tử sau: + – * / (_), và tính kết quả của biểu thức đó. Ví dụ: 12*3+24/(9-3)-90 Ghi chú: + Độ ưu tiên của toán tử: 1: (_) ; 2: * / ; 3: + + Các toán hạng là số nguyên được giới hạn trong đoạn [0,999] + Tìm hiểu stack và thuật toán balan ngược (trong cấu trúc dữ liệu) + Kết quả của biểu thức: số nguyên hoặc số thực (chỉ cần chọn 1 trong...
Nội dung trích xuất từ tài liệu:
Chương trình tính giá trị biểu thức bằng hợp ngữ MIPS Chương trình tính giá trị biểu thức bằng hợp ngữ MIPSXây dựng chương trình MIPS sau (không bắt buộc dùng thủ tục/hàm):Nhập vào chuỗi biểu thức gồm có các toán tử sau: + – * / (_), và tính kết quảcủa biểu thức đó.Ví dụ: 12*3+24/(9-3)-90Ghi chú:+ Độ ưu tiên của toán tử: 1: (_) ; 2: * / ; 3: + -+ Các toán hạng là số nguyên được giới hạn trong đoạn [0,999]+ Tìm hiểu stack và thuật toán balan ngược (trong cấu trúc dữ liệu)+ Kết quả của biểu thức: số nguyên hoặc số thực (chỉ cần chọn 1 trong 2) hoặc sốthực (chỉ cần chọn 1 trong 2)Đây là bài làm của tôi:# $s1: expression string# $sp, $t0: stack# $s0, $t1: queue.data text_1: .asciiz Nhap bieu thuc: text_2: .asciiz Gia tri bieu thuc: text_3: .asciiz Bieu thuc khong dung!.textmain: move $t0, $sp addi $s0, $sp, -102400 move $t1, $s0 addi $s1, $s0, -102400 li $v0, 4 #print string la $a0, text_1 syscall addi $s1, $s1, -1024 move $a0, $s1 li $v0, 8 #read string li $a1, 1024 syscallInfix2Postfix:lbu $t2, 0($s1)beq $t2, 10, end_Infix2Postfix # if s[0]==n goto end_Infix2Postfixbeq $t2, (,openbeq $t2, ),closebeq $t2, +,operatorbeq $t2, -,operatorbeq $t2, *,operatorbeq $t2, /,operatormove $a0, $t2jal Is_numberbeq $v0, 1, operandaddi $s1, $s1, 1 # next characterj Infix2Postfixopen:li $a0, 0li $a1, 0jal Push_stackaddi $s1, $s1, 1 # next characterj Infix2Postfixclose:jal Is_Empty_stackbeq $v0, 1, Expression_Errorjal Pop_stackbeq $v0, $zero, end_closemove $a0, $v0move $a1, $v1jal Push_queuej closeend_close:addi $s1, $s1, 1 # next characterj Infix2Postfixoperator:beq $t2, +,o1beq $t2, -,o1beq $t2, *,o2beq $t2, /,o2o1:li $t3, 1j while_oo2:li $t3, 2while_o:jal Is_Empty_stackbeq $v0, 1, end_while_ojal Top_stackslt $t4, $v0, $t3beq $t4, 1, end_while_ojal Pop_stackmove $a0, $v0move $a1, $v1jal Push_queueend_while_o:move $a0, $t3move $a1, $t2jal Push_stackaddi $s1, $s1, 1 # next characterj Infix2Postfixoperand:sub $t3, $t2, 0while_number:lbu $t2, 1($s1)move $a0, $t2jal Is_numberbeq $v0, 0, end_while_numbermul $t3, $t3, 10sub $t2, $t2, 0add $t3, $t3, $t2addi $s1, $s1, 1j while_numberend_while_number:li $a0, 3move $a1, $t3jal Push_queueaddi $s1, $s1, 1 # next characterj Infix2Postfixend_Infix2Postfix:while_not_Empty_stack:jal Is_Empty_stackbeq $v0, 1, end_while_not_Empty_stackjal Pop_stackmove $a0, $v0move $a1, $v1jal Push_queuej while_not_Empty_stackend_while_not_Empty_stack:while_not_Empty_queue:jal Is_Empty_queuebeq $v0, 1, end_while_not_Empty_queuejal Pop_queuebeq $v0, 3, _operandmove $a2, $v1jal Pop_stackbne $v0, 3, Expression_Errormove $a1, $v1jal Pop_stackbne $v0, 3, Expression_Errormove $a0, $v1jal calculateli $a0, 3move $a1, $v0jal Push_stackj while_not_Empty_queue_operand:move $a0, $v0move $a1, $v1jal Push_stackj while_not_Empty_queueend_while_not_Empty_queue:li $v0, 4 #print stringla $a0, text_2syscalljal Pop_stackmove $a0, $v1li $v0, 1syscallend_program: li $v0, 10 #exit syscallExpression_Error: li $v0, 4 #print string la $a0, text_3 syscall j end_programIs_number: beq $a0, 0,_number beq $a0, 1,_number beq $a0, 2,_number beq $a0, 3,_number beq $a0, 4,_number beq $a0, 5,_number beq $a0, 6,_number beq $a0, 7,_number beq $a0, 8,_number beq $a0, 9,_number li $v0, 0 jr $ra _number: li $v0, 1 jr $racalculate: beq $a2, +, _add beq $a2, -, _sub beq $a2, *, _mul div $a0, $a1 mflo $v0 jr $ra _add: add $v0, $a0, $a1 jr $ra _sub: sub $v0, $a0, $a1 jr $ra _mul: mul $v0, $a0, $a1 jr $raPush_stack: addi $t0, $t0, -8 sw $a0, 0($t0) #save type of token sw $a1, 4($t0) #save value of token jr $raPush_queue: addi $s0, $s0, -8 sw $a0, 0($s0) #save type of token sw $a1, 4($s0) #save value of token jr $raPop_stack: lw $v0, 0($t0) lw $v1, 4($t0) addi $t0, $t0, 8 jr $raTop_stack: lw $v0, 0($t0) lw $v1, 4($t0) jr $raPop_queue: lw $v0, -8($t1) lw $v1, -4($t1) addi $t1, $t1, -8 jr $raIs_Empty_stack: beq $sp, $t0, Empty_stack li $v0, 0 jr $ra Empty_stack: li $v0, 1 jr $raIs_Empty_queue: beq $s0, $t1, Empty_queue li $v0, 0 jr $ra Empty_queue: li $v0, 1 jr $ra
Nội dung trích xuất từ tài liệu:
Chương trình tính giá trị biểu thức bằng hợp ngữ MIPS Chương trình tính giá trị biểu thức bằng hợp ngữ MIPSXây dựng chương trình MIPS sau (không bắt buộc dùng thủ tục/hàm):Nhập vào chuỗi biểu thức gồm có các toán tử sau: + – * / (_), và tính kết quảcủa biểu thức đó.Ví dụ: 12*3+24/(9-3)-90Ghi chú:+ Độ ưu tiên của toán tử: 1: (_) ; 2: * / ; 3: + -+ Các toán hạng là số nguyên được giới hạn trong đoạn [0,999]+ Tìm hiểu stack và thuật toán balan ngược (trong cấu trúc dữ liệu)+ Kết quả của biểu thức: số nguyên hoặc số thực (chỉ cần chọn 1 trong 2) hoặc sốthực (chỉ cần chọn 1 trong 2)Đây là bài làm của tôi:# $s1: expression string# $sp, $t0: stack# $s0, $t1: queue.data text_1: .asciiz Nhap bieu thuc: text_2: .asciiz Gia tri bieu thuc: text_3: .asciiz Bieu thuc khong dung!.textmain: move $t0, $sp addi $s0, $sp, -102400 move $t1, $s0 addi $s1, $s0, -102400 li $v0, 4 #print string la $a0, text_1 syscall addi $s1, $s1, -1024 move $a0, $s1 li $v0, 8 #read string li $a1, 1024 syscallInfix2Postfix:lbu $t2, 0($s1)beq $t2, 10, end_Infix2Postfix # if s[0]==n goto end_Infix2Postfixbeq $t2, (,openbeq $t2, ),closebeq $t2, +,operatorbeq $t2, -,operatorbeq $t2, *,operatorbeq $t2, /,operatormove $a0, $t2jal Is_numberbeq $v0, 1, operandaddi $s1, $s1, 1 # next characterj Infix2Postfixopen:li $a0, 0li $a1, 0jal Push_stackaddi $s1, $s1, 1 # next characterj Infix2Postfixclose:jal Is_Empty_stackbeq $v0, 1, Expression_Errorjal Pop_stackbeq $v0, $zero, end_closemove $a0, $v0move $a1, $v1jal Push_queuej closeend_close:addi $s1, $s1, 1 # next characterj Infix2Postfixoperator:beq $t2, +,o1beq $t2, -,o1beq $t2, *,o2beq $t2, /,o2o1:li $t3, 1j while_oo2:li $t3, 2while_o:jal Is_Empty_stackbeq $v0, 1, end_while_ojal Top_stackslt $t4, $v0, $t3beq $t4, 1, end_while_ojal Pop_stackmove $a0, $v0move $a1, $v1jal Push_queueend_while_o:move $a0, $t3move $a1, $t2jal Push_stackaddi $s1, $s1, 1 # next characterj Infix2Postfixoperand:sub $t3, $t2, 0while_number:lbu $t2, 1($s1)move $a0, $t2jal Is_numberbeq $v0, 0, end_while_numbermul $t3, $t3, 10sub $t2, $t2, 0add $t3, $t3, $t2addi $s1, $s1, 1j while_numberend_while_number:li $a0, 3move $a1, $t3jal Push_queueaddi $s1, $s1, 1 # next characterj Infix2Postfixend_Infix2Postfix:while_not_Empty_stack:jal Is_Empty_stackbeq $v0, 1, end_while_not_Empty_stackjal Pop_stackmove $a0, $v0move $a1, $v1jal Push_queuej while_not_Empty_stackend_while_not_Empty_stack:while_not_Empty_queue:jal Is_Empty_queuebeq $v0, 1, end_while_not_Empty_queuejal Pop_queuebeq $v0, 3, _operandmove $a2, $v1jal Pop_stackbne $v0, 3, Expression_Errormove $a1, $v1jal Pop_stackbne $v0, 3, Expression_Errormove $a0, $v1jal calculateli $a0, 3move $a1, $v0jal Push_stackj while_not_Empty_queue_operand:move $a0, $v0move $a1, $v1jal Push_stackj while_not_Empty_queueend_while_not_Empty_queue:li $v0, 4 #print stringla $a0, text_2syscalljal Pop_stackmove $a0, $v1li $v0, 1syscallend_program: li $v0, 10 #exit syscallExpression_Error: li $v0, 4 #print string la $a0, text_3 syscall j end_programIs_number: beq $a0, 0,_number beq $a0, 1,_number beq $a0, 2,_number beq $a0, 3,_number beq $a0, 4,_number beq $a0, 5,_number beq $a0, 6,_number beq $a0, 7,_number beq $a0, 8,_number beq $a0, 9,_number li $v0, 0 jr $ra _number: li $v0, 1 jr $racalculate: beq $a2, +, _add beq $a2, -, _sub beq $a2, *, _mul div $a0, $a1 mflo $v0 jr $ra _add: add $v0, $a0, $a1 jr $ra _sub: sub $v0, $a0, $a1 jr $ra _mul: mul $v0, $a0, $a1 jr $raPush_stack: addi $t0, $t0, -8 sw $a0, 0($t0) #save type of token sw $a1, 4($t0) #save value of token jr $raPush_queue: addi $s0, $s0, -8 sw $a0, 0($s0) #save type of token sw $a1, 4($s0) #save value of token jr $raPop_stack: lw $v0, 0($t0) lw $v1, 4($t0) addi $t0, $t0, 8 jr $raTop_stack: lw $v0, 0($t0) lw $v1, 4($t0) jr $raPop_queue: lw $v0, -8($t1) lw $v1, -4($t1) addi $t1, $t1, -8 jr $raIs_Empty_stack: beq $sp, $t0, Empty_stack li $v0, 0 jr $ra Empty_stack: li $v0, 1 jr $raIs_Empty_queue: beq $s0, $t1, Empty_queue li $v0, 0 jr $ra Empty_queue: li $v0, 1 jr $ra
Tìm kiếm theo từ khóa liên quan:
Công nghệ thông tin cấu trúc dữ liệu lý thuyết đồ thị Javascript ASP.NET Tin học đại cương giáo trình Tin học đại cương bài giảng Tin học đại cương tài liệu Tin học đại cương lý thuyết Tin học đại cươngGợi ý tài liệu liên quan:
-
52 trang 431 1 0
-
Top 10 mẹo 'đơn giản nhưng hữu ích' trong nhiếp ảnh
11 trang 317 0 0 -
Đề cương chi tiết học phần Cấu trúc dữ liệu và giải thuật (Data structures and algorithms)
10 trang 317 0 0 -
74 trang 302 0 0
-
Ứng dụng công cụ Quizizz thiết kế trò chơi học tập trong giảng dạy học phần tin học đại cương
12 trang 301 0 0 -
96 trang 293 0 0
-
Báo cáo thực tập thực tế: Nghiên cứu và xây dựng website bằng Wordpress
24 trang 289 0 0 -
Đồ án tốt nghiệp: Xây dựng ứng dụng di động android quản lý khách hàng cắt tóc
81 trang 281 0 0 -
EBay - Internet và câu chuyện thần kỳ: Phần 1
143 trang 276 0 0 -
Tài liệu dạy học môn Tin học trong chương trình đào tạo trình độ cao đẳng
348 trang 269 1 0