Chương trình tính giá trị biểu thức bằng hợp ngữ MIPS 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 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!" .text main: 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 syscall Infix2Postfix: lbu $t2, 0($s1) beq $t2, 10, end_Infix2Postfix # if s[0]=='n' goto end_Infix2Postfix beq $t2, '(',open beq $t2, ')',close beq $t2, '+',operator beq $t2, '-',operator beq $t2, '*',operator beq $t2, '/',operator move $a0, $t2 jal Is_number beq $v0, 1, operand addi $s1, $s1, 1 # next character j Infix2Postfix open: li $a0, 0 li $a1, 0 jal Push_stack addi $s1, $s1, 1 # next character j Infix2Postfix close: jal Is_Empty_stack beq $v0, 1, Expression_Error jal Pop_stack beq $v0, $zero, end_close move $a0, $v0 move $a1, $v1 jal Push_queue j close end_close: addi $s1, $s1, 1 # next character j Infix2Postfix operator: beq $t2, '+',o1 beq $t2, '-',o1 beq $t2, '*',o2 beq $t2, '/',o2 o1: li $t3, 1 j while_o o2: li $t3, 2 while_o: jal Is_Empty_stack beq $v0, 1, end_while_o jal Top_stack slt $t4, $v0, $t3 beq $t4, 1, end_while_o jal Pop_stack move $a0, $v0 move $a1, $v1 jal Push_queue end_while_o: move $a0, $t3 move $a1, $t2 jal Push_stack addi $s1, $s1, 1 # next character j Infix2Postfix operand: sub $t3, $t2, '0' while_number: lbu $t2, 1($s1) move $a0, $t2 jal Is_number beq $v0, 0, end_while_number mul $t3, $t3, 10 sub $t2, $t2, '0' add $t3, $t3, $t2 addi $s1, $s1, 1 j while_number end_while_number: li $a0, 3 move $a1, $t3 jal Push_queue addi $s1, $s1, 1 # next character j Infix2Postfix end_Infix2Postfix: while_not_Empty_stack: jal Is_Empty_stack beq $v0, 1, end_while_not_Empty_stack jal Pop_stack move $a0, $v0 move $a1, $v1 jal Push_queue j while_not_Empty_stack end_while_not_Empty_stack: while_not_Empty_queue: jal Is_Empty_queue beq $v0, 1, end_while_not_Empty_queue jal Pop_queue beq $v0, 3, _operand move $a2, $v1 jal Pop_stack bne $v0, 3, Expression_Error move $a1, $v1 jal Pop_stack bne $v0, 3, Expression_Error move $a0, $v1 jal calculate li $a0, 3 move $a1, $v0 jal Push_stack j while_not_Empty_queue _operand: move $a0, $v0 move $a1, $v1 jal Push_stack j while_not_Empty_queue end_while_not_Empty_queue: li $v0, 4 #print string la $a0, text_2 syscall jal Pop_stack move $a0, $v1 li $v0, 1 syscall end_program: li $v0, 10 #exit syscall Expression_Error: li $v0, 4 #print string la $a0, text_3 syscall j end_program Is_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 . Chương trình tính giá trị biểu thức bằng hợp ngữ MIPS 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. 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: +. đ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)