通过本实验,熟悉 DLX指令和编程。
(1)计算两个无符号数和
输入和输出格式为:
输入第一个数: 输入第二个数: 和=
C 代码例子:
void main() { unsigned int num1, num2; scanf("\nEnter the 1st number: %d", &num1); scanf("\nEnter the 2nd number: %d", &num2); printf("The sum = %d", num1+num2); }
(2)两数相除
输入和输出格式为:
输入第一个数: 输入第二个数: 商=
C 代码例子:
void main() { int num1, num2; double num3; scanf("\nEnter the 1st number: %d", &num1); scanf("\nEnter the 2nd number: %d", &num2); if( num2 != 0){ num3 = (double)num1/(double)num2; printf("\n(1st number) %g divided by (2nd number) %g = %g", (double)num1, (double)num2, num3 ); } else printf("\n divide by 0 !!"); }
注意:商必须为双精度格式。
(1).计算无符号数的和
代码:
;add.s两数相加 ; Program begin at symbol main ; requires module INPUT ; Load two programs (add.s and input.s) ; Note: load add.s first then follow by inputs. ; Execute, press (F5) ; read 2 numbers from stdin and add them (integer) ; the result is written to stdout ;-------------------------------------------------------------------------- .data ;输入 Prompt1: .asciiz "\nEnter the 1nd number (> 1): " Prompt2: .asciiz "\nEnter the 2nd number (> 1): " ;输出 PrintFt: .asciiz "\nThe sum is : %d" .align 2 PrintPar: .word PrintFt PrintSum: .space 4 .text .global main main: ;读入两个数到r1,r2 addi r1,r0,Prompt1 ;put prompt1 in arg r1 jal InputUnsigned ;call subroutine add r2,r1,r0 ; addi r1,r0,Prompt2 ; jal InputUnsigned ;调用子程序输入 add r1,r2,r1 ; sw PrintSum,r1 ;store your number addi r14,r0,PrintPar ;prepare to print trap 5 ;print to standard output ;**********end************ trap 0
(2). 两数相除
;devide.s 两数相除 ; Program begin at symbol main ; requires module INPUT ;-------------------------------------------------------------------------- .data ;数据输入 Prompt1: .asciiz "\nDeviding:" Prompt2: .asciiz "\nDevided:" ;输出格式 PrintFt: .asciiz "\nResult = %g\n" .align 2 PrintPar: .word PrintFt PrintValue: .space 8 .text .global main main: addi r1,r0,Prompt1 ;put prompt1 in arg r1 jal InputUnsigned ;call subroutine add r2,r1,r0 ; addi r1,r0,Prompt2 ; jal InputUnsigned ; ;判断除数是否为0 seqi r3,r2,#0 bnez r3,main ; movi2fp f10,r1 cvtf2d f0,f10 movi2fp f11,r2 cvtf2d f2,f11 divd f0,f0,f2 ;打印结果 sd PrintValue,f0 addi r14,r0,PrintPar ; trap 5 ;*******************end************ trap 0
seqi指令:
seqi Ex: seqi r14,r3,#3 if (R[rega] == imm16) R[regb] <-- 1 else R[regb] <-- 0 All are signed integers.
bnez指令:
bnez Ex: bnez r1,label if (R[rega] != 0) PC <-- PC + imm16 + 4
判断除数是否为0处:
;判断除数是否为0 seqi r3,r2,#0 bnez r3,main
翻译为伪码:
if(r2==0) r3=1; else r3=0; if(r3!=0) pc=pc+main+4;
如果除数为0时,要求重新程序重新运行。