东南大学微机实验 实验一、二 联系客服

发布时间 : 星期三 文章东南大学微机实验 实验一、二更新完毕开始阅读dfd935f5f90f76c661371a17

《微机实验及课程设计》实验报告学号61010131

从View菜单栏中选择CPU可看见代码区及寄存器等值,通过单步跟踪F7逐步往下执行,但是需要注意的是在执行中断时不要跟踪进去查看中断服务子程序,按F8直接执行进入下一条语句。 5) TD中直接编写指令并执行并调用相关中断

编写一个实现3!的指令并将其输出。如下图代码区中可见,先将1移入ax,再将3移入cx,然后做乘法,cx减1,执行直到cx=0为止,然后调用int21h中断的ah=02显示ASCII字符功能,之前还需将算出来的值加上30才是相应数字的ASCII码,即寄存器AL为36,运行结果见下下图。

实验二

1) 输入字符串,作大小写变换

4

《微机实验及课程设计》实验报告学号61010131

BeginInput stringDisplayNContinue?YEnd

图为程序流程图,其中display功能以过程形式调用。如下为代码片段。 …

;input string

mov dx, offset input mov ah,09h int 21h …

;display proc

disp proc near xor cx,cx ;set counter mov cl,input[1] mov si,2

again: mov dl,input[si] cmp dl,61h jb next cmp dl,7ah ja next sub dl,20h next: mov ah,02h int 21h inc si loop again ret disp endp

5

《微机实验及课程设计》实验报告学号61010131

2) 十进制转换为十六进制

BeginInput a number(0~65535)NIs number?YOutput += input[i]*10^(n-i+1)DisplayEnd

把十进制转换成十六进制是一个进制的转换过程,任一个十进制数按照不停地除以16就可以获得十六进制的数,但是这并不是这儿需要做的事情。事实上输入的字符并不是一个十进制数,输入的只是各位上数值的ASCII码,所以这儿需要做的事情就是把输入的ASCII码序列通过一个循环按照十进制的位权计算累加存在存储器output中,转换为十六进制是一个自动的过程,最后将output输出即可。

代码片段:

;change ASCII to DEC by loop of multiply 10 change proc near clc xor ax,ax xor bx,bx xor dx,dx mov cl,input[1] 插入代码 mov si,2

again: mov bl,input[si] cmp bl,30h

6

《微机实验及课程设计》实验报告学号61010131

jb error1 cmp bl,39h ja error1 sub bl,30h dec cl cmp cl,0 jz over mov ax,1 push cx loop2: mul ten loop loop2 pop cx mul bx add output,ax jc error inc si jmp again …

以上为老师提供所提供代码,其中有个错误。见代码阴影区,这儿是通过做加法累加是否进位(CF)来判断所输入的数有没有超过65535D(FFFFH)的。由于定义的output为WORD变量(16位),若输入一个>=70000的数,按照该转换算法,首位7(或8、9)乘以四次10,得到的数已经超过65535,已经溢出,就算后四位全是9加上去也不会产生进位,因此该判断是有缺陷的,只对65536~69999的输入数有溢出报错功能。为弥补此缺陷,只需在输入完数字之后,增加对输入的最高位即input[2]判断其是否大于6。否则输出的为n的后4位十六进制码,最高位1溢出。补充代码片段如下:

mov bl,input[2] cmp bl,36h ja error

修改之前运行的结果见下图

7