内容发布更新时间 : 2024/12/24 2:03:58星期一 下面是文章的全部内容请认真阅读。
《微机原理与应用》课程实验报告
实验名称 实验一 两个多位十进制数相加实验 姓 名 实验日期 高 翔 系院专业 电子科 指导教师 班 级 一班 学 号 2012217000 成 绩 2014年4月15日 石雷、毕翔 一、实验目的和要求 (一)实验目的 1. 学习数据传送和算术运算指令的用法。 2. 熟悉在PC机上建立,汇编,连接,调试和运行汇编语言程序的过程。 3. 了解实验程序框图。 (二)实验要求 将两个多位十进制数相加,要求被加数,加数通过键盘输入后按顺序存放在以ADD1和ADD2为首的六个内存单元中(低位在前),结果送入SUM为首的六个内存单元中。假定计算的结果也是六位,否则算溢出,可不处理。 二、实验内容(包括实验步骤和代码) (一)流程图 (二)实验过程
1
1、打开如Vim之类的代码编辑器,输入实验代码: bits 16 org 0x100 section text _start: mov ax, cs mov ds, ax mov sp, 0xffff mov ah, 9 mov dx, welcome int 0x21 call _load_int push dx push ax call _load_int ; add up ~ pop bx add ax, bx pop bx adc dx, bx ; print a large number (ax, dx) mov bx, 11 mov cx, 10000 div cx mov si, ax mov ax, dx xor dx, dx mov cx, 10 l2: div cx add dx, 0x30 mov [string + bx], dl xor dx, dx dec bx cmp ax, 0 jnz l2 test si, si jz end mov di, 7 ; 填充0长度 mov al, 48 l3: cmp bx, di jle l4
2
mov [string + bx], al dec bx jmp l3 l4: mov ax, si xor si, si jmp l2
end: mov ah, 9 lea dx, [string + bx + 1] int 0x21 int 0x20
_load_int: mov ah, 0xA mov dx, string int 0x21 xor bx, bx mov bl, [string + 1] ; 字符串长度 xor ax, ax xor dx, dx lea si, [string + 2] mov di, 10
_loop: mov cx, ax mov ax, dx mul di mov dx, ax mov ax, cx push dx mul di xor cx, cx mov cl, [si] sub cl, 0x30 add ax, cx pop cx adc dx, cx inc si dec bl jnz _loop push dx push ax mov ah, 0x9 mov dx, newline int 0x21 pop ax pop dx
3
ret section data welcome: db \, 13, 10, '$' newline: db 13,10, '$' string: db 7,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '$' 2、使用NASM汇编器编译上述代码。http://www.nasm.us/ 3、在DOSBOX模拟器下运行编译出的com文件。http://www.dosbox.com/ 三、实验结果及其分析 实验结果见下图组,由于之后的实验同样用到了BCD码调整命令,因此本组实验我做了一个可变长的类32位加法,最大可以加到远远超过6位数,当然也可以加1、2、3…位数的数。 (五位进位加法) (六位不进位加法) (六位进位加法) (一位和三位的加法) 总体来说该实验还是十分简单的,使用到的指令不多,唯一需要注意的就是通过ADC指令的配合来实现32位加法。 另外一个比较重要的问题就是32位整数的显示问题,我使用了一种暴力方法就是把用DIV命令把32位数/10000得到一个比较大的数显示,然后再显示000的数,这样的一个缺点就是无法显示一个接近32位的数字,具体多少无法显示在这里就不计算了,不过这是远远大于题目要求的6位数字的。 为了跟实验的要求拟合,我限制了数值的长度,这样就完成了一个可变长度的加法器。
4
《微机原理与应用》课程实验报告
实验名称 实验二 BCD码相乘实验 姓 名 实验日期 高 翔 系院专业 电子科 指导教师 班 级 一班 学 号 2012217000 成 绩 2014年4月22日 石雷、毕翔 一、实验目的和要求 (一)实验目的 掌握用组合的BCD码表示数据,并熟悉如何实现压缩的BCD码乘法运算。 (二)实验要求 实现BCD码的乘法,要求被乘数和乘数要求以压缩的BCD码形式存放,在内存中各占一个单元,乘积存放在另外两个内存单元中。程序中可采用将乘数1作为计数器,累加另一个乘数的方法得到计算结果。 二、实验内容(包括实验步骤和代码) (一)流程图 (二)实验过程
5