ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:321.77KB ,
资源ID:3657028      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3657028.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(微机原理实验3汇编语言程序设计.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

微机原理实验3汇编语言程序设计.docx

1、微机原理实验3汇编语言程序设计微机原理实验3实验设备:LAB6000通用微控制器实验系统实验用时10小时一、实验内容:汇编语言程序设计 。在了解8086/8088汇编语言后,编制并调试程序。1编制不恢复余数除法程序 格式:最高两位为符号位 2按IEEE754格式编制32位浮点数与32位定点数相互转换程序子程序(两个子程序)3编制程序寻找100以内的质数,并从小到大排列。4、 编制8位(4字节)压缩BCD码加、减法程序。5、 编制8位(8字节)非压缩BCD码乘法和除法程序。二、实验报告:程序框图和源程序清单。第一题必做,其余任选两个第一题:这道题可以按照老师所讲的不恢复余数除法的步骤,一步一步把

2、书上的文字描述“翻译”成汇编语言。1、执行第一次减法。2、判断结果的正负,这里我们通过比较结果与0100h的大小关系来实现,结果大于等于0100h,说明结果小于0;结果小于0100h,说明结果大于0,最终会溢出,程序结束3、如果上一次操作结果为正,则商1,被除数左移一位,减除数,跳转54、如果上一次操作结果为负,则商0,被除数左移一位,加除数,跳转55、判断上一次操作结果的正负6、上面的第3,4,5步循环4次之后结束,如果最后一次操作结果小于0,则还要再左移一位,加除数。这样就实现了8位除以4位的不恢复余数除法。这道题的难点在于正确理解不恢复余数除法的步骤,和每一步的意义。因为单纯翻译书上的内

3、容很容易导致误解,只有真正理解了才能做出来。这里比对一下自己最后梳理出来的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

4、 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

5、, 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,其余部

6、分存入内存小数部分存入内存思路即是这样。难点在于处理的数据位数太多,超出了板子一次运算允许的最大范围。这样就只能采取分步骤做,每做一步就把结果存入内存空间,之后内存空间左移若干位,为下一步骤存入数据腾出位置。最终完成。程序框图如下:浮点数转定点数: 定点数转浮点数:程序代码:(先浮点转定点然后定点转浮点); 将 AX 拆为三个 BCD 码, 并存入 Result 开始的叁个单元data segment;Result db 3 dup(?)x dd 42c88000hzhengshu db 0;存整数部分,带符号,补码表示xiaoshu db 0;存小数部分,不带符号,原码表示sign db 0

7、;保存符号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 z

8、hishu, 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

9、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 cou

10、nt,6 jmp jishufushu: mov sign,1 jmp huiqujishu: ;rcl al,1;从高到低一位一位的找,找到第一个1的时候,跳转,记下整数的位数 shl ax,1 jb cunzheng dec count inc ct jmp jishucunzheng: add count,7fh;求出偏移码 cmp sign,0 ;ja qufu;取负值,高位为1 cmp count,7h+7fh ;ja taigao mov cl,count mov dl,cl;阶码存入dl sub count,7fh mov cl,count shl dx,cl;dx左移,为整数部

11、分存入做准备 ;rol al,cl rol ax,cl mov temp,al; add dl,temp;整数最高7位(或少于7位)存入dx,之后ax就没有用了 mov temp,0 mov cx,0 mov ax,0; 到这里都还是对的 sub ct,7 mov cl,ct rol bx,cl; mov ah,0ffh shl dx,cl;把dx剩下的最后几位腾出来,准备放入bx传递过来的数据hehe: shl al,1 add al,1 loop hehe sub ah,al mov temp,bl and temp,al;把bl中由最高位移动过来的几位数保留下来 add dl,temp;

12、然后存入dx剩下的空位中 and bl,ah;恢复bl jmp jieshu;dx存高16位,bx存低16位taigao: shl dx,7 rol ax,7 mov temp,al add dl,temp;整数最高7位存入dx,多出来的继续存入cx mov cl,temp-7 shr bx,cl;留出空间,把没存完的整数部分存进来 mov temp,ah add bh,temp;整数部分全部存入,此时bx刚好保存了小数部分,完成 jmp jieshu qufu: add dh,1;把得到的浮点数编码存入dx中 jmp cunzheng jieshu: jmp $code ends end s

13、tart第三题:难度较小,只要用两层循环即可。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;存小数部分,不带符号,原码

14、表示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相等

15、时,认为找到了质数 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 ;质数

16、存在0400开始的连续空间里 jieshu: jmp $code ends end start第四题:本身句法结构不难,问题就是操作数位数过多,只能把操作数分割开,分别运算之后再组装在一起。需要注意的是,分割开操作的时候要记录本位向高位的进位,同时考虑低位向本位的进位,这些数值,当一个部分的加法做完,转向下一个部分的加法时,一定要保存下来,带入下一次运算。而减法则完全类似,把进位改为借位即可。程序框图:加法:减法:程序代码:; 将 AX 拆为三个 BCD 码, 并存入 Result 开始的叁个单元data segmentResult db 30h dup(?)x1 dw 0x2 dw 0;zh

17、engshu 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,4j

18、iafa: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 j

19、iancha 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

20、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行数,就是乘法的结果。程序框图:(省略了最后的竖式加法

21、部分,因为它就是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;

22、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

23、+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

24、, 10h loop xiaocheng;理论上说到这里按竖式做的乘法已经一行一行的存进si起始的单元里了 sub di, 8 add di, 10h mov ax, 0 mov bx, 0 ;到这里都是对的 mov cx, 8;下一个循环是要把竖式的值加起来 add si, 10h mov ct, 0 mov al, sixiaojiafa: add si, 10h mov bl, si add al, bl aaa loop xiaojiafa mov cx, 8 mov si, al add si+1, ah sub si, 80h inc si mov ax, 0 mov bx, 0

25、mov al, si cmp ct, 16 jb xiaojiafa jmp $code ends end start实验感想:1、要敢于尝试。开始接触的时候完全没有感觉。它与C语言的编程风格迥然不同,很多地址空间是受限制的,比如不能直接读取、位数有限、有特定的功能,还有就是语言与自然语言差别很大。这些陌生的概念积压在一起的时候就让人摸不着头脑。借鉴以前学C语言的时候,我是从最短的开始,把书上的例程一个一个抄在编译环境里,然后单步执行,看每一步的变化。这种方法既让我熟悉了每种功能语句的写法,也知道了语句的含义,看起来笨,实际上学得很快。这次尝试我也是用了同样的办法。抄了几个以后就开始凭着感觉写几个语句,然后执行以下,达到预期以后做个标记再往下写,慢慢的程序就写出来了。2、细致。我个人最容易出错的地方是搞不懂循环的次数,就比如说我要执行8次循环,cx的值该设为7还是8,这个问题我每次都要花点时间搞搞清楚。做作业的时候也是经常因为多做了一次循环导致结果出错。不过好处就是每次程序出错的时候我都知道该先从哪些地方找错误。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1