汇编语言实验报告

更新时间:2023-12-29 13:57:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验一 Masm6.11的使用方法

一、实验目的

1、创建一个新的汇编语言程序,熟练掌握汇编语言开发工具的使用方法,并对开发环境中一些坏境变量进行设置。

2、创建一个工程文件,对该工程文件进行编译,连接,并运行; 3、对建立的工程文件进行调试,在运行过程中查看各个寄存器的值,内存单元的值等。

二、实验环境

该试验包括的硬件和软件条件如下: 1、硬件环境 (1)INTEL I3 (2)内存4g 2、软件环境

(1)Window XP Professor VMware虚拟机 (2)MASM6.11开发软件

三、实验步骤

1、将Masm6.11安装程序拷贝到D盘根目录下,并执行d:\\Masm611目录下Setup.exe文件,按照安装提示将程序安装到C盘根目录。

2、将C:\\masm611\\Bin目录下的所有文件拷贝到C:\\Masm611\\binr目录下,将C:\\Masm611\\help目录下的所有文件拷贝到c:\\Masm61\\binr目录下。 3、执行C:\\Masm611\\Binr目录下的pwb.exe文件,打开开发环境。 4、在PWB编辑窗口中输入实验1.1中的程序,并保存为test.asm文件。 5、执行Project菜单下New Project子菜单创建一个新的工程文件,并命名为test.mak,将test.asm文件加入到该工程文件中。

6、执行Project下Build子菜单编译连接该工程文件,并运行该可执行程序,观察程序执行的结果。

7、执行Run菜单下Debug子菜单,进入调试环境。

8、在程序的如下位置设置断点,并按要求观察寄存器堆栈或者内存单元的值。

Data segment

Msgl db \ Num db 0

EnMsg db 0ah,0dh,'$'

Msg2 db \ Msg3 db \ avg db 0

ascavg db 0,0,'$' Data ends

Stack segment para stack db 20h dup(0) Stack ends

code segment

Assume Cs:code,Ss:stack,ds:Data

Start: mov ax,data mov ds,ax

lea dx,Msgl ;此行设置断点,观察DS所指示的数据段的情况 mov ah, 09h int 21h

Call Numproc ;此行设置断点,观察屏幕输出,并观察堆栈的变化 mov num,bl ;此行设置断点,观察bl的值,并观察堆栈的变化 lea dx,EnMsg mov ah,09h int 21h lea dx,Msg2 mov ah,09h int 21h

call Avgproc ;此行设置断点,观察屏幕输出信息

lea dx,EnMsg ;此行设置断点,观察avg所对应的存储单元的值 mov ah,09h int 21h lea dx, Msg3

mov ah,09h int 21h

call bta ;此行设置断点,观察屏幕输出信息 mov ah,4ch ;此行设置断点,观察ascavg所对应的存储单元的值及屏 ;幕输出信息 int 21h

Numproc proc push ax

push cx push dx

lea dx,EnMsg mov ah,09h int 21h mov bl,0 lop1: mov ah,01h

int 21h ;设置断点观察al寄存器的值 cmp al,0dh jz lop2 cmp al,'0' jl lop1 cmp al, '9' ja lop1 sub al,30h mov cl,al mov al,bl mov ch,10

mul ch

mov bl,al ; add bl,cl ; jmp lop1 lop2: pop dx pop cx pop ax ret

Numproc endp

Avgproc proc push ax push cx

xor dx,dx ; mov cl,num ;lop3: call Numproc xor ax,ax mov al,bl add ax,dx Div num

add avg,al ; xor dx,dx mov dl,ah sub cl,1 jnz lop3 pop ax

设置断点观察al寄存器的值 设置断点观察bl寄存器的值 设置断点观察堆栈值的变化 设置断点观察cl寄存器的值 设置断点观察avg存储单元的值 pop cx

ret ;设置断点观察堆栈值的变化 Avgproc endp bta proc

push ax ;设置断点观察堆栈值的变化 push bx xor ax,ax

mov al,avg mov bl,10 div bl

add ah,30h ;设置断点观察ax寄存器的值 add al,30h

mov ascavg ,al ;设置断点观察ascavg存储单元的值 mov ascavg+1,ah lea dx,EnMsg mov ah,09h int 21h

lea dx,ascavg ;设置断点观察dx寄存器的值 mov ah,09h int 21h pop bx pop ax ret

bta endp code ends end start

9、按照程序的执行过程绘制出程序流程图。

四、实验结果及其分析

1. 安装MASM6.11:双击setup.exe后按所给提示进行安装(基本上都是回车,中间不需要做什么更改),安装完成后将BIN和HELP文件夹里面的文件拷贝到BINR文件夹里面如图1.1所示。所有安装工作完成之后打开PWB.exe集成开发环境应用程序。

2. 在File菜单中单击New选项进入编辑源代码的界面,输入实验指导书中例1.2中的代码如图1.2所示:

图1.1

图1.2

3. 保存上述文件,并建立工程文件,将上面的保存的文件作为该工程文件的一个文件:

在File菜单中单击Save选项,保存源代码为12.ASM文件,在Project菜单中单击New Project选项建立新的工程名为aaa,并添加12.ASM文件,如图1.3所示.

图1.3

4. 编译连接上述工程文件,并运行该程序:

在Project菜单中点击Rebuild all选项,如果没有错误, 如图1.4所示,再点击Run Pogram,进入运行界面运行程序得到运行结果如图1.5所示

图1.4

图1.5

5. 调试上述程序。 调试工具:debug32

(1)DS数据段的前后变化情况如下图

(2)调用21h号中断的9号子程序(屏幕输出程序)后,屏幕输出情况及堆栈的变化情况如下图

(3)Numproc:调用21h号中断的1号子程序(键盘输入程序),输入3后,al寄存器的值如下

之后al寄存器和bl寄存器的值如下

第二次循环输入回车后al就存储了回车键的ASCII码,如图

后面的子程序调用Numproc的情况也大同小异,在此就不一一展示。 (4)从Numproc子程序返回后的堆栈的变化情况如下

可以看到IP出栈,同时bl的值为3

之后调用21h号中断的9号子程序后,幕输出情况如下

(5)Avgproc:开始时的堆栈情况,以及cl的值如下

然后接着转入了Numproc子程序。

在Numproc子程序中完成输入后,查看avg存储单元的值(共3此循环),分别如下

从Avgproc子程序返回后,堆栈的变化情况如下

(6)从Avgproc子程序返回后,主屏幕输出信息和avg所对应的存储单元的值如下

(7)将Msg3传入后调用21h中断的的9h号子程序,屏幕输出如下

(8)bta:查看堆栈情况,可以看到ip,ax,bx依次入栈

执行除法命令,将ax中的值(avg)除以10(0ah),并将商(十位)和余数(个位)分别存到al和ah中,然后分别加上30h以转换成ASCII码。如下

然后将ax中的值传入ascavg的内存字中,如下

最后将ascavg内存字单元的偏移地址传入dx中,如下

(9)在子程序bta返回后,内存字单元ascavg的值如下

屏幕输出的结果信息如下

最后用21h中断的4ch子程序结束程序,调试完成。

6.程序的流程框图:

主函数流程图,如图1.13所示

结束 调用bta,把avg的由ASCⅡ转换真值,并显示 调用Avgproc,输入每个学生的成绩,并将平均成绩送给avg 显示输入提示信息msg2 调用Numproc输入学生总数:Num,并将Num由真值转换成对应的ASCⅡ 显示输入提示信息msg1 开始 图1.13主函数流程框图

函数Numproc的流程图如图1.14 Avgproc的流程图如图1.15所示 入口 push ax ; push cx; push dx 显示回车换行 输入一个字符到al al=odh N Y al<0 N Y Y al>9 N al-30h→cl bl→al mov ch 10 al*ch→al; al→bl add bl,cl pop dx ; pop cx ;pop ax 返回 图1.14

入口 push ax; push cx; 将num的值送给cl 调用Numproc输入各个学生的成绩,并将每个成绩由字符类型转换成数字类型,除以num后累加给avg Cl=C1-1 Cl==0 pop cx ;pop ax 返回 图1.15

函数bta的流程图如图1.16所示

返回 输出结果 显示提示信息EnMsg mov ascavg,al mov ascavg+1,ah add ah,30h add al,30h mov bl,10 div bl 对ax清零后将avg的值送给ax push ax; push cx; 开始 图1.16

五、结论

通过本次实验,我掌握了使用masm611去编译和连接一个汇编源程序的方法,并且学会了使用debug32进行调试、追踪。熟悉了一些基本指令的使用方法,和一些基础的中断服务程序的使用方法。并且掌握了十六进制数字转换成ASCII码的一种方法。

实验二 比较两个字符串的大小

一、实验目的

本次实验主要达到如下目的:

1、进一步熟悉MSAM6.11软件的使用方法。

2、从键盘输入两个字符串,比较两个字符串的大小。如果第一个字符串比第二个字符串大,则显示1;如果两个字符串相等,则显示0;如果第一个字符串比第二个字符串小,则显示-1.

二、实验环境

该试验包括的硬件和软件条件如下: 1、硬件环境 (1)INTEL I3 (2)内存4g 2、软件环境

(1)Window XP Professor VMware虚拟机 (2)MASM6.11开发软件

三、实验步骤

1、画出实现上述功能的汇编语言程序流程图。 2、写出实现上述功能的汇编语言程序。

3、编译、连接编写的汇编语言程序,并运行生成的可执行文件,描述其执行情况。

4、对上述程序进行调试,比较反汇编后的程序和源程序的区别。 5、描述反编译后的程序在执行之前数据段的内容以及调试过程中各寄存器的变化情况和执行结束后数据段的内容。

四、实验结果及其分析

1、源代码:

assume cs:code,ds:data,ss:stack

data segment

msg1 db \ msg2 db \ msg3 db \ result db 3 dup(0) string1 db 100 dup(0)

string2 db 100 dup(0) data ends

stack segment db 32 dup(0) stack ends

code segment start:

mov ax,stack mov ss,ax mov sp,32

mov ax,data mov ds,ax

lea si,msg1 call puts

lea di,string1 call gets lea si,msg2 call puts

lea di,string2 call gets lea si,msg3 call puts

lea si,string1 lea di,string2 call strcmp lea si,result mov [si],ax call puts

mov ah,0 int 16h

mov ax,4c00h int 21h

;将字符串首地址通过si传入,字符串结束标志为ASCII 0 puts proc push ax push bx

mov ax,data mov ds,ax

;取当前页号 mov ah,0fh int 10h

;用int 10h的0eh号子程序显示字符 mov ah,0eh cld read: lodsb cmp al,0 je done_read int 10h

jmp short read

done_read:

;输出一个回车和换行 mov al,0ah int 10h mov al,0dh int 10h

pop bx pop ax ret puts endp

;将存储首地址通过di传入,并在字符串末位添加结束标志ASCII 0 gets proc push ax push bx push cx mov cx,1

mov ax,data mov es,ax

;取当前页号 mov ah,0fh int 10h

cld

get_in:

;用int 16h的0号子程序读键盘缓冲区,并显示字符 mov ah,0 int 16h cmp al,0dh je done_get_in cmp al,08h je backspace cmp al,20h

jb short get_in mov ah,0eh int 10h stosb

jmp short get_in backspace:

;退格后清除光标处字符并使di减一 mov ah,0eh int 10h

mov ax,0a20h int 10h dec di

jmp short get_in

done_get_in:

;以ASCII 0 结束字符串,并输出一个回车和换行 xor al,al stosb

mov ax,0e0ah int 10h mov al,0dh int 10h

pop cx pop bx pop ax ret gets endp

;用si和di分别传入两个字符串,按字典顺序比较,ax的值作为比较结果返回 strcmp proc mov ax,data mov ds,ax mov es,ax

cld str_cmp:

;先看第一个字符串是否已到结尾,不结尾就和第二个字符串比较 mov ah,[si] cmp ah,0 je cmp_0 cmpsb ja bigger jb smaller

jmp short str_cmp

cmp_0:

;第一个字符串已到结尾,若第二个字符串不结尾则第一个串小,否则相等 mov al,[di] cmp ah,al jb smaller

jmp short eaqual

bigger:

mov ax,'1' ret smaller:

mov ax,'1-' ret eaqual:

mov ax,'0' ret

strcmp endp

code ends end start

2、程序流程图如下

主函数流程图 开始 调用puts子程序, 显示第一条提示信息

调用gets子程序, 输入第一个字符串

调用puts子程序, 显示第二条提示信息 调用gets子程序, 输入第二个字符串 调用strcmp子程序, 比较两个字符串的大小 显示输出结果 结束

puts子程序流程图

入口 保护用到的寄存器 获取当前显示页号 读取一个字符并显示 否 是否读到字符串末尾? 是 显示换行,回车 恢复使用过的寄存器 出口

gets子程序流程图

入口 保护用到的寄存器 获取当前显示页号 从键盘缓冲区 读取一个字符 否 回车? 否

指针减一,并删 除屏幕上的字符 否 退格键? 是 是 否 是否为可打印字符? 是 储存并回显 字符串末尾加入结束符 恢复使用过的寄存器 出口

strcmp子程序流程图

入口 是 第一个字符串是否到末尾? 否 比较两字符大小 第二个字符串是否到末尾? 是 大于? mov ax,’0’ 否 mov ax,’1’ 否 小于? 是 ’1-’ mov ax, 出口 3、编译、连接汇编源程序,运行可执行文件,三次字符串比较的结果如下

第一次小于

第二次等于

第三次大于

4、程序调试结果如下

(1)反汇编后查看到的汇编代码如下

(2)初始情况的数据段的内容如下

(3)调用puts子程序后ip入栈,栈中内容如下

(4)puts子程序返回后屏幕输出如下

(5)调用puts子程序分别输入两个个字符串

(6)两个字符串在数据段中的存储情况如下

(7)调用strcpm子程序后,屏幕输出信息如下

(8)字符串比较结果由ax返回

(9)最后比较结果的输出信息如下

五、结论

通过这个实验我熟悉了子程序编写和调用的方法,并且熟悉了一些字符串处理指令和一些bios中断服务的使用方法,增加了调试程序并排除bug的经验。

实验三 求学生名次

一、实验目的

本次实验主要达到如下目的:

从键盘输入若干个学生(总数不超过500)的姓名(英文字母不超过8个)及其5门课程的总成绩(百分制),输出任意名次的学生的姓名及其5门课程的总成绩(按总成绩的高低排序,总成绩最高者为第一名)

二、实验环境

该试验包括的硬件和软件条件如下: 1、硬件环境 (1)INTEL I3 (2)内存4g 2、软件环境

(1)Window XP Professor 虚拟机 (2)MASM6.11开发软件

三、实验步骤

1、画出满足上述要求的程序流程图 2、写出源程序及程序段说明

四、实验结果及其分析

1、源代码如下

assume cs:code,ds:data,ss:stack

data segment

msg1 db \ msg2 db \ msg3 db \\

msg_name db \ msg_score db \ total dw 0 number dw 0

student struc

this_name db 9 dup(0) this_score db 4 dup(0) student ends

stu_array student 500 dup(<>) temp student <>

data ends

stack segment db 128 dup(0) stack ends

code segment start:

mov ax,data mov ds,ax mov es,ax

mov ax,stack mov ss,ax mov sp,128

lea si,msg1 call puts lea di,total call get_num lea si,msg2 call putsln

lea bx,total mov cx,[bx] xor bx,bx input_student:

lea si,msg_name call puts

lea di,stu_array[bx].this_name call gets

lea si,msg_score call puts

lea di,stu_array[bx].this_score call gets add bx,13

loop input_student

call sort_student

mov cx,13

select:

lea si,msg3 call puts lea di,number call get_num mov ax,[di] cmp ax,0

je select_null dec ax mul cl mov bx,ax

lea si,msg_name call puts

lea si,stu_array[bx].this_name call putsln

lea si,msg_score call puts

lea si,stu_array[bx].this_score call putsln

jmp short select

select_null: mov ah,0 int 16h

mov ax,4c00h int 21h

;将存储地址通过di传入 get_num proc push ax push bx push cx push es push di mov cx,1

push cs pop es

lea di,buffer

;取当前页号 mov ah,0fh int 10h

cld input_num:

;用int 16h的0号子程序读键盘缓冲区,并显示字符 mov ah,0 int 16h cmp al,0dh

je done_input_num cmp al,08h je backspace cmp al,'0' jb input_num cmp al,'9' ja input_num mov ah,0eh int 10h stosb

jmp short input_num backspace:

;退格后清除光标处字符并使di减一 mov ah,0eh int 10h

mov ax,0a20h int 10h dec di

jmp short input_num

done_input_num:

;输出一个回车和换行 xor al,al stosb

mov ax,0e0ah int 10h mov al,0dh int 10h

;字符串转换成数值 xor ax,ax xor cx,cx mov bx,10 lea di,buffer str_to_int:

mov cl,es:[di]

cmp cl,0 je done_STI mul bl sub cl,30h add ax,cx inc di

jmp short str_to_int

done_STI: pop di pop es

mov [di],ax pop cx pop bx pop ax ret

;字符串缓冲区

buffer db 6 dup(0) get_num endp

;将存储首地址通过di传入,并在字符串末位添加结束标志ASCII 0 gets proc push ax push bx push cx mov cx,1

mov ax,data mov es,ax

;取当前页号 mov ah,0fh int 10h

cld get_in:

;用int 16h的0号子程序读键盘缓冲区,并显示字符 mov ah,0 int 16h cmp al,0dh je done_get_in cmp al,08h je backspace

cmp al,20h jb get_in mov ah,0eh int 10h stosb

jmp short get_in backspace:

;退格后清除光标处字符并使di减一 mov ah,0eh int 10h

mov ax,0a20h int 10h dec di

jmp short get_in

done_get_in:

;以ASCII 0 结束字符串,并输出一个回车和换行 xor al,al stosb

mov ax,0e0ah int 10h mov al,0dh int 10h

pop cx pop bx pop ax ret gets endp

;将字符串首地址通过si传入,字符串结束标志为ASCII 0 puts proc push ax push bx

mov ax,data mov ds,ax

;取当前页号 mov ah,0fh int 10h

;用int 10h的0eh号子程序显示字符

mov ah,0eh cld read: lodsb cmp al,0 je done_read int 10h

jmp short read

done_read: pop bx pop ax ret puts endp

;用si和di分别传入两个字符串,先比较长度,长度相同再按顺序比较,ax的值作为比较结果返回 strcmp_len proc push si push di push bx push cx mov ax,data mov ds,ax mov es,ax

push si push di mov al,0 mov cx,-1 cld

str_len_di: inc cx scasb

jne str_len_di

mov di,si mov bx,-1 str_len_si: inc bx scasb

jne str_len_si

cmp cx,bx

jb smaller ja bigger

pop di pop si repe cmpsb mov ah,[si-1] mov al,es:[di-1] cmp ah,al jb smaller ja bigger

mov ax,1 pop cx pop bx pop di pop si ret bigger:

mov ax,2 pop cx pop bx pop di pop si ret smaller: mov ax,0 pop cx pop bx pop di pop si ret

strcmp_len endp

;排序学生记录 sort_student proc push ax push bx push cx push si push di

mov ax,data mov ds,ax

mov es,ax

lea bx,total mov cx,[bx] dec cx xor bx,bx circle_1: push cx push bx

lea si,stu_array[bx].this_score circle_2:

lea di,stu_array[bx+13].this_score call strcmp_len cmp ax,1 jnb next

call xchg_stu next:

add bx,13 loop circle_2 pop bx pop cx add bx,13 loop circle_1

pop di pop si pop cx pop bx pop ax ret

sort_student endp

;交换学生记录 xchg_stu proc push si push di push cx

sub di,9 sub si,9 push di push si

mov cx,data

mov ds,cx mov es,cx

cld

lea di,temp mov cx,13 rep movsb

pop di pop si mov cx,13 rep movsb

mov di,si sub di,13 lea si,temp mov cx,13 rep movsb

pop cx pop di pop si ret

xchg_stu endp

;将字符串首地址通过si传入,字符串结束标志为ASCII 0 putsln proc push ax push bx

mov ax,data mov ds,ax

;取当前页号 mov ah,0fh int 10h

;用int 10h的0eh号子程序显示字符 mov ah,0eh cld ln_read: lodsb cmp al,0

je ln_done_read

int 10h

jmp short ln_read

ln_done_read:

;输出一个回车和换行 mov al,0ah int 10h mov al,0dh int 10h

pop bx pop ax ret

putsln endp

code ends end start

2、程序流程框图

(1)主程序流程图

开始

(2)get_num子程序流程图 保护用到的寄存器 入口 提示输入学生总数并调用get_num函数进行输入 提示输入学生信息并调用gets函数进行输入 获取当前显示页号 从键盘缓冲区读取一个字符 否 调用sort_student 对学生进行排序 回车? 否 指针减一,并删 除屏幕上的字符

提示输入学生名次,并调用get_num进行输入 否 退格键? 是 否 读到的字符>’0’? 是 是 ax=0? N Y

调用puts函数打印对应名次的学生信息 读到的字符<’9’?

是 储存并回显 结束 将ASCII转换成数值

恢复使用过的寄存器 出口 (3)puts子程序流程图

入口 保护用到的寄存器 获取当前显示页号 读取一个字符并显示 否 是否读到字符串末尾? 是 显示换行,回车 恢复使用过的寄存器 出口

(4)gets子程序流程图 入口 保护用到的寄存器 获取当前显示页号 从键盘缓冲区 读取一个字符 否 回车? 否 指针减一,并删 除屏幕上的字符 否 退格键? 是 是 否 是否为可打印字符? 是 储存并回显 字符串末尾加入结束符 恢复使用过的寄存器 出口

(5)sort_student子程序流程图

入口 取学生总数,存到cx中;取第一个学生的首地址,保存到bx中 保护用到的寄存器 cx入栈,保存外层循环的计数器;取bx所指学生的成绩字段地址 取下一个学生的成绩字段地址,并且与bx所指学生的成绩比较 ax>1?(bx学生成绩是否 否大于当前学生成绩) 否 是 调用xchg_stu子程序交换两个学生项 cx--,cx = 0? 是 pop cx(取外层循环计数器); bx指向下一个学生项 cx--,cx = 0? 是 恢复用到的寄存器 出口

3.实验运行结果如下

五、结论

通过这个实验我熟悉了汇编语言结构体的使用,以及对结构体变量访问的方法。掌握了一种输入整数的方法,同时还熟悉了两个变量交换的方法,对子程序的编写和调试也更加娴熟。

实验四 求员工年工作量

一、实验目的

本次实验主要达到如下目的:

某单位在计算工作量时采用工作量=工作时间(小时)*系数,计算员工的工作量。其中工种不同其系数也不一样,该单位有很多不同的工种(不大于100)。请从键盘上输入每一位工人一年的工作时间(按小时计算,精确到小数点后一位)以及该工人的工种所对应的系数(精确到小数点后两位),球该单位所有员工(不超过1000人)一年的工作量。

二、实验环境

该试验包括的硬件和软件条件如下: 1、硬件环境 (1)INTEL I3 (2)内存4g 2、软件环境

(1)Window XP Professor VMware虚拟机 (2)MASM6.11开发软件

三、实验步骤

1、对上述问题进行分析,写出分析报告及相关算法; 2、写出各个模块的说明; 3、画出各个模块的流程图; 4、画出各个模块之间的调用关系; 5、编写程序实现上述要求。 6、写出满足上述要求的实验报告。

四、实验结果及其分析

1、分析实验要求并写出分析报告计算法:

本程序由三个部分组成:输入部分(包含输入员工数量,输入每位员工的年工作时间和输入每位员工的工种对应的系数);计算该公司所有员工的年总工作量;显示该公司所有员工的年总工作量。

在输入部分,须将十进制数ASCⅡ码转换成二进制数。因为年工作时间和工种可能存在小数,而工作时间的小数一般只有一位,工种系数的小数一般只有两

位,所以为了方便计算,将每一位员工的工作时间都乘以10,将每一个员工对应的工种系数都乘以100,从而去掉小数,做成整数运算。而这种算法是从键盘上一位一位的输入,当遇到小数点就直接去掉小数点,接收下一位数。所以在输入时要注意的是输入的工作时间必须包含一位小数(如351.0),输入的工种系数必须包含两位小数(如65.00)。

计算年总工作量的部分,将每位员工的工作时间和系数相乘,再累加到一个32位寄存器,使用32位寄存器可以保证所有员工的总工作量超过65535时的溢出问题,并且简化运算的复杂性。最后将值存放到一个dword的存储单元中。

在输出部分,首先应该将dword数值的每一位转换成对应的ASCII,这里我采用的是除以10取余的方法分离出数值的每一位,然后将分离出的数字加上30H转换成对应的ASCII,再将它存放到一个连续的储存单元中。用取余法求得的字符串是倒序的,所以在输出前要将字符串先翻转,同时在倒数第三位前添加上小数点,将结果缩小1000倍。最后输出的就是全体员工的总工作量。 2、该程序的主要模块及其说明如下:

(1)主程序模块

功能:主程序主要实现各模块之间的联系,显示提示信息,计算总工作量。 (2)输入及转换模块:get_num 入口参数:将存储地址通过di传入 出口参数:无

功能:一位一位的从键盘上接收,将非小数点的每一位数转换为相应其对应的BCD码,存在一个16位寄存器中。当输入的数中含有一位小数是就默认乘了10,含有两位小数就默认乘了100。最后将寄存器的值存入di所指的储存单元。

(3)计算模块:包含在主程序模块中

功能:循环读取每个员工的工作时间和工种系数,并将两数相乘后累加到一个32位寄存器当中,最后将寄存器中的值存到dword储存单元中。循环次数为员工的人数。

(3)输出及转换模块:put_3point 入口参数:将数值存放地址通过si传入 出口参数:无

功能:将si所指的储存单元地址中的数值转换成ASCII倒序的字符串,并将字符串翻转,同时在字符串的倒数第3位前插入小数点,最后将字符串逐位输出。

(4)输出字符串模块:puts

入口参数:;将字符串首地址通过si传入,字符串结束标志为ASCII 0 出口参数:无

功能:在屏幕上显示si所指首地址的字符串内容。 3.各模块的流程图

puts子程序流程图

入口 保护用到的寄存器 获取当前显示页号 读取一个字符并显示 否 是否读到字符串末尾? 是 显示换行,回车 恢复使用过的寄存器 出口

本文来源:https://www.bwwdw.com/article/n9ex.html

Top