汇编语言实验报告
更新时间: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子程序流程图
入口 保护用到的寄存器 获取当前显示页号 读取一个字符并显示 否 是否读到字符串末尾? 是 显示换行,回车 恢复使用过的寄存器 出口
正在阅读:
汇编语言实验报告12-29
会计基础 - 8套(附答案)07-02
预应力混凝土T梁冬季施工浅析03-08
道路运输驾驶员继续1-9单选题09-08
A1 技术支持的学情分析 教案04-06
精益生产CI考试试题(附答案)03-03
生活随笔美文11-21
SEO学习入门教程08-17
现代写作教程_复习重点05-21
工程项目成本控制方法研究06-03
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 汇编语言
- 实验
- 报告
- GSP认证申报资料要求云食药监市〔2014〕16号附件
- 吕梁煤业公司全员安全生产风险抵押金考核办法
- ==市学校食堂餐饮服务食品安全专项整治实施方案
- 为什么湿热下注会引起遗精? docx
- 宿州市国有土地上房屋征收与补偿暂行办法
- 外国语学校校园文化建设工程施工方案(可编辑)
- 计算机基础笔试模拟题
- 三亚市2018年中考预测题及答案汇总
- 配套K12七年级生物上册 3.3绿色植物参与生物圈的水循环教案(新版)新人教版
- 最新应用文写作期末考试试题资料
- 2019年中国高校行业市场前瞻与未来投资战略分析报告目录
- 一个研究生的国考经验与心得 - 图文
- 最新整理水务局安全感和满意度工作实施方案 docx
- 共青团中国地质大学(武汉)委员会文件
- 某县城区排水管网工程初步设计评审意见
- 西交《公司财务分析》在线作业15秋100分答案
- 防治执行腐败应尽快对新罪名适用问题进行解释
- 《尔雅》的编纂旨趣-分类思想与训释逻辑的论文 - 0
- 六年级语文下册第二单元6北京的春节教案2新人教版
- 基于无线传感器网络的智能家居安防监控系统概述