koorio.com
海量文库 文档专家
当前位置:首页 >> 信息与通信 >>

北邮微机原理软件部分报告

微机原理与接口技术 软件部分 实验报告

1

实验 B 分支、循环程序设计
一、 实验目的
1. 2. 3. 开始独立进行汇编语言程序设计; 掌握基本分支,循环程序设计; 掌握最简单的 DOS 功能调用。

二、 实验任务及内容
1. 安排一个数据区,内存有若干个正数,负数和零。每类数的个数都不超过 9。 2. 编写一个程序统计数据区中正数,负数和零的个数。 3. 将统计结果在屏幕上显示。 4. 选作题: 统计出正奇数,正偶数,负奇数,负偶数以及零的个数.

三、 程序流程图
BUFF 偏移地址送 BX

否 [BX]是否大于等于 0 ah=ah+1 (小于 0 个 数)

否 [BX]是否大于 0? dh=dh+1 (等于 0 个 数)

DL=DL+1 (大于 0 个数)

BX 值加 1
2

否 判断完所有的 数?



显示结果,结束

四、 源程序
DISPSTR MACRO STR MOV AH,9 MOV DX,SEG STR MOV DS,DX MOV DX,OFFSET STR INT 21H ENDM DISPNUM MOV MOV ADD INT ENDM MACRO AH,2 DL,NUM DL,30H 21H NUM ;打出字符串(属于 DOS 功能调用)

;打出数字(属于 DOS 功能调用)

;加 30H 变为 ASCII 码

DATA SEGMENT NUM COUNT ZEROS PLUSES MINUSES EVENMINUSES ODDMINUSES EVENPLUSES ODDPLUSES ZEROSTR

DB 1,3,5,0,0,0,-5,-4,0 EQU $-NUM DB 0 DB 0 DB 0 DB 0 DB 0 DB 0 DB 0 DB 0DH,0AH,'ZERO:$' ;统计数据个数 ;各类数初值均为 0

;待输出字符串
3

PLUSSTR MINUSSTR EVENMINUSSTR ODDMINUSSTR EVENPLUSSTR ODDPLUSSTR DATA ENDS STACK SEGMENT DB 100 DUP(?) STACK ENDS

DB DB DB DB DB DB

0DH,0AH,'PLUS:$' 0DH,0AH,'MINUS:$' 0DH,0AH,'EVENMINUS:$' 0DH,0AH,'ODDMINUS:$' 0DH,0AH,'EVENPLUS:$' 0DH,0AH,'ODDPLUS:$'

STACK

'STACK'

CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START PROC FAR PUSH MOV PUSH MOV MOV MOV MOV LOOP1: CMP JZ JG INC SHR JNC INC INC LOOP JMP INC INC JMP INC SHR JNC DS AX,0 AX AX,DATA DS,AX CX,COUNT SI,OFFSET NUM BYTE PTR[SI],0 ZERO PLUS MINUSES BYTE PTR[SI],1 EVENMINUS SI ODDMINUSES LOOP1 DISP ZEROS SI RETURN PLUSES BYTE PTR[SI],1 EVENPLUS
4

;初始化

;CX 控制循环次数 ;SI 指向数据的偏移地址 ;将 SI 指向的内容与 0 比较大小 ;等于 0 跳转 ;大于 0 跳转 ;负数加一 ;判断是负奇数还是负偶数 ;是负偶数跳转 ;SI 指针后移 ;负奇数加一 ;循环直至 CX=0 ;循环结束后跳转至打出结果

RETURN:

ZERO:

;返回循环体

PLUS:

INC INC JMP EVENPLUS: INC INC JMP

SI ODDPLUSES RETURN SI EVENPLUSES RETURN SI EVENMINUSES RETURN ZEROSTR ZEROS PLUSSTR PLUSES MINUSSTR MINUSES EVENPLUSSTR EVENPLUSES ODDPLUSSTR ODDPLUSES EVENMINUSSTR EVENMINUSES ODDMINUSSTR ODDMINUSES ;打出结果

EVENMINUS: INC INC JMP DISP: DISPSTR DISPNUM DISPSTR DISPNUM DISPSTR DISPNUM DISPSTR DISPNUM DISPSTR DISPNUM DISPSTR DISPNUM DISPSTR DISPNUM RET START CODE end ENDP ENDS END start

START

五、 程序运行结果
进行统计的数据为 1,3,5,0,0,0,-5,-4,0。程序运行结果如下:

5

六、 回答预习题
十进制数 0 --9 所对应的 ASCII 码是什么? 如何将十进制数 0--9 在屏幕上显示出来? 0--9 的 ASCII 码为 30H—39H。若想将一个十进制数 0—9 的字符在屏幕上显示出来,首 先应该把它所占寄存器的值赋给 DL 寄存器, 然后 DL 寄存器的值加 30H, 然后执行 02 号 DOS 功能调用,即执行以下代码“MOV AH,02”“INT 21H”即可。 , 1. 2. 如何检验一个数为正,为负或为零?你能举出多少种不同的方法? 1) 可以用 CMP 指令将数与 0 比较,若为正数则可通过 JG 跳转;若为 0 可通过 JE/JZ 跳转;若为负数可通过 JL 跳转。 2) 若只需判断是非负数或者负数, 则可以用 TEST 指令将数与 80H (DB 情况下) 8000H 或 (DW 情况下)相与,若为非负数则可通过 JE/JZ 跳转;若为负数则可通过 JNE/JNZ 跳转。 若只需判断是非负数或者负数,则也可以用 SHL,SAL 对数字进行左移,若为非负 数可根据 JNC 判断;若为负数可以根据 JC 判断跳转。 若只需判断是非负数或者负数,则也可以用 JS,JNS 来进行判断,若为非负数可根 据 JNS 跳转;若为负数可以根据 JS 判断跳转。

3)

4)

七、 实验总结、建议要求、心得体会
通过本次实验,我对宏定义和调用以及 DOS 功能调用有了更深的认识和学习。同时, 针对比较复杂的逻辑,需要将分支以及循环结构合理使用。在对不同情况加以考虑时,要注 意对不同判决条件的选择, 不同的代码指令可能可以实现相同的功能。 实验的另一个收获是 了解到了 0—9 字符 ASCII 码到实际数值的转化, 为今后实验奠定了基础。 对于数字奇偶性的 判断,可以采取不同的方法。比如说可以使用 TEST 语句实现对非 0 位的置 0,而保留第 0 位来判断数字的奇偶性;或者使用 SHR 来对 CF 进行判断,也就是第 0 位。使用不同的指令 代码可以实现相同功能。 同时,考虑到输出的美观性,在汇编过程中,针对字符串,我有针对性的加入了 0DH, 0AH 使得完成字符串输出的换行。 其中 0AH 是换行功能的 ASCII 码, 0DH 是回车功能的 ASCII 码。

6

也是在本次实验中, 我深刻认识到了宏定义与使用的重要性。 无论是输出字符还是字符 串, 这两个在实验中非常重要的功能完全可以通过简单的宏定义在汇编程序中多次调用。 使 得汇编程序的可读性大大提高。

实验 C 代码转换程序设计
一、 实验目的
1. 2. 掌握几种最基本的代码转换方法; 运用子程序进行程序设计。

二、 实验任务及内容
1. 2. 3. 4. 从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来。 两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明。 对输入要有检错措施,以防止非法字符输入,并有适当的提示。 将整个程序分解为若干模块,分别用子程序实现。在报告中要给出模块层次图。

三、 程序流程图

7

四、 源程序 (空格为两十进制数间的分隔符, 空格为输入结束标志)
DISPSTR MOV MOV MOV MOV INT ENDM DISPCH MOV MACRO STR AH,9 DX,SEG STR DS,DX DX,OFFSET STR 21H (DOS 功能调用)

MACRO NUM AH,2
8

MOV INT ENDM DATA

DL,NUM 21H

SEGMENT DB 31 DB 0 DB 31 DUP(0) ;最多能输入连回车在内的 31 个字符 ; 每输入一个两位数占 3 byte

INSTR

NUMS DB COUNT DB MIN DB STRIN DB STRERR DB STROUT DB DATA ENDS

10 DUP(0FFH) ;储存由字符串转化过来的实际数值 ? ;记录实际数据的个数 0FFH ;记录最小值,初始化为 0FFH 'PLEASE INPUT YOUR NUMBER:$' 0DH,0AH,'WRONG INPUT!',0DH,0AH,'PLEASE INPUT AGAIN:$' 0DH,0AH,'THE MINIUM IS:$'

STACK SEGMENT DW 100H STACK ENDS CODE START

STACK 'STACK' DUP(0FFFFH)

SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX DISPSTR STRIN MOV MOV INT MOV MOV ADD MOV MOV MOV DIV CMP JNZ MOV DX,OFFSET INSTR AH,0AH 21H ;输入错误时重输入口 ;用户输入字符串

AGAIN:

SI,OFFSET NUMS ;SI 指向数值起始位置 BX,DX BX,1 ;BX 指向字符串长度字节 AL,[BX] AH,0 CL,3 CL ;长度除以 3 得到有效数据个数 AH,0 ;余数不为 0 则输入必有误 RESET COUNT,AL
9

MOV PUSH CALL POP CMP JE

DX,0 DX CHECK DX DX,1 RESET

;DX 压栈传递参数,初始为 0,用于继续判断输入是否有误。 ;调用过程 CHECK 继续判断输入是否有误 ;弹出 DX,DX 得 1 时有误 ;调用过程找最小值

CALL GETMIN DISPSTR STROUT MOV MOV MUL MOV ADD DISPCH INC DISPCH DISPCH DISPCH RET RESET: AH,0 AL,3 CH BX,AX BX,2 [BX] BX [BX] 0DH 0AH

;此时 CH 中记载着最小数在数组中的偏移位置 ;乘 3 得到在字符串中的偏移位置

DISPSTR STRERR JMP AGAIN

START

ENDP

CHECK

PROC MOV MOV SUB INC

NEAR CH,0 CL,COUNT CL,1 BX AL,[BX] AL,7FH AL,'9' ERROR AL,'0' ERROR AL,'0' DL,10 DL DL,AL

;前 COUNT-1 次判断方式与最后一次略有不同 ;BX 指向字符串有实际意义的第一个字节 ;先判断前 COUNT-1 次,每一次循环判断连续三个字节 ;最高位先置 0 ;与'9'比大小,大则输入错误 ;与'0'比大小,小则输入错误 ;得到十位实际大小 ;乘 10 放入 DL

LOOPCH: MOV AND CMP JA CMP JB SUB MOV MUL MOV

10

INC MOV AND CMP JA CMP JB SUB ADD MOV INC MOV INC MOV AND CMP JNZ INC LOOP MOV AND CMP JA CMP JB SUB MOV MUL MOV INC MOV AND CMP JA CMP JB SUB ADD MOV INC MOV INC MOV

BX AL,[BX] AL,7FH AL,'9' ERROR AL,'0' ERROR AL,'0' DL,AL [SI],DL SI DL,0 BX AL,[BX] AL,7FH AL,' ' ERROR BX LOOPCH AL,[BX] AL,7FH AL,'9' ERROR AL,'0' ERROR AL,'0' DL,10 DL DL,AL BX AL,[BX] AL,7FH AL,'9' ERROR AL,'0' ERROR AL,'0' DL,AL [SI],DL SI DL,0 BX AL,[BX]

;BX 后移一位

;将个位的值累加到 DL 中,并将 DL 的值传给 SI 所指字节 ;SI 指针后移 ;DL 重新置 0 ;BX 继续后移

;两数之间分隔符约定为',' ;BX 继续后移

;输入的最后三位的判断基本同上理, 只是约定结束标志为'.'

11

AND CMP JNZ JMP ERROR: MOV ADD MOV RETURN: RET CHECK ENDP GETMIN PROC MOV MOV MOV CMP JZ CMP JA DEC INC JMP RETU: GET: MOV RET MOV INC MOV SUB DEC JMP

AL,7FH AL,' ' ERROR RETURN BP,SP BP,2 WORD PTR [BP],1 ;此时入栈的 DX=0 在 SP+2 处 ;弹出 DX 后,DX 将被置 1

NEAR SI,OFFSET NUMS DL,MIN CL,COUNT CL,0 RETU DL,[SI] GET CL SI LOOPF MIN,DL DL,[SI] SI CH,COUNT CH,CL CL LOOPF ;更新最小值 ;SI 指向实际数值的偏移地址 ;DL 记录已经比较过的数中的最小值

LOOPF:

;CL=0 时结束循环 ;若[SI]指向的值必现有最小值小则跳转 ;循环变量减 1 ;指针后移

;CH=COUNT-CL 记录新最小值的相对于 NUMS 的偏移地址 ;循环变量减 1

GETMIN ENDP CODE ENDS END

START

五、 程序运行结果

12

六、 回答预习题
如何将输入的两个字符(0 – 9)变为十进制或二进制数? 若想将连续两个 0—9 字符转换成十进制数, 首先可以将第一个字符的 ASCII 码值减 30H, 得到实际的十位上的值。然后将十位的值乘以 10(0AH) ,加上第二个字符的 ASCII 码值,再 减 30H,就可以得到连续两个 0—9 字符对应的 10 进制数了。 若想将连续两个 0—9 字符转换成非组合 BCD 码, 可以将高位、 低位分别与 0FH 相与 (也 就是减 30H) ,然后把高位和低位交换一下,即可得到在计算机内高低位正确的非组合 BCD 码。若还想得到组合 BCD 码,可以再已有的非组合 BCD 码的基础上,将高 8 位左移 4 位, 加到低 8 位上,此时低 8 位的数据就是所求得组合 BCD 码了。 1. 如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示? 可以将最小值 MIN 一开始赋为它所属类型允许的范围内的 (DB 为 0FFH, 为 0FFFFH, DW 然后将所有数据逐个与 MIN 比较,若比 MIN 大则不做任何操作,若比 MIN 小则把这个数的 值赋给 MIN 即可。 2. 你觉得采用二进制运算还是十进制运算更适合于这个实验? 由于实验中我采用的是字符串输入, 若要采用二进制运算, 则输入的连续两个字符与其 对应的非组合 BCD 码的高低位是相反的,找最小值的时候相对较困难,所以对此中输入方 式还是十进制运算好一点。 若采用单字符输入可能二进制运算会简便一些, 因为可以直接比 较 ASCII 码。 3.

七、 实验总结、建议要求、心得体会
通过此次实验,我深入的理解了 ASCII 码和相应字符串转换的关系,也懂得了机器语言 中 ASCII 码的重要性。我掌握了在字符串输入情况下把对字符串中的数据进行检错并转化成 十进制的方法, 特别是主程序和子程序之间传递参数的方法对今后的汇编程序设计有很大的 帮助。 而检错功能的实现有多种方法。 可以根据字符串长度在计算实际数据输入个数的时候通 过除法的余数对输入合理性有预判断的作用。 同时, 针对不同的字符, 在进行大小等判断时, 可以使用 SUB AL,’0’得到实际大小的数字,同时可以用 CMP AL,’9’和 CMP AL,’0’来看输入的
13

字符是否符合规范。

实验 D 子程序设计
一、 实验目的
1. 2. 进一步掌握子程序设计方法; 进一步掌握基本的 DOS 功能调用。

二、 实验任务及内容
1. 2. 3. 4. 5. 从键盘上输入某班学生的某科目成绩,输入按学生的学号由小到大的顺序输入。 统计检查每个学生的名次。 将统计结果在屏幕上显示。 为便于观察,输入学生数目不宜太多,以不超过一屏为宜。输出应便于阅读。尽可能考 虑美观。 输入要有检错手段。

三、 程序流程图

14

四、 源程序 (空格为两十进制数间的分隔符, 空格为输入结束标志)
DISPSTR MACRO STR MOV AH,9 MOV DX,SEG STR MOV DS,DX MOV DX,OFFSET STR INT 21H ENDM DISPCH MACRO NUM
15

MOV MOV INT ENDM

AH,2 DL,NUM 21H

DATA SEGMENT ;只用了 9 个学生,是考虑到 ASCII 码的问题,因为两字符会复杂一些 INSTR DB 28 ;最多能输入连回车在内的 28 个字符 DB 0 ; 每输入一个两位数占 3 byte DB 28 DUP(0) SCORES COUNT NUM RANK STRIN STRERR STROUT1 STROUT2 STROUT3 DATA ENDS STACK STACK DB 9 DUP(0FFH) DB ? DB 9 DUP(30H) DB 9 DUP(30H) DB 'PLEASE INPUT YOUR NUMBER:$' DB 0DH,0AH,'WRONG INPUT!',0DH,0AH,'PLEASE INPUT AGAIN:$' DB 0DH,0AH,'THE NUMBER OF STUDENT IS:$' DB 0DH,0AH,'THE SCORE OF STUDENT IS: $' DB 0DH,0AH,'THE RANK OF STUDENT IS: $' ;储存由字符串转化过来的实际数值 ;记录实际数据的个数

SEGMENT STACK 'STACK' DW 100H DUP(0FFFFH) ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX DISPSTR STRIN AGAIN: MOV MOV INT MOV MOV ADD MOV DX,OFFSET INSTR AH,0AH 21H SI,OFFSET SCORES BX,DX BX,1 AL,[BX] ;输入错误时重输入口 ;用户输入字符串 ;SI 指向数值起始位置 ;BX 指向字符串长度字节

16

MOV MOV DIV CMP JNZ MOV MOV PUSH CALL POP CMP JE CALL CALL RET RESET:

AH,0 CL,3 CL AH,0 RESET COUNT,AL DX,0 DX CHECK DX DX,1 RESET SORT SHOW ;长度除以 3 得到有效数据个数 ;余数不为 0 则输入必有误

;DX 压栈传递参数,初始为 0,用于继续判断输入是否有误。 ;调用过程 CHECK 继续判断输入是否有误 ;弹出 DX,DX 得 1 时有误 ;调用子程序排序 ;调用子程序打出结果

DISPSTR STRERR JMP AGAIN

START ENDP

CHECK

PROC MOV MOV SUB INC

NEAR CH,0 CL,COUNT CL,1 BX AL,[BX] AL,7FH AL,'9' ERROR AL,'0' ERROR AL,'0' DL,10 DL DL,AL BX AL,[BX] AL,7FH AL,'9' ERROR

;前 COUNT-1 次判断方式与最后一次略有不同 ;BX 指向字符串有实际意义的第一个字节 ;一次循环判断连续三个字节 ;最高位先置 0 ;与'9'比大小,大则输入错误 ;与'0'比大小,小则输入错误 ;得到十位实际大小 ;乘 10 放入 DL ;BX 后移一位

LOOPCH: MOV AND CMP JA CMP JB SUB MOV MUL MOV INC MOV AND CMP JA

17

CMP JB SUB ADD MOV INC MOV INC MOV AND CMP JNZ INC LOOP MOV AND CMP JA CMP JB SUB MOV MUL MOV INC MOV AND CMP JA CMP JB SUB ADD MOV INC MOV INC MOV AND CMP JNZ JMP

AL,'0' ERROR AL,'0' DL,AL [SI],DL SI DL,0 BX AL,[BX] AL,7FH AL,' ' ERROR BX LOOPCH AL,[BX] AL,7FH AL,'9' ERROR AL,'0' ERROR AL,'0' DL,10 DL DL,AL BX AL,[BX] AL,7FH AL,'9' ERROR AL,'0' ERROR AL,'0' DL,AL [SI],DL SI DL,0 BX AL,[BX] AL,7FH AL,' ' ERROR RETURN ;将个位的值累加到 DL 中,并将 DL 的值传给 SI 所指字节 ;SI 指针后移 ;DL 重新置 0 ;BX 继续后移

;两数之间分隔符约定为' ' ;BX 继续后移

;输入的最后三位的判断基本同上理, 只是约定结束标志为'.'

18

ERROR: MOV ADD MOV RETURN: RET SORT PROC

BP,SP BP,2 WORD PTR [BP],1

;此时入栈的 DX=0 在 SP+2 处 ;弹出 DX 后,DX 将被置 1

NEAR CL,COUNT CH,0 SI,OFFSET NUM DI,OFFSET RANK DL,COUNT DL,CL DL BYTE PTR [SI],DL BYTE PTR [DI],DL SI DI LOOP1 CH,0 CL,COUNT CL SI,0 DI,1 CX CL,COUNT CL DL,SCORES[DI] DH,SCORES[SI] DL,DH CHANGE SI DI LOOP3 CX LOOP2 RE DL,SCORES[DI] DL,SCORES[SI] SCORES[DI],DL DL,NUM[DI] DL,NUM[SI] NUM[DI],DL
19

MOV MOV MOV MOV LOOP1: MOV SUB INC ADD ADD INC INC LOOP MOV MOV DEC LOOP2: MOV MOV PUSH MOV DEC LOOP3: MOV MOV CMP JA RETUR: INC INC LOOP POP LOOP JMP CHANGE: MOV XCHG MOV MOV XCHG MOV

;学号和排名初始化

;冒泡排序

;外层循环 COUNT-1 次 ;保护循环变量

;里层循环 COUNT-1 次

;弹出外层循环的次数

;交换数值、字符串

MOV MOV MUL MOV ADD MOV XCHG MOV MOV XCHG MOV JMP RE: SORT SHOW RET ENDP PROC

BX,DI AX,3 BL BX,AX BX,2 DL,INSTR[BX] DL,INSTR[BX-3] INSTR[BX],DL DL,INSTR[BX+1] DL,INSTR[BX-2] INSTR[BX+1],DL RETUR

NEAR STROUT1 SI,OFFSET NUM CL,COUNT CH,0 DH,BYTE PTR[SI] DH '' '' SI LOOP4 STROUT2 DL,COUNT AX,3 DL SI,OFFSET INSTR SI,2 SI,AX BYTE PTR[SI],'$' INSTR+2

DISPSTR MOV MOV MOV LOOP4: MOV DISPCH DISPCH DISPCH INC LOOP DISPSTR MOV MOV MUL MOV ADD ADD MOV DISPSTR

;使字符串满足输出格式

DISPSTR STROUT3 MOV SI,OFFSET RANK MOV CL,COUNT
20

MOV LOOP5: MOV DISPCH DISPCH DISPCH INC LOOP RET ENDP ENDS END

CH,0 DH,BYTE PTR[SI] DH '' '' SI LOOP5

SHOW CODE

START

五、 程序运行结果

六、 回答预习题
1. 2. 3. 如何确定一个学生在这门科目中的名次? 按成绩由大到小排序就可以确定学生在这门科目中的名次。 你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单? 由于冒泡排序两层循环的循环次数都是确定的,所以在汇编中相对比较容易实现。 模块层次图。

4.

输出显示的形式。 输出显示的形式是: 第一行打出学生按排名从高到低的学号顺序, 第二行打出学生按排 名从高到低的成绩,第三行打出学生的排名。

21

七、 实验总结、建议要求、心得体会
此次实验用到了实验四中的一些方法。 当然我只是用了 9 个学生的成绩排名, 因为他们 的学号都是单字符,所以汇编起来考虑到的逻辑问题会少很多,ASCII 码转换的问题会简单 很多。 排序时我采用了冒泡排序法, 冒泡排序虽然好实现但是它的的效率相对较差, 对排序的 算法也可以继续改进。冒泡排序包括内外两层循环,外层循环用于对无序区定位排序,内层 循环用于相邻两个数字的比较。同时要注意外层循环要执行 COUNT-1 次,即要执行的比较 次数。 这次编程还是遇到了很大的阻力, 因为需要考虑的逻辑问题非常多。 排序算法需要对成 绩和学号都进行排序。但是通过查阅资料,仔细分析,还是解决了这一问题。

实验五 中断程序设计
一、 实验目的
1. 2. 初步掌握中断程序的设计方法。 初步掌握修改 DOS 系统中断,以适应实际使用的方法。

二、 实验任务及内容
编写一个 32 位二进制数除以 16 位二进制数的除法程序。观察当除数为 0,或超过相应 寄存器范围时,程序执行的结果。 2. 修改零号中断服务程序,使它具有以下功能: 1) 判断除数是否为 0,当除数为 0 时,显示相应的结果; 2) 当除数不为 0 时,采用适当的方法完成商超过 16 位的二进制数的除法运算。 3. 注意必须保护原有中断服务程序的入口地址,并在程序完毕前加以恢复。 4. 选作题: 1.用二进制将结果在屏幕上显示. 2.从键盘输入二进制数. 1.

三、 程序流程图

22

四.源程序
23

DATA SEGMENT message db 0AH,0DH,'divisor equals 0.',0dh,0ah,'$' message1 DB 0AH,0DH,' input error',0DH,0AH,'$' message2 DB 'PLEASE INPUT THE DIVIDEND (32)',0AH,0DH,'$' message3 DB 0AH,0DH,'PLEASE INPUT THE DIVISOR (16)',0AH,0DH,'$' message4 DB 0AH,0DH,'THE QUOTIENT IS:','$' message5 DB 0AH,0DH,'THE REMAINDER IS:','$' DATA ENDS STACK SEGMENT STACK 'STACK' STACK ENDS CODE SEGMENT ASSUME CS:CODE, SS:STACK ,DS:DATA start proc far push ds mov ax,0 push ax mov ax,data mov ds,ax sti mov al,0 mov ah,35h int 21h push es push bx push dx mov ax,seg int00 mov ds,ax mov dx,offset int00 mov al,0 mov ah,25h int 21h pop ds mov ah,09h mov dx,seg message2 mov ds,dx mov dx,offset message2 int 21h mov cx,10h mov ax,0000h push ax a1: mov ah,01h int 21h cmp al,'0' ;TF 中断标志置 1 ;保存原中断向量 ;代码段

;写中断向量

;提示输入 32 位二进制 0 或 1

;输入数字与 0 比较
24

jz a2 cmp al,'1' jnz error1 stc rcl dx,1 loop a1 jmp a3 a2: clc rcl dx,1 loop a1 a3: mov cx,10h a4: mov ah,01h int 21h cmp al,'0' jz a5 cmp al,'1' jnz error2 stc pop ax rcl ax,1 push ax loop a4 jmp a6 a5: pop ax clc rcl ax,1 push ax loop a4 a6: mov ah,09h mov dx,seg message3 mov ds,dx mov dx,offset message3 int 21h mov cx,10h a7: mov ah,01h int 21h cmp al,'0' jz a8 cmp al,'1' jnz error2 stc rcl bx,1 ;输入数字与 1 比较 ;输入有误则跳错误显示程序 ;为 1 则将 CF 置 1 ;dx 左移,移进一个 1

;为 0 则将 CF 置 0 ;dx 左移,移进一个 0

;提示输入 16 位 0 或 1 除数

25

loop a7 jmp a9 a8: clc rcl bx,1 loop a7 jmp a9 error1: mov ah,09h mov dx,seg message1 mov ds,dx mov dx,offset message1 int 21h jmp a1 error2: mov ah,09h mov dx,seg message1 mov ds,dx mov dx,offset message1 int 21h jmp a6 a9: mov cx,0000h pop ax div bx cmp bx,20h jz a14 push dx push ax mov ah,09h mov dx,seg message4 mov ds,dx mov dx,offset message4 int 21h mov bx,08h call xianshi mov bx,08h pop cx call xianshi mov ah,09h mov dx,seg message5 mov ds,dx mov dx,offset message5 int 21h mov bx,08h pop cx call xianshi
26

;输入错误提示

a14:

pop dx pop cx push ds mov ds,cx mov al,0 mov ah,25h int 21h pop ds ret start endp xianshi proc near a11: test cx,10000000b jz a10 mov ah,02h mov dl,'1' int 21h sal cx,1 dec bx jnz a11 jmp a12 a10: mov ah,02h mov dl,'0' int 21h sal cx,1 dec bx jnz a11 a12: ret xianshi endp int00 proc far pop cx add cx,2 push cx cmp bx,0 jne next mov ah,09h mov dx,seg message mov ds,dx mov dx,offset message int 21h mov bx,20h jmp finish next: push ax mov dx,ax

;恢复中断向量表

;修改后的中断服务子程序 ;修改返回地址

;除数为 0,显示错误信息

; ;

退出 ;做除法,被除数低 16 位 AX 暂存于堆栈 被除数高 16 位改为低 16 位
27

mov dx,0 div bx mov cx,ax pop ax div bx finish:iret int00 endp code ends end start

;

被除数高 16 位为 0 ; 第一次除法 ; 保存高 16 位的商于 CX ;恢复低 16 位被除数,高 16 位是上次的余数 ;商是 CX:AX,余数是 DX

四、 程序运行结果

五、 回答预习题
如何保护原有中断向量表中的中断服务程序的入口地址? 首先可以通过 DOS 的 35H 号功能调用把原来的中断服务的段地址和偏移地址分别读到 ES 和 BX 里。此后把 ES、BX 分别压栈,就可以保护原有的中断向量表。需要恢复的时候只 要把段地址和偏移地址分别弹给 DX、DS(需要通用寄存器中转一步) ,通过 DOS 的 25H 号 功能调用写中断向量表就可以了。即先读取中断向量表中 0 号中断的地址,压入堆栈,程序 结束时弹出堆栈,写回中断向量表即可。 1. 如何将你的中断服务程序入口地址置入中断向量表? 只需将自己写的中断服务程序的段地址和偏移地址分别赋给 DX、DS(需要先保护 DS) , 通过 DOS 的 25H 号功能调用写中断向量表就可以了。注意写完中断向量表后要恢复 DS。 2.

六、 实验总结、建议要求、心得体会
28

通过此次实验我学会了通过 DOS 功能调用对中断向量表进行读和写操作。由于书上有 16 位除以 8 位的示例程序,所以对中断向量表的读写并不是难点。这个程序中中断服务程 序的难点在于由于题目要求的是 32 位除以 16 位,所以数据占据的通用寄存器个数非常多, 为了保存结果只能将结果的部分不断压栈且 BP 指针不再指向一开始主程序所传递的参数 上,这样在返回主程序进行参数值的判断时,需要注意 BP 指针增加几才能指回一开始主程 序传递的参数上。 刚开始,我忘记了对除数的大小是否溢出的判断,就会跳弹出以下窗口:

其实只要对二进制数的位数加以限制, 就可以保证溢出情况不会发生。 但是也就意味着 输入如果达不到那么多位数,也会出错。可以说各有利弊吧。

总而言之, 这次实验对于我不仅仅是对微机原理概念的立即与深化, 更是在心态上更好 地去适应编程的工作状态。虽然很累,但是收获很多。

29


推荐相关:

北邮微机原理软件部分报告.doc

北邮微机原理软件部分报告 - 微机原理与接口技术 软件部分 实验报告 1 实验


北邮微机原理软件实验报告..doc

北邮微机原理软件实验报告. - 微机原理软件实验报告 实验二分支、循环程序设计


北邮微机原理软件实验报告.doc

北邮微机原理软件实验报告 - 微机原理软件实验报告 实验二分支,循环程序设计 一


北邮微机原理中断程序报告.doc

北京邮电大学实验报告 题目:微机原理软件实验学院:信息与通信工程 专业:信息工程_...除此之外, 还需要一部分程序来实现键盘输入相应时间,这里要注意时间的 每一位...


北京邮电大学微机原理与接口技术软件件实验报告.doc

北京邮电大学微机原理与接口技术软件件实验报告_计算机软件及应用_IT/计算机_专业资料。北京邮电大学微机原理与接口技术软件实验报告,汇编语言 ...


北邮通信原理软件实验报告(包含一部分思考题)(中).doc

北邮通信原理软件实验报告(包含一部分思考题)(中) - 程题实验三、实现数字基带


北邮微机原理实验报告.doc

北邮微机原理实验报告_计算机硬件及网络_IT/计算机_专业资料。有4个实验的完整...在第一部分中很多 是上个实验已经实现的功能, 唯一不同的地方是这次需要将每次...


北京邮电大学微机原理硬件实验报告.doc

北京邮电大学微机原理硬件实验报告_工学_高等教育_教育专区。2014年北京邮电大学...两个部分都需要使用到延迟函数,在放音子程序中,延迟函数起到 控制音调持续时间...


北邮 微机原理硬件实验报告.doc

北邮 微机原理硬件实验报告 - 微机原理硬件实验报告 实验一 I/O 地址译码


北邮微机原理硬件实验报告.doc

北邮微机原理硬件实验报告 - 微机原理 硬件实验报告 实验一 一、 实验目的 I


2015年微机原理软件实验报告.doc

2015年微机原理软件实验报告_调查/报告_表格/模板_实用文档。北邮微机原理软件...具体形式参见实验分析部分的输出截图。 四、实验过程流程图 源代码 DATA SEGMENT...


北京邮电大学 微机原理硬件实验报告.doc

北京邮电大学 微机原理硬件实验报告_工学_高等教育_教育专区。微机原理与接口技术...通过实验说明用 debug 中的 a 命令录入实验中给出的小程序中,有些语句可以不...


微机原理软件实验报告(原创).doc

微机原理软件实验报告微机原理软件实验报告隐藏>> 北京邮电大学 微机原理软件实验报告...具体形式参见实验 分析部分的输出截图。 四、实验过程 (一)流程图 (二)模块...


北京邮电大学微机原理与接口技术硬件实验报告.doc

北京邮电大学微机原理与接口技术硬件实验报告_计算机硬件及网络_IT/计算机_专业...三、硬件接线图与软件程序流程图接线图如下: CS /8253 接 Y0 /IO 地址 ...


微机原理与接口技术硬件实验报告北邮.doc

微机原理与接口技术硬件实验报告北邮 - 微原硬件实验报告 1 实验一 熟悉实验环


北邮微机原理与接口技术硬件实验报告.doc

北邮微机原理与接口技术硬件实验报告 - 微原硬件实验报告 班级:07118 班


微机原理软件部分实验报告:李长青.doc

微机原理软件部分实验报告:李长青_信息与通信_工程科技_专业资料。大学微机原理...北京邮电大学 微机原理软... 43页 2下载券 微机原理与接口技术部分... ...


北邮微机原理软件实验一.doc

北邮微机原理软件实验一 - 实验一 DEBUG 的使用 一、实验目的: 1.掌握


北邮微机原理汇编实验.doc

北邮,微机原理,学生成绩录入,汇编语言 电子工程学院微机原理汇编语言上机实验报告 ...七个部分,依次为功能选择部分(六个选项) 、信息录入 部分、按学号排序部分、按...


bupt_微机原理实验报告.doc

bupt_微机原理实验报告_工学_高等教育_教育专区。北邮大三上必修微机原理实验...北邮微机原理软件部分报... 29页 5下载券 北邮微机原理软件实验三 6页 2...

网站首页 | 网站地图
All rights reserved Powered by 酷我资料网 koorio.com
copyright ©right 2014-2019。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com