




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理实验3实验设备:LAB6000通用微控制器实验系统实验用时10小时一、实验内容:汇编语言程序设计 。在了解8086/8088汇编语言后,编制并调试程序。1 编制不恢复余数除法程序 格式:最高两位为符号位 2 按IEEE754格式编制32位浮点数与32位定点数相互转换程序子程序(两个子程序)3 编制程序寻找100以内的质数,并从小到大排列。4、 编制8位(4字节)压缩BCD码加、减法程序。5、 编制8位(8字节)非压缩BCD码乘法和除法程序。二、实验报告:程序框图和源程序清单。第一题必做,其余任选两个第一题:这道题可以按照老师所讲的不恢复余数除法的步骤,一步一步把书上的文字描述“翻译”成汇编语言。1、执行第一次减法。2、判断结果的正负,这里我们通过比较结果与0100h的大小关系来实现,结果大于等于0100h,说明结果小于0;结果小于0100h,说明结果大于0,最终会溢出,程序结束3、如果上一次操作结果为正,则商1,被除数左移一位,减除数,跳转54、如果上一次操作结果为负,则商0,被除数左移一位,加除数,跳转55、判断上一次操作结果的正负6、上面的第3,4,5步循环4次之后结束,如果最后一次操作结果小于0,则还要再左移一位,加除数。这样就实现了8位除以4位的不恢复余数除法。这道题的难点在于正确理解不恢复余数除法的步骤,和每一步的意义。因为单纯翻译书上的内容很容易导致误解,只有真正理解了才能做出来。这里比对一下自己最后梳理出来的16步,就会发现与书上所说的16步稍有不同,但是也是正确的。程序流程图如下:程序代码:data segmentResult db 3 dup(?)x2 dw 0021hy2 dw 0040hcount db 0sign dw 0hdata ends;al保存被除数,bx第48位保存除数,ah,bh保存符号,即被除数为负,则ah=ffh,否则为0;ax的第48位保存余数,dx的低4位保存商code segment assume cs:code, ds:datastart proc near mov ax, data mov ds, ax mov ax, x2 mov bx, y2 mov cx, 4 sub ax, bx cmp ax, 0100h jb jieshu mov dx, 0 ;第一次为负 ;shl ax, 1 shl ax, 1 add ax, bx bijiao: cmp ax, 0100h jb zheng;为正,跳转减法 ;否则为负,执行加法 mov sign, 1 shl dx, 1;商0 add count, 1 cmp count, 4 jnb jieshu shl ax, 1 add ax, bx jmp bijiao;进行下一次比较zheng: mov sign, 0 shl dx, 1 add dx, 1 add count, 1 cmp count, 4 jnb jieshu shl ax, 1 sub ax, bx jmp bijiao jieshu: cmp ax, 0100h jb endss add ax, bxendss: jmp $code ends end start第二题:这道题的思路可以很快梳理清楚:1、 浮点数转定点数:确定符号,符号存入内存最高位,负数要取补确定阶码根据阶码值取相应数量的数构成整数部分(不要忘了浮点数中忽略了的最高位1)剩余的部分是小数部分2、 定点数转浮点数:确定符号,存入内存最高位,负数要取补确定阶码忽略整数部分最高位1,其余部分存入内存小数部分存入内存思路即是这样。难点在于处理的数据位数太多,超出了板子一次运算允许的最大范围。这样就只能采取分步骤做,每做一步就把结果存入内存空间,之后内存空间左移若干位,为下一步骤存入数据腾出位置。最终完成。程序框图如下:浮点数转定点数: 定点数转浮点数:程序代码:(先浮点转定点然后定点转浮点); 将 AX 拆为三个 BCD 码, 并存入 Result 开始的叁个单元data segment;Result db 3 dup(?)x dd 42c88000hzhengshu db 0;存整数部分,带符号,补码表示xiaoshu db 0;存小数部分,不带符号,原码表示sign db 0;保存符号zhishu db 0;保存阶码count db 0;计数temp db 0;ct db 0;计数data endscode segment assume cs:code, ds:datastart proc near mov ax, data mov ds, ax mov ax, word ptr x ;存低16位 mov bx, 42c8h;存高16位 shl bx, 1 jb fu;负数,跳转到负数的处理部分back: ;rcl ax, 1 ;? shl ax, 1 jb yi jmp mainyi: add bx,1;程序结束后取消注释 jmp mainmain: mov zhishu, bh shl bx, 8 add bl, ah shl ax, 8 sub zhishu, 7fh mov cl, zhishu add bx, 1 rol bx, cl cmp sign, 0 ja qufanfuzhi: mov zhengshu, bl mov xiaoshu, bh jmp nextqufan: ;neg bl ;sub bh,1 ;neg bh ;add bl,80h sub ah,bh sub al,bl mov bh,ah mov bl,al jmp fuzhi fu: mov sign, 1 jmp back next: mov ax,0 mov bx,0 mov dx,0 mov sign,0 mov al,zhengshu cmp zhengshu,80h jb dayuling;低于跳转,是正数 mov ah,0ffh mov sign,1 mov bx,0 sub bx,ax add dh,1 mov ax,bx add ah,80h mov bx,0 sub bh,xiaoshu shl ax,1 jmp huiqudayuling: mov bh,xiaoshu;把取得的整数和小数部分分别存入段寄存器中 shl ax,1;jb fushu;判断是负数,把sign置为1huiqu:mov count,14 ;mov count,6 jmp jishufushu: mov sign,1 jmp huiqujishu:;rcl al,1;从高到低一位一位的找,找到第一个1的时候,跳转,记下整数的位数 shl ax,1 jb cunzhengdec count inc ctjmp jishucunzheng:add count,7fh;求出偏移码cmp sign,0;ja qufu;取负值,高位为1cmp count,7h+7fh;ja taigaomov cl,countmov dl,cl;阶码存入dl sub count,7fhmov cl,countshl dx,cl;dx左移,为整数部分存入做准备;rol al,cl rol ax,clmov temp,al;add dl,temp;整数最高7位(或少于7位)存入dx,之后ax就没有用了mov temp,0 mov cx,0mov ax,0; 到这里都还是对的 sub ct,7 mov cl,ctrol bx,cl; mov ah,0ffh shl dx,cl;把dx剩下的最后几位腾出来,准备放入bx传递过来的数据hehe: shl al,1add al,1loop hehe sub ah,almov temp,bland temp,al;把bl中由最高位移动过来的几位数保留下来 add dl,temp;然后存入dx剩下的空位中and bl,ah;恢复bljmp jieshu;dx存高16位,bx存低16位taigao:shl dx,7rol ax,7mov temp,aladd dl,temp;整数最高7位存入dx,多出来的继续存入cxmov cl,temp-7shr bx,cl;留出空间,把没存完的整数部分存进来mov temp,ahadd bh,temp;整数部分全部存入,此时bx刚好保存了小数部分,完成jmp jieshuqufu:add dh,1;把得到的浮点数编码存入dx中jmp cunzheng jieshu: jmp $code ends end start第三题:难度较小,只要用两层循环即可。A循环是被检测数从1增加至100。B循环是对每个被检测数,都要从2一直除到本身。循环中不断地判定,如果出现了余数为0的情况,则跳出本次B,进入下一次A循环;如果直道一次B循环无跳出的执行完,都没有出现余数为0的情况,则这一个被检测数就是质数,把它存入内存单元。程序框图:程序代码:; 将 AX 拆为三个 BCD 码, 并存入 Result 开始的叁个单元data segmentResult db 30 dup(?)x dd 0c1c90000hzhengshu db 0;存整数部分,带符号,补码表示xiaoshu db 0;存小数部分,不带符号,原码表示sign db 0;保存符号;zhishu db 0;保存阶码count db 0;计数temp db 0;ct db 1;计数i db 0;data endscode segment assume cs:code, ds:datastart proc near mov ax, data mov ds, ax mov cx, 99 mov dx,0 mov ax,0xunhuan: inc ct;被检测的数 mov al,ct;ct放在默认被除数的位置上;jiance: mov i,2;i作除数,即因子jiancea: mov bl,i cmp bl,ct jnb jixu;当i与ct相等时,认为找到了质数 div i cmp ah,0 jna heshu;不高于跳转,表示余数为0,则是合数 mov ah,0 mov al,ct;恢复做过除法的被检测数 add i,1 jmp jiancea;既没有发现余数为零的情况,i也比ct小,那么跳回检测分支的开头,重来 jixu: ;add count,1 mov bl,ct mov si,bl ;mov result,ct add si,1;不知道能不能像这样把地址的值直接加1,如果不行可以尝试对找到的质数计数count,然后每次存的时候用mov result+count ct ;或许可以heshu: loop xunhuan ;质数存在0400开始的连续空间里 jieshu: jmp $code ends end start第四题:本身句法结构不难,问题就是操作数位数过多,只能把操作数分割开,分别运算之后再组装在一起。需要注意的是,分割开操作的时候要记录本位向高位的进位,同时考虑低位向本位的进位,这些数值,当一个部分的加法做完,转向下一个部分的加法时,一定要保存下来,带入下一次运算。而减法则完全类似,把进位改为借位即可。程序框图:加法:减法:程序代码:; 将 AX 拆为三个 BCD 码, 并存入 Result 开始的叁个单元data segmentResult db 30h dup(?)x1 dw 0x2 dw 0;zhengshu db 0;存整数部分,带符号,补码表示;xiaoshu db 0;存小数部分,不带符号,原码表示sign db 0;保存符号;zhishu db 0;保存阶码count db 0;计数temp db 0;ct db 1;计数i db 0;data endscode segment assume cs:code, ds:datastart proc near mov ax, data mov ds, ax mov si,5467h mov si+2,1234h mov si+10h,3716h mov si+12h,5438h mov ax,0 mov bx,0 mov cx,4jiafa:jiancha: add al,si mov bl,si+10h add al,bl; mov cx,2 cmp al,9ah;看低8位是否对高8位有进位 jb jixu;低于跳转 sub al,bl add al,bl add ah,1;有进位,则高8位加1 mov sign,1;把进位的标志也保存一下jixu: sub al,bl add al,bl daa mov si+4,al mov al,ah mov ah,0 add si,1 loop jianchajianfa: mov cx,4 mov ax,0 mov bx,0 ;daa ;mov si+2,al; loop jiancha sub si, 4 mov si+10h,5467h mov si+12h,1234h mov si,3716h mov si+2,5438hjianchaa: add al,si mov bl,si+10h sub al, bl;add al,bl; mov cx,2 cmp al,9ah;看低8位是否对高8位有借位 jb jixua;低于跳转 add al,bl;sub al,bl sub al,bl;add al,bl sub ah,1;add ah,1;有借位,则高8位加1 mov sign,1;把借位的标志也保存一下jixua: add al,bl;sub al,bl sub al,bl;add al,bl das mov si+8,al mov al,ah mov ah,0 add si,1 loop jianchaa jmp $code ends end start第五题:我只做了乘法部分。仍然是面临操作数过大的问题。我采用的是模拟手工竖式运算的方式,先取被乘数最低位,与乘数每一位分别相乘(考虑乘法进位),得到一行数;然后取被乘数次低位,与乘数每一位分别相乘,得到一行数,这一行比上一行高了一位;随后按照类似的方法,得到了8行数;最后,按竖式加法把每一列都按照BCD码的加法加起来(注意进位),得到的第9行数,就是乘法的结果。程序框图:(省略了最后的竖式加法部分,因为它就是BCD码加法运算,比较简单)程序代码:data segmentResult db 160h dup(?)x1 dw 0x2 dw 0sign db 0;保存符号count db 0;计数temp db 0;ct dw 0;计数i db 0;data endscode segment assume cs:code, ds:datastart proc near mov ax, data mov ds, ax mov si, 0302h ;low mov si+2, 0606h mov si+4, 0206h mov si+6, 0701h ;high mov di, 0503h;low mov di+2h, 0304h mov di+4h, 0607h mov di+6h, 0403h;high 到这里没有问题 mov cx, 8 xiaocheng: mov ax, 0 mov bx, 0 add al, si;之所以用add是因为难免低位会向高位进位,采用add的形式就可以把进位也存进来了 mov bl, di mul bl ;此后直到下一个循环开始前bl不再参与这次乘法运算,可以再给它安排新的任务 aam add si, ct add si, di add si+11h, ah;乘法进位先存入结果的高一位 mov ah, 0;然后把ah置0 mov bl, si+10h;先把结果的本位取出来,与al相加后再存回去,以免忽略 ;结果与之前的进位相加后又产生的加法进位 add al, bl aaa;非压缩BCD码的加法调整,调整后,ah中存放的是加法进位, ;这里加法进位是能直接加到结果高一位里去的,因为加法进位和乘法进位相加后不会再产生更高的进位了 add si+11h, ah mov si+10h, al ;add si+10h, al;本位存入结果的本位,这里又要考虑加法进位 sub si, ct sub si, di ;mov al, ah inc si cmp si, 8 jb xiaocheng inc di sub si, 8 add ct, 10
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 海域使用权租赁与海洋科研合作合同范本
- 水性瓷砖施工与环保评估合同
- 老字号品牌旗舰店租赁及历史传承保护合同
- 公交车辆驾驶员劳动合同及安全行车教育与保障协议
- 2025公务员市考面试题及答案
- 2025年湖北银行考试试题及答案
- 电竞专业考试试题及答案
- 会计专业笔试题目及答案
- 特殊职位专业考试题及答案
- 双重预防管理体系
- 《广播电视编导概论》课程教学大纲
- kinetix6200和6500模块化多轴伺服驱动器用户手册
- DB51∕T 2502-2018 中国川菜烹饪技术用语及菜名翻译规范
- 国外期刊运作的主要模式及发展趋势
- 区域性再生资源集散市场实施方案
- 液氨使用与储存安全技术规范
- 《幼儿园大班第一学期家长会》 PPT课件
- 施工手册柱式桥台
- PCR室作业指导书_检验SOP文件
- 宴会服务培训
- 上海市初级中学英语学科教学基本要求
评论
0/150
提交评论