MCS_8086习题4_答案.doc_第1页
MCS_8086习题4_答案.doc_第2页
MCS_8086习题4_答案.doc_第3页
MCS_8086习题4_答案.doc_第4页
MCS_8086习题4_答案.doc_第5页
免费预览已结束,剩余14页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

习题4答案:1. 从屏幕上输入大写字母,转换为小写字母并输出(生成.COM文件)要求:程序具有可读性、容错性code segment paraassume cs:code, ss:ss_seg, ds:dataorg0100Hmain proc farmain1:leadx, str1;显示提示信息movah, 9int21hmovah, 1;输入小写字母int21hcmpal, A;判断输入字符是否为azjberrorcmpal, Zjaerrorjmpnexterror:leadx, str2;显示错误提示信息movah, 9int21hjmpmain1;跳转,重新输入next:subal, 20hpushaxleadx, str3;显示输出提示信息movah, 9int21hpopaxmovdl, al;显示转换后的大写字母movah, 2int21hmovax, 4c00h;返回操作系统int21hmain endpstr1db0dh, 0ah, Please input(a-z): $str2db0dh, 0ah, The input is error!$str3db0dh, 0ah, The result is: $code endsend main2. 编写一子程序asc2bin,将ASCII转换为二进制数要求:输入参数:AL中存放需要转换的ASCII输出参数:AL中存放转换后的二进制数并返回;功 能:将ASCII转换为二进制数;输入参数:AL中存放需要转换的ASCII;输出参数:AL中存放转换后得到的二进制数asc2binprocsubal, 30hcmpal, 9jbeasc2bin_1subal, 7asc2bin_1: retasc2binendp3. 内存中存放8个16位有符号数,求8个数值之和,并将结果存放在内存变量SUM中注:程序中应用到字扩展为双字的指令CWDdata segment parabufdw-1, 30000, 35000, 36000, 37000, 20000, 10000, -2sumdd0data endsss_seg segment stackdw100 dup(0)ss_seg endscode segment paraassume cs:code, ds:data, ss:ss_segmain proc farmovax, datamovds, axleabx, buf;bx指向buf首地址movcx, 8main1:movax, bxcwd;有符号数字扩展为双字addword ptr sum, ax;32位数相加adcword ptr sum + 2, dxincbxincbxloopmain1;循环8次movax, 4c00hint21hmain endpcode endsend main4. 内存中存放8个8位有符号数,请按从大到小顺序排列data segment parabufdb-1, 30, 35, 36, 37, 20, 100, -2data endsss_seg segment stackdw100 dup(0)ss_seg endscode segment paraassume cs:code, ds:data, ss:ss_segmain proc farmovax, datamovds, axmovcx, 8main1:movbx, 0;外循环movdi, 0pushcxmain2:moval, bufbx;内循环cmpal, bufbx+1jgenextxchgal, bufbx+1;不符合规则, 则交换数据movbufbx, almovdi, 1next:incbxloopmain2popcxcmpdi, 0;判断内循环是否发生数据交换jzexitloopmain1 exit:movax, 4c00hint21hmain endpcode endsend main5. 内存中有8个16位数,请编写程序将8个数倒序排放例:定义内存中8个数bufdw100, 3, 1, 20, 40, -2, 7, 10程序运行后,buf开始应为:buf dw 10, 7, -2, 40, 20, 1, 3, 100data segment parabufdw-1, 30000, 35000, 36000, 37000, 20000, 10000, -2data endsss_seg segment stackdw100 dup(0)ss_seg endscode segment paraassume cs:code, ds:data, ss:ss_segmain proc farmovax, datamovds, axmovbx, 0movcx, 8main1:pushbufbxincbxincbxloopmain1;8个数依次入堆栈leabx, bufmovcx, 8main2:popbxincbxincbxloopmain2;8个数依次出栈movax, 4c00hint21hmain endpcode endsend main6. 从键盘输入4位十进制数,然后以16进制形式显示在屏幕上.例:键盘输入:1024屏幕上应显示:0400H要求:键盘输入和显示结果时均应有提示data segment parabufdb4 dup(0)vardw0str1db0dh, 0ah, Please input four numbers(0-9): $str2db0dh, 0ah, The input is error, please try again. $str2db0dh, 0ah, The hex result is: $data endsss_seg segment stackdw100 dup(0)ss_seg endscode segment paraassume cs:code, ds:data, ss:ss_segmain proc farmovax, datamovds, axmain1:leadx, str1;显示数据输入提示信息movah, 9int21hmovbx, 0movcx, 4;循环输入4个数main2:movah, 1;DOS功能调用,输入数据int21hcmpal, 0;判断输入字符是否为0-9jberrorcmpal, 9jaerror;若不为0-9,则进行错误处理subal, 30h;ASCII转换为二进制,得到0-9movbufbx, al;存入buf开始的缓冲区incbxloopmain2jmpnext;数据输入正确后,跳转到后续处理error:leadx, str2;显示错误提示信息movah, 9int21hjmpmain1;跳转到重新输入next:movax, 0;(0*10+B3)*10+B2)*10+B1)*10+B0movdx, 0;得到输入的4位十进制数movsi, 10movbx, 0movcx, 4main3:mulsi;相乘后dx仍然保持0movdl, bufbxmovdh, 0addax, dxincbxloopmain3;循环4次乘10movvar, ax;得到的4位十进制数存放到var中leadx, str3movah, 9int21h;显示输出提示符movch, 4;以16进制显示输入的数据, 循环4次movcl, 4main4:rolvar, cl;循环左移4位movax, varandax, 000fhcallbin2asc;二进制转换为ASCIIcallpchar;显示16进制decchjnzmain4moval, Hcallpcharmovax, 4c00hint21hmain endp;功能:将一个二进制数转换为ASCII;输入参数:AL中存放要转换的二进制数;输出参数:AL中存放转换后的ASCIIbin2ascprocandal, 0fhaddal, 30hcmpal, 39hjbebin2asc_1addal, 07hbin2asc_1:retbin2ascendp;功能:显示字符;输入参数:AL中存放要显示字符的ASCII;输出参数:无pcharprocmovdl, almovah, 2int21hretpcharendpcode endsend main7. 数据段从100H开始存放字符串str1,从200H开始存放str2,二者均以NULL字符为结束符,编写程序将str2拷贝到str1末尾,形成一个完整字符串例:ORG 100Hstr1db0dh, 0ah, Hello , 0ORG200Hstr2dbAutomation!, 0程序运行后结果应为:str1db0dh, 0ah, Hello Automation!, 0data segment paraORG100Hstr1db0dh, 0ah, Hello , 0ORG200Hstr2dbAutomation!, 0data endsss_seg segment stackdw100 dup(0)ss_seg endscode segment paraassume cs:code, ds:data, ss:ss_segmain proc farmovax, datamovds, axmoves, axleadi, str1;es:di指向str1首地址moval, 0repnzscasb;查找str1结束符NULLdecdi;找到str1结束符,并让es:di指向该位置leasi, str2;ds:si指向str2首地址cld;DF = 0main1:lodsb;AL (ds:si), si = si + 1stosb;(es:di) AL, di = di + 1cmpal, 0;判断是否到str2的结束符jnzmain1leasi, str1;ds:si指向拷贝后的str1首地址main2:lodsb;显示拷贝后的str1字符串cmpal, 0jzexitcallpcharjmpmain2exit:movax, 4c00hint21hmain endp;功能:显示字符;输入参数:AL中存放要显示字符的ASCII;输出参数:无pcharprocmovdl, almovah, 2int21hretpcharendpcode endsend main8. 以10进制形式显示内存中一有符号字节数据例:vardb0ffH屏幕应显示:The result is: -1data segment paravardb7fhstr1db0dh, 0ah, The result is: bufdb4 dup( )db$data endsss_seg segment stackdw100 dup(0)ss_seg endscode segment paraassume cs:code, ds:data, ss:ss_segmain proc farmovax, datamovds, axmovbuf, +cmpvar, 0;判断var是正数,还是负数jgenextmovbuf, -negvar;若var为负,则得到其相反数next:moval, varmovcx, 3movdl, 10leabx, buf+3main1:movah, 0divdl; (AX / 10)商 aladdah, 30h; (AX / 10)余数 ahmovbx, ahdecbxloopmain1;循环3次,分别得到百、十、个位leadx, str1;显示10进制数movah, 9int21hexit:movax, 4c00hint21hmain endpcode endsend main9. 将一个16位的无符号数var, 转换为非压缩格式BCD码,存放在内存中buf开始的单元中。(按高位在前、低位在后的顺序存放)data segment paravardw800Hbufdb5 dup(0)data endsss_seg segment stackdw100 dup(0)ss_seg endscode segment paraassume cs:code, ds:data, ss:ss_segmain proc farmovax, datamovds, axmovcx, 16;(0*2 + B15)*2 + B14)*2 + + )*2 + B0main1:shlvar, 1;得到var的Bi位leabx, 4pushcxmovcx, 5main2:moval, bufbx;执行buf*2 + Bi操作adcal, alAAA非压缩格式BCD码调整movbufbx, aldecbxloopmain2;内循环为5次popcxloopmain1;外循环为16次exit:movax, 4c00hint21hmain endpcode endsend main选作题:10. 内存中从str开始存放一字符串,结束符为NULL字符,请编写程序统计该字符串中单词的个数例:str1db0dh, 0ah, Hello world, welcome to DUT. CPU is central processing unit!, 0h统计.中的单词个数,结果为10datasegmentparastr1dblong long ago, there lived a king, the king asked the artist to dbdraw a horse for him ,0wordsdw0dataendsss_segsegmentstackdb256dup(?)ss_segendscodesegmentassumecs:code,ds:data,ss:ss_segmainprocfarpushdsxorax, axpushaxmovax, datamovds, axmovcx, 0;用cx存放单词数leasi, str1movbl, ;bl总保存当前字符的前一个字符cldmain_3:lodsbandal, al;判断al是否为结束符0jzmain_1cmpal, ;比较是否是空格jnzmain_2main_4:cmpbl, ;比较前一个字符是否为空格,不是则此空格;不能算一个单词jzmain_5cmpbl, ,;比较前一个字符是否为逗号,如果是则此空;格也不能算一个单词jzmain_5inccx;只有当前字符为 或,而且前一个字符为有;效字符时,才对单词数加1jmpmain_5main_2:cmpal, ,;比较是否是,号jzmain_4main_5:movbl, al;进入这里表明此时al中内容不是0, , ,三种;符号,保存al到bljmpmain_3main_1:cmpbl, ;判断结束符前面是否为单词,还是为一个 或,jzmain_6cmpbl, ,jzmain_6inccx;若结束符前是一个有效字符,那么单词数应该加1main_6:movwords, cxretmainendpcodeendsendmain11 编写程序用键盘17键,模拟7个音符,进行键盘演奏!注:需要对8253的定时器2和8255的PB口进行初始化datasegmentparaTable_Ldw131,147,165,175,196,220,247,262 ;低音1-7的频率Table_Mdw262,294,330,349,392,440,494,523 ;高音1-7的频率shift_1equ21hshift_2equ40hshift_3equ23hshift_4equ24hshift_5equ25hshift_6equ5Ehshift_7equ26hshift_8equ2Ahdataendsss_segsegmentstackdb256dup(?)ss_segendscodesegmentassumecs:code,ds:data,ss:ss_segmainprocfarpushds;将psp+0h处段地址和偏移量压入堆栈以便返回OSxorax, axpushaxmovax, data;装载数据段寄存器ds,使之指向当前数据段movds, axmain_1:movah, 0;利用bios的16号中断,扫描键盘按键int16h ;AL中返回按键ASCII码,AH中返回按键扫描码cmpal, 0dh;判断是否为回车键,是回车键就退出jzmain_exitcmpal, 1jbmain_2cmpal, 8jamain_2andax, 000fh;说明按下的是低音1-7,与操作将ASCII;码转换到数字1-8decal;将数值转换成以0开始的数字,以便从表中查找频率值shlal, 1;将数值乘以2,因每个频率值是字变量leabx, Table_Lmain_12:movsi, axmovdi, bx+si;从表中取频率值movbx, 5000;发声时间callGenSoundjmpmain_1main_2:cmpal, shift_1;判断是否按下shift+1键jnzmain_3movax, 0jmpmain_11main_3:cmpal, shift_2;判断是否按下shift+2键jnzmain_4movax, 2jmpmain_11main_4:cmpal, shift_3;判断是否按下shift+3键jnzmain_5movax, 4jmpmain_11main_5:cmpal, shift_4;判断是否按下shift+4键jnzmain_6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论