福建农林大学汇编实验报告四.docx
《福建农林大学汇编实验报告四.docx》由会员分享,可在线阅读,更多相关《福建农林大学汇编实验报告四.docx(12页珍藏版)》请在冰豆网上搜索。
福建农林大学汇编实验报告四
福建农林大学计算机与信息学院实验报告
系:
计算机专业:
计算机科学与技术年级:
姓名:
学号:
实验室号计算机号
实验时间:
2015指导教师签字:
刘庆连成绩:
实验四子程序设计
1.实验目的
(1)学习子程序的编写,主子程序的调用;
(2)不同模块间程序的调用和调试。
2.实验内容
1)数据段中的3个字符,调用子程序将其逐个显示出来。
子程序的功能是显示一个字符。
单步执行,对CALL语句和RET语句观察SP,IP的变化,并用D命令查看栈顶的内容。
DATASEGMENT
MAGDB‘ABC’
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,0
MOVCX,3
LL:
MOVDL,MAG[SI]
CALLMADD
INCSI
LOOPLL
MOVAH,4CH
INT21H
MADDPROC
MOVAH,02H
INT21H
RET
MADDENDP
CODEENDS
ENDSTART
2)阅读S31.ASM和S32.ASM两个模块中的程序,并分别汇编,然后连接成一个可执行文件S31.EXE。
具体步骤如下:
MASMS31.ASM(分别汇编)
MASMS32.ASM
LINKS31S32(将两个文件连接成为一个文件名为S31)
S31.EXE(运行)
3)编程:
利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。
(也可以将找到的不相等字符逐个显示,用INT21H的02功能调用)
4)编程:
子程序搜索指定字符缓冲区中是否有N,如果有用Y替代。
调用子程序将BUF1,BUF2,BUF3中的N全部用Y替代。
附源程序:
NAMES31.ASM
不同模块间的段间调用。
从键盘输入2位非压缩BCD数,存入AX寄存器中。
为了将其转换为二进制数,编写一个子程序TRAN。
显示子程序DISP完成将16进制数转换为对应的ASCII码并显示该字符,显示子程序在另一模块S32中。
输入数据为00时结束。
EXTRNDISP:
FAR
CODESEGMENTPARA‘CODE’
ASSUMECS:
CODE
START:
MOVAH,01H
INT21H
MOVBL,AL
INT21H
MOVAH,AL
MOVAL,BL
CMPAX,3030H
JEEXIT
CALLNEARPTRTRAN
CALLFARPTRdisp
JMPSTART
EXIT:
MOVAH,4CH
INT21H
TRANPROCNEAR;将输入的ASCII码转换成2进制数
ANDAX,0F0FH;将ASCII码转换成非压缩BCD码,高位在AL中
MOVBL,AH
MOVCL,10D
MULCL
ADDAL,BL
RET
TRANENDP
CODEENDS
ENDSTART
NAMES32.ASM
PUBLICDISP
CODE1SEGMENTPARA‘CODE’
ASSUMECS:
CODE1
DISPPROCFAR
MOVBL,AL
MOVBH,00
MOVCH,4
ROLL:
MOVCL,4
ROLBX,CL
MOVDL,BL
ANDDL,0FH
CMPDL,9
JBENEXT1
ADDDL,07H
NEXT1:
ADDDL,30H
MOVAH,02H
INT21H
DECCH
JNZROLL
RET
DISPENDP
CODE1ENDS
END START
5)编一个子程序:
输入一个字符,显示出来。
6)编一个子程序:
输入一个字符串,显示出来。
3.算法描述及实验步骤
第一题:
(1)编写源程序,用记事本输入程序,并存储为源程序
(2)对源程序进行汇编、连接
(3)在debug提示符下输入g ,运行程序
(4)运行t命令,单步执行程序
(5)用d命令查看栈顶的内容
第二题 :
(1) 编写两段源程序,用记事本输入程序,并存储为源程序,分别为s31和s32
(2)分别对源程序进行汇编
(3)连接时,输入:
link s31+s32,生成一个文件名为s31的.exe文件
(4)在debug下,用g命令运行s31.exe文件
第三题:
编写源程序:
DATA SEGMENT
BUF DB '?
','?
','$'
BUF1 DB 'ABCDEFGH'
BUF2 DB 'ACBDEGFH'
CRLF DB 0AH,0DH,"$"
DATA ENDS
CODE SEGMENT
ASSUME CS:
CODE,DS:
DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DI,0
MOV SI,0 分别将SI和DI赋值0;
MOV CX,8 定义循环次数为8
L:
MOV BL,BUF1[SI]
MOV DL,BUF2[DI] 分别将指定的值赋给BL,DL;
INC SI
INC DI 分别指向下一位;
CALL MADD 调用子程序; LOOP L
JMP L2 循环结束后跳出;
L2:
MOV AH,4CH
INT 21H
MADD PROC
CMP BL,DL
JNE L0 相等的话跳转L0;
JMP L4 不然就跳转L4;
L0:
MOV BUF[0],BL
MOV BUF[1],DL
MOV AH,9
LEA DX,BUF
INT 21H 将不同的字符显示出来LEA DX,CRLF
MOV AH,9
INT 21H
L4:
MOV DL, '-'
RET MADD
ENDP
CODE ENDS
END START
第四题:
编写源程序:
DATA SEGMENT
BUF1 DB 'anananananana','$'
BUF2 DB 'nbnbnbnbnbnbn','$'
BUF3 DB 'cncncncncncnc','$'
CRLF DB 0AH,0DH,"$"
BUF DB '?
','?
','?
','?
','?
','?
','?
','?
','?
','?
','?
','?
','?
','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:
CODE,DS:
DATA
START:
MOV AX,DATA
MOV DS,AX
LEA SI,BUF1
CALL MADD
LEA SI,BUF2
CALL MADD
LEA SI,BUF3
CALL MADD 分别将数组赋给SI后,调用子程序;
MOV AH,4CH
INT 21H
MADD PROC
MOV DI,0
MOV CX,13
L:
MOV BL,[SI]
CMP BL,'n' 将BL和n比较;
JE L1 相同的话,跳转L1;
MOV BUF[DI],BL 不然就把BL的值放入BUF数组中;
INC SI
INC DI
LOOP L
JMP L2
L1:
MOV BUF[DI],'y' 直接把y放入BUF数组中;
INC SI
INC DI
LOOP L
L2:
MOV AH,9
LEA DX,BUF
INT 21H 把处理好的数组显示出来;
LEA DX,CRLF
MOV AH,9
INT 21H 换行;
RET
MADD ENDP
ODE ENDS
END START
第五题:
输入一个字符,显示出来。
STACKS SEGMENT STACK
DW 128 DUP(?
)
STACKS ENDS
CSeg Segment para public 'CODE'
Assume cs:
CSeg
Start:
mov ah,01
int 21h
mov dl,al
mov ah,02
int 21h
mov al,0
mov ah,4ch
int 21h
CSeg ends
end Start
第六题:
输入一个字符串,显示出来。
STACKS SEGMENT STACK
DW 128 DUP(?
)
STACKS ENDS
DSeg Segment
msg db 0dh,0ah,'$'
buf db 20,?
20 Dup(?
)
DSeg ends
CSeg Segment para public 'CODE'
Assume cs:
CSeg,ds:
DSeg
Start:
mov ax,DSeg
mov ds,ax
lea dx,buf
mov ah,0ah
int 21h
lea dx,msg
mov ah,09
int 21h
lea dx,buf+2
int 21h
mov al,0
mov ah,4ch
int 21h
CSeg ends
end Start
4.调试过程
5.实验结果
第一题:
G命令运行文件:
T命令单步执行:
第二题 :
将两个文件连接:
G命令运行文件:
第三题:
第四题:
第五题:
输入字符2,运行结果为:
第六题:
输入字符串‘42as$’,运行结果为:
6.总结
通过本次实验,学会了子程序的编写与调用,并且学会了在调用程序时,如何进行两个源程序的连接,从而对子程序调用的过程有更明确的了解
附录: