福建农林大学汇编实验报告四.docx

上传人:b****5 文档编号:7187966 上传时间:2023-01-21 格式:DOCX 页数:12 大小:555.83KB
下载 相关 举报
福建农林大学汇编实验报告四.docx_第1页
第1页 / 共12页
福建农林大学汇编实验报告四.docx_第2页
第2页 / 共12页
福建农林大学汇编实验报告四.docx_第3页
第3页 / 共12页
福建农林大学汇编实验报告四.docx_第4页
第4页 / 共12页
福建农林大学汇编实验报告四.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

福建农林大学汇编实验报告四.docx

《福建农林大学汇编实验报告四.docx》由会员分享,可在线阅读,更多相关《福建农林大学汇编实验报告四.docx(12页珍藏版)》请在冰豆网上搜索。

福建农林大学汇编实验报告四.docx

福建农林大学汇编实验报告四

福建农林大学计算机与信息学院实验报告

系:

计算机专业:

计算机科学与技术年级:

姓名:

学号:

实验室号计算机号

实验时间:

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.总结

通过本次实验,学会了子程序的编写与调用,并且学会了在调用程序时,如何进行两个源程序的连接,从而对子程序调用的过程有更明确的了解

附录:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 环境科学食品科学

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

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