用户工具

站点工具


01-基础学习:课程:计算机系统结构:实验:二

实验二 熟悉DLX汇编语言编程

实验目的

通过本实验,熟悉 DLX指令和编程。

实验内容

  1. 将C 代码例子(1)和(2)转化为DLX 汇编程序。
  2. 用WinDLX模拟器运行你自己的汇编程序,记录模拟的相关结果。
  3. 提交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时,要求重新程序重新运行。

附:例程和提示

  • [[.:例程]
01-基础学习/课程/计算机系统结构/实验/二.txt · 最后更改: 2020/04/07 06:34 由 annhe