汇编语言程序设计教学资料-项目七案例.doc
教学案例任务描述:企业要求员工编程实现以下功能: 课后习题2建立的文件按下面的要求编写程序:(1) 把所有的记录读入内存的数据缓冲区TABLE;(2) 显示字符串提示用户输入零(配)件号及其数量;(3) 按零件搜索TABLE;(4) 如果发现所要求的零件,用它的单价计算出总价(单价数量);(5) 显示零(配)件说明及总价值。参考源程序: TITLEREAD11.EXE;利用文件代号式读并计算显示程序;Read disk records created by hancreat;-.modelsmall.stack100h.dataendcdedb0;结束处理指示pathnamedbfilename.lst, 0in_mes1db请输入3位数的零件号Part#:, $in_mes2db请输入该零件的数量:, $out_mes1db输入的不是数字!请重新输入数字:, $out_mes2db输入的零件号不存在!请重新输入3位数的零件号Part#:, $in_bufferdb6, ?, 6 dup(20h);输入缓冲区messagedb Part# Description Sum_Price, 0dh, 0ah,$tacklinedb | $sum_price dw0, 0decimaldb10 DUP(0), $crlfdb0dh, 0ah, $handledw?tabledb19*100 DUP( );table,足够大errcdedb0 ;错误处理指示opnmsgdb*open error*, 0dh, 0ahreadmsgdb*read error*, 0dh, 0ah;-.codebeginprocfarmovax, datamovds, axmoves, axmovax, 0600hcallscreen;清屏callcurs;设置光标callopenh;打开文件,设置TABLEcmpendcde, 0;打开错误吗?jnza0;错误,转结束callreadh;读磁盘记录cmpendcde, 0;读错误吗?jnza0;错误,转结束callin_Part;没错,输入零件号和零件数量a0:movax, 4c00h;退出程序,返回DOSint21hbeginendp;-;打开文件openhprocnearmovah, 3dhmoval, 0leadx, pathnameint21hjcbbb;打开错误吗?movhandle, ax;没有错,保存文件代号retbbb:movendcde, 01;打开错误,指示结束处理leadx, opnmsgcallerrm;显示出错信息retopenhendp;-;读磁盘记录readhprocnearmovah, 3fhmovbx, handlemovcx, 19*100;准备读入的字节数leadx, tableint21h jcc1;读错误吗?cmpax, 0;文件已读完吗?jec2;读完,退出cmptable, 1ah;文件结束符吗?Jec2movbp, ax;读成功则在AX中返回实际读入的字节数存入bpretc1:leadx, readmsg;读错误callerrm;显示出错信息c2:movendcde, 01;读错误或文件读完,指示结束处理retreadhendp;-;输入零件号和零件数量in_Partprocnearleadx, in_mes1;显示提示信息,提示输入零件号in_Part1:callinput;输入数据cmpin_buffer+1, 3;输入的零件号个数是3位吗?leadx, out_mes2;显示提示信息,提示重新输入零件号jnein_Part1cldmovax, bp;取实际读入文件的字节数movcl, 19;每个记录的长度为19个字符divcl;计算实际读取的记录数在al中movbl, almov bh, 0;从第0个记录开始顺序查找in_Part2:leasi, in_buffer+2;查找零件号对应的零件leadi, tablemoval, 19mulbhadddi, ax;计算某个记录的首地址movword ptr decimal, di;保存首地址movcx, 3repecmpsbjein_Part3;找到对应的零件incbh;找下一个记录cmpbh, bljbin_Part2jmpin_Part1;未找到对应的零件重新输入in_Part3:leadx, in_mes2;显示提示信息,提示输入零件数量callinput;输入数据calldec_bin;将输入数据转换为二进制数,在bx中movdi, word ptr decima;di指向该记录的首地址movax, di+15;取单价mulbx;总价格在(dx),(ax)中movsum_price, axmovsum_price+2, dxcalldisp_rec;显示信息retin_Partendp;-;输入数据inputprocnearinput1:movah, 09h;显示字符串int21hmovah, 0ah;输入字符串leadx, in_bufferint21hleadx, out_mes1;显示提示信息movcl, in_buffer+1cmpcl, 0;输入的数字个数为0吗?jzinput1movch, 0movbx, 2input2:moval, in_bufferbx;输入的是数字09吗?cmpal, 0jbinput1cmpal, 9jainput1incbxloopinput2retinputendp;-;将十进制数转换为二进制数子程序dec_binprocnearmovbx, 0movsi, 2movcl, in_buffer+1movch, 0transfer: moval, in_buffersi;从十进制的高位到低位取数andal, 0fh;将ascii码转换为十进制数mov ah, 0pushcxxchgax, bx;十进制数高位10+低位 = 二进制数movcx, 10mulcxaddbx, ax;转换的二进制数在(bx)中popcxincsilooptransferretdec_bin endp;-;显示记录disp_recprocnearcalldisp_crlfleadx, message;显示标题movah, 09hint21hleadx, tackline;显示输出“ | ”movah, 09hint21hmovah, 40h;向标准输出设备(文件代号=01)写文件movbx, 01;标准输出设备的文件代号=01movcx, 3;显示3位数的零件号movdx, word ptr decima;dx指向该记录的首地址int21hleadx, tackline;显示输出“ | ”movah, 09hint21hmovah, 40h;向标准输出设备(文件代号=01)写文件movbx, 01;标准输出设备的文件代号=01movcx, 12;显示12位的零件说明movdx, word ptr decima;dx指向该记录的首地址adddx, 3int21hleadx, tackline;显示输出“ | ”movah, 09hint21hcallbin_dec;总价格转换为十进制数显示leadx, tackline;显示输出“ | ”movah, 09hint21hcalldisp_crlfretdisp_recendp;-;4字节二进制数转换为10进制子程序bin_decprocnearmovbx, 0;10字节的bcd码单元清0movcx, 10bin_dec1:movdecimalbx, 0incbxloopbin_dec1movcx, 4*8;4字节二进制数共4*8=32位bin_dec2:movbx, 10-1;计算(a31*2+a30)*2+a29).)*2+a0shlword ptr sum_price,1;4字节二进制数左移1位rclword ptr sum_price +2,1pushcxmovcx, 10bin_dec3:moval, decimalbx;计算(.)*2+ai,ai由进位位带入adcal, alaaa;非压缩bcd码加法调整movdecimalbx, aldecbxloopbin_dec3popcxloopbin_dec2calldispretbin_decendp;-dispprocnear;显示输出子程序movcx, 10movbx, 0disp1:adddecimalbx, 30h;变为ascii码incbxloopdisp1movcx, 10;下面5条指令是为了不显示数据左边的“0”cldleadi, decimalmoval, 30h;30h为“0”的ascii码repescasbdecdimovdx, dimovah, 09hint21hretdispendp;disp子程序结束;-;屏幕上卷screenprocnear;入口参数为axmovbh, 1eh;设置颜色movcx, 0;屏幕左上角movdx, 184fh;屏幕右下角int10hretscreenendp;-;设置光标cursprocnearmovah, 2;设置光标movbh, 0movdh, 0;行号movdl, 0;列号int10hretcursendp;-;显示出错信息errmprocnearmovah, 40h;向标准输出设备(文件代号=01)写文件movbx, 01;标准输出设备的文件代号=01movcx, 20int21hreterrmendp;-disp_crlfprocnear ;显示回车换行符子程序leadx, crlfmovah, 09hint21hretdisp_crlfendp ; disp_crlf子程序结束; -endbegin