山东大学汇编语言上机实验 - 实验五 - 图文 下载本文

舍入值 ADJUST=1/2SHIFT=50 作舍入及移位处理

(Product+adjust)/shift=(873300+50)/100 =8733

又如:输入工作时间为65.245,工资率为8.52 则, product=65245X852=55588740

SHIFT=(10)^5-2=1000 Adjust=500

作舍入及移位处理

55588740+500/1000=55589240/1000

=55589

金处理的值只是取得了答案的有效值,并未考录小数点的位置,这个问题将会在输出时得到解决。 3.NODEC=0~2

在这种情况下,乘积的结果不必做舍入及移位处理,只需记录NODEC的值,并在输出显示是解决小数点的问题即可

在计算时还需啊哟说明一个问题:由于采用整数运算,要求输入数不超过6535,任意输入数超过改制就做溢出处理,在这里我们用输出0来表示。此外,两个输入数的成绩可能得到三十二位二进制数的结果,这用一般的运算乘法指令就可以得到。对于这样的双精度数作除法运算时,尽管我们已经限制shift的值不超过65535,但字运算的出发指令要求双精度被除数和单精度的除数相除,其结果应该是双精度的商,否则作为溢出处理。为了避免这种溢出情况的发生,我们采用以下程序段来作为除法。设在以下程序段运行前,我们已取得双精度被除数在DX:AX中,除数在shift单元中,除法运算结果的商在DX,AX中。

模块名:begin为中控制模块

输入:接受从键盘输入的工作时间hour和工资rate 输出:在屏幕上显示工资值wage

功能:根据工作时间和工资率计算工资

Wage=hour*rate 调用:

2:模块名:Q10SCR 功能:清除屏幕

3:模块名:Q20CURS 功能:置于光标位置 4模块名:B10inpt

输入:接受从键盘输入的以小时为单位的工作时间及工资率

输出:把工作时间缓存HASPAR缓存区,吧工资率存入ratepar缓冲区 功能:接受从键盘输入的工作时间及工资率,分别存入相应的缓存区中。 5模块名:D10HOUR

输入:从HRSPAR中取出工作时间

输出:把转换为二进制的时间存入BINHRS单元中。

功能:调用子过程M10ASBI,把工作时间从ASCLL吗转换为二进制数。 6模块名:E10RATE

输入:从RATEPAR中取出工资率。

输出:把转换为二进制的工资率存入BINRATE单元中。

功能:调用子过程M10ASBI,把工资率从ASCLL码转换为二进制数。 7:模块名:M10ASBI

输入:根据调用过程给出的指针以及字符个数取得一个ASCLL字符窜、 输出:将ASCLL字符窜转换为二进制数,结果存放与BINAL单元中

功能:把ASCLL字符窜转换为二进制数。同时记录输入的小数点后的位数累计在NODEC单元中。

8:模块名:F10MULT

输入:从binHRAS中取得工作时间,从BINRATE中取得工资率。 输出:根据工作时间及工资率的取值将其结果存放在DX,AX中

功能:把工作时间和工资率的成绩经过舍入和移位处理后得到的二进制工资值存放在DX.:AX中。 9模块名:G10WAGE

输入:DX,AX中的二进制工资数以及NODEC单元中的小数点后的位数

输出:把二进制的工资数转换为ASCLL码存放在ASCWAGE为首地址的字符窜当中 功能:

10模块名

输入:ASCWAGE中的字符窜

输出:把字符窜在屏幕上显示出来 功能:显示工资数

;PROGRAM TITLE GOES HERE --SCREMP ;Enter hours&rate,display wage

;************************************* stacksg segment para stack 'stack' dw 32 dup(?) stacksg ends

;************************************* datasg segment para 'data' hrspar label byte ;Hours parameter list; maxhlen db 6 acthlen db ? hrsfld db 6 dup(?)

ratepar label byte ;rate parameter list; maxrlen db 6 actrlen db ? ratefld db 6 dup(?) messg1 db 'Hours worked?','$' messg2 db 'Rate of pay?','$' messg3 db 'Wage =' ascwage db 14 dup(30h),13,10,'$' messg4 db 13,10,'Overflow!',13,10,'$' adjust dw ? binval dw 0 binhrs dw 0 binrate dw 0 col db 0 decind db 0 mult10 dw 01 nodec dw 0 row db 3 shift dw ? tenwd dw 10 tempdx dw ? tempax dw ? datasg ends

;************************************* codesg segment para 'code' ;-------------------------------------

begin proc far ;main part of program assume cs:codesg,ds:datasg,ss:stacksg,es:datasg ;set up stack for return push ds sub ax,ax push ax

;set DS register to current data segment mov ax,datasg mov ds,ax mov es,ax

;main part of program goes here mov ax,0600h ;CALL DISP call q10scr

call q20curs a20loop: call b10inpt cmpacthlen,0 je a30 call d10hour call e10rate call f10mult call g10wage call k10disp jmp a20loop a30:

;call timedate mov ax,0600h call q10scr ret

begin endp

;------------------------------------------- ; Input hours&rate ;

b10inpt proc near lea dx,messg1 mov ah,09h int 21h lea dx,hrspar mov ah,0ah int 21h cmpacthlen,0 jne b20 ret b20: mov col,25 call q20curs lea dx,messg2 mov ah,09h int 21h lea dx,ratepar mov ah,0ah int 21h ret

b10inpt endp

;-------------------------------------------- ; Process hours: ; --------------