Danh mục

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    
Jamona

Phí tải xuống: 1,000 VND Tải xuống file đầy đủ (14 trang) 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

Tài liệu được xem nhiều:

Gợi ý tài liệu liên quan: