寻址方式与基本指令与字符及字符串输入输出实验.docx

上传人:b****7 文档编号:10102470 上传时间:2023-02-08 格式:DOCX 页数:16 大小:75.41KB
下载 相关 举报
寻址方式与基本指令与字符及字符串输入输出实验.docx_第1页
第1页 / 共16页
寻址方式与基本指令与字符及字符串输入输出实验.docx_第2页
第2页 / 共16页
寻址方式与基本指令与字符及字符串输入输出实验.docx_第3页
第3页 / 共16页
寻址方式与基本指令与字符及字符串输入输出实验.docx_第4页
第4页 / 共16页
寻址方式与基本指令与字符及字符串输入输出实验.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

寻址方式与基本指令与字符及字符串输入输出实验.docx

《寻址方式与基本指令与字符及字符串输入输出实验.docx》由会员分享,可在线阅读,更多相关《寻址方式与基本指令与字符及字符串输入输出实验.docx(16页珍藏版)》请在冰豆网上搜索。

寻址方式与基本指令与字符及字符串输入输出实验.docx

寻址方式与基本指令与字符及字符串输入输出实验

1.实验目的及实验环境

实验目的:

1、熟悉80x86寻址方式及基本指令的功能,进一步理解和巩固课堂学习内容。

2、掌握汇编语言程序设计上机过程,掌握汇编语言源程序结构,为后续汇编语言程序设计打好基础。

3、熟悉Microsoft的DEBUG或Borland的TurboDEBUG调试工具的使用方法

4、学习和掌握字符及字符串的输入输出方法。

5、掌握顺序程序的设计方法。

6、进一步掌握调试工具的使用方法。

实验环境:

80x86系列微型计算机一台以及进行汇编语言程序设计所必需的编程工具(文本编辑器、ASM.EXE、LINK.EXE、DEBUG.EXE)

2.实验内容

1、读懂源程序;编辑、汇编、连接生成.ASM、.OBJ、.LST、.EXE文件;使用DEBUG单步执行文件,并回答以下问题;指出指令的错误原因,上机运行,观察汇编程序给出的出错信息,改正后再上机验证。

2、从键盘输入两个一位十进制数,计算这两个数之和,并将结果在屏幕上显示出来。

3.方案设计

(一)寻址方式与基本指令实验

1、读懂下列源程序,使用EDIT生成名为EX11.ASM的源程序,汇编生成EX11.OBJ文件和EX11.LST文件,连接生成EX11.EXE文件;用EDIT打开EX11.LST文件,了解.LST文件包含的信息;使用DEBUG调试工具单步执行EX11.EXE程序,注意观察IP值的变化,并回答下列问题。

(1)程序装入后,代码段寄存器CS的内容为___076B_____H,代码段第一条可执行指令MOVAX,DATA对应的机器代码为_____B86A07_____H,它是一个____3____字节指令,注意观察执行该指令时IP值的变化情况,该指令源操作数DATA的寻址方式是_____立即数寻址_____,其值为_____076A_____。

(2)执行完MOVDS,DATA指令后,数据段寄存器DS的内容为____076A____H,源程序在数据段中定义的数据82H、68H和88H被装入的存储单元的物理地址分别为____076A0____H、____076A1____H和____076A2____H。

(3)程序中第一条ADDAL,[BX]指令对应的机器代码为____0207______H,它是一个____2____字节指令,注意观察执行该指令时IP值的变化情况;该指令中源操作数的寻址方式为_____寄存器间接寻址_,该操作数所在存储单元的逻辑地址(DS):

(BX)为_____076A:

10000_____,其物理地址为_____076A0_____H;执行完该指令后(AL)=___EA___H,CF=___0___,OF___0___,ZF___0___,SF___0___,AF___0___,PF___0___;若两操作数为无符号数,计算结果是否正确___正确____?

若两操作数为带符号数,计算结果是否正确____正确___?

若计算结果正确,结果是正数还是负数__正数____?

(4)执行完第二条ADDAL,[BX]指令后(AL)=___72___H,CF=___1___,OF___1___,ZF__0____,SF___0___,AF__1____,PF__1____;若两操作数为无符号数,计算结果是否正确___否____?

若两操作数为带符号数,计算结果是否正确____否____?

(5)指令MOVSUM,AL中目的操作数的寻址方式为____寄存器寻址______。

该指令执行完后,注意观察(DS):

0003H单元中值的变化,该单元的值变为____72____H。

DATASEGMENT

NUMDB82H,68H,88H

SUMDB?

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVBX,OFFSETNUM

MOVAL,[BX]

INCBX

ADDAL,[BX]

INCBX

ADDAL,[BX]

MOVSUM,AL

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

2、读懂下列源程序;编辑、汇编、连接生成EX12.ASM、EX12.OBJ、EX12.LST、EX12.EXE文件;使用DEBUG单步执行EX12.EXE文件,并回答以下问题。

(1)代码段的前三条指令MOVAX,STACK、MOVSS,AX和MOVSP,LENGTHSTL的功能为堆栈初始化,试问执行完这三条指令后,堆栈栈底所在单元的逻辑地址(SS):

(SP)为___11BC:

0100_____;执行PUSHAX指令后堆栈指针寄存器(SP)=___00FE___H,此时,(SS):

(SP+1)和(SS):

(SP)单元的值为__(EEBC:

00EF+1)和(EEBC:

00EF)_____H;执行完PUSHBX后(SP)=___00FC___H,此时,(SS):

(SP+1)和(SS):

(SP)单元的值为_(EEBC:

00FC+1)和(EEBC:

00FC)__H;执行完POPAX后(SP)=___00FE___H;执行完POPBX后(SP)=___0100___H;此时(AX)=___43A3___H,(BX)=___5B0A___H。

请读者通过对堆栈操作指令执行情况的观察,进一步掌握进、出栈操作过程。

(2)执行ADDAX,BX指令后(AX)=___A7AD_____H,CF=___0___,OF___0___,ZF___0___,SF___0___,AF___0___,PF___1___(注意考虑PF值与计算结果高8位有无关系);若两操作数为无符号数,计算结果是否正确___正确____?

若两操作数为带符号数,计算结果是否正确____正确____?

(3)执行ANDAX,BX指令后(AX)=___4802_____H,CF=___0___,OF___0___,ZF___0___,SF___0___,AF___0___,PF___1___。

STACKSEGMENTstack

STLDW100HDUP(?

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,SS:

STACK

START:

MOVAX,STACK

MOVSS,AX

MOVSP,LENGTHSTL

;表达式“LENGTHSTL”的功能为计算STL中定义的变量的个数,

;汇编后其值为100H,详见教材5.2.2

MOVAX,0101101100001010B

MOVBX,0100110010100011B

PUSHAX

PUSHBX

ADDAX,BX

POPAX

POPBX

ANDAX,BX

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

3、指出下列指令的错误原因,上机运行,观察汇编程序(MASM.EXE)给出的出错信息,改正后再上机验证。

(1)MOVBP,BL

(2)MOV[BX],[BP]

(3)MOV[BX],20H(4)INC[SI]

(5)ADDAX,[SI+DI](6)SHLAX,3

(7)PUSH2000H(8)POPAL

(9)MOVCS,AX(10)MOVDS,1000H

答:

(1)出错信息:

warningA4031:

Operandtypesmustmatch

错误原因:

操作数类型不匹配,BP是一个16位寄存器,而BL是一个8位寄存器。

(2)出错信息:

errorA2052:

Improperoperandtype

错误原因:

源操作数和目的操作数不能同时为存储器。

(3)出错信息:

error:

A2035:

Operandmusthavesize

错误原因:

源操作数长度不明确

(4)出错信息:

error:

A2035:

Operandmusthavesize

错误原因:

操作数的长度未指定

(5)出错信息:

error:

A2047:

Multipleindexregisters

错误原因:

同时使用了多个变址寄存器

(6)出错信息:

errorA2052:

Improperoperandtype

错误原因:

循环次数大于1应该间接移位

(7)出错信息:

errorA2056:

Immediatemodeillegal

错误原因:

不能对立即数进行栈操作

(8)出错信息:

errorA2058:

Byteregisterillegal

错误原因:

要求用字寄存器而使用了字节寄存器

(9)出错信息:

errorA2059:

IllegaluseofCSregister

错误原因:

CS不能作为目的操作数

(10)出错信息:

errorA2056:

Immediatemodeillegal

错误原因:

立即数不能送入数据段

(二)字符及字符串输入输出与顺序程序设计实验

1、问题分析

比如使用功能号为01H的用于实现单个字符输入的DOS功能调用接收从键盘输入的两个十进制数8和6,这时计算机内部得到的是这两个数的ASCII码值38H和36H。

由于数字09的ASCII码值与其代表的数值之间相差30H,因此将其减去30H即可得到以非压缩型BCD数形式表示的十进制数08H和06H,使用ADD指令对它们进行相加后结果为0EH(00001110B),显然需要用非压缩型BCD数加法调整指令对ADD的运算结果进行调整,调整后得到两个非压缩型BCD数01H和04H,将它们分别加上30H后变为其对应的ASCII码31H(1的ASCII码)和34H(4的ASCII码),然后调用功能号为02H用于单个字符输出的DOS功能调用将它们显示出来。

综上所述,需要考虑以下问题。

(1)从键盘输入一个一位十进制数的方法

通过功能号为1的DOS功能调用实现从键盘输入一个字符,格式如下:

MOVAH,01H

INT21H;此时程序等待用户键入,键入字符的ASCII码值存在AL中

SUBAL,30H;减去30H后得到键入数字所代表的数值

(2)提示信息字符串的显示

通过功能号为9的DOS功能调用实现字符串显示,注意字符串的最后一个字符必需为’$’。

指令格式如下:

MOVDX,OFFSETINFOR1;INFOR1为在数据段中定义的要显示的字符串

MOVAH,09H

INT21H

(2)非压缩型BCD数加法调整指令的使用

设从键盘输入的数值已存放在寄存器AL,BL中,可用下列程序完成数据相加和调整操作:

XORAH,AH

ADDAL,BL

AAA;

执行该指令后,AH中为和的十位上的数字,AL中为个位上的数字

请读者考虑,为什么要使用指令“XORAH,AH”,不用行否?

(3)计算结果的显示

执行完AAA指令后,只需分别将AH(十位上的数值)和AL(个位上的数值)加上30H,并依次调用功能号为2的DOS功能调用来显示字符。

具体指令代码如下:

PUSHAX

MOVDL,AH

ADDDL,30H

MOVAH,02H

INT21H

POPAX

MOVDL,AL

ADDDL,30H

MOVAH,02H

INT21H

2、源程序框架

DATASEGMENT

INFOR1DB"PleaseInputtheFirstData(<10):

$"

INFOR2DB0AH,0DH,"PleaseInputtheSecondData(<10):

$"

INFOR3DB0AH,0DH,"TheResultis:

$";0DH和0AH分别为非显示字符回

;车和换行的ASCII码值,美圆符号“$”为字符串结束标志,不能省略。

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

显示提示信息INFOR1并从键盘接收一个字符的指令序列

MOVDS,AX

SUBAL,30H

显示提示信息INFOR2并从键盘接收一个字符的指令序列

MOVBL,AL

SUBAL,30H

显示提示信息INFOR3的指令序列

PUSHAX

求和并调整指令序列

POPAX

显示十位及个位上数字的指令序列

PUSHAX

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

3、程序调试

源程序编写完成后,先静态检查,无误后,对源程序进行汇编和连接,生成可执行文件。

在DOS命令提示符下运行该程序,分析运行结果是否正确。

若结果不正确,使用DEBUG对其进行调试。

4、实验习题

从键盘输入两个一位十进制数,计算这两个数之积,并将结果在屏幕上显示出来。

四.测试数据及运行结果

1.寻址方式与基本指令实验

2.字符及字符串输入输出与顺序程序设计实验

课后题:

五.总结

通过实验一(寻址方式与基本指令实验),我熟悉掌握了汇编语言程序设计的上机步骤,了解了编译连接的过程,以及调试工具的各种命令,并对80x86寻址方式及基本指令的功能更加熟悉,进一步理解和巩固课堂学习内容。

通过实验二(字符及字符串输入输出与顺序程序设计实验),我学习和掌握字符及字符串的输入输出方法,顺序程序的设计方法以及进一步掌握调试工具的使用方法。

只有熟练掌握字符串显示语句和字符输入语句,理解题目,对各个功能实现的先后顺序和之前执行的程序对之后执行的程序的影响心中有数,这样才能实现程序的功能。

遇到的问题有少空格导致编译错误和调试时漏输文件名等,但都是简单操作问题均已成功解决。

6.附录:

1、寻址方式与基本指令实验(源程序方案设计中已附)

2、字符及字符串输入输出与顺序程序设计实验

(1)从键盘输入两个一位十进制数,计算这两个数之和,并将结果在屏幕上显示出来。

DATASEGMENT

INFOR1DB"PleaseInputtheFirstData(<10):

$"

INFOR2DB0AH,0DH,"PleaseInputtheSecondData(<10):

$"

INFOR3DB0AH,0DH,"TheResuleis:

$"

DATAENDS

STACKSEGMENTPARASTACK'STACK'

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVDX,OFFSETINFOR1

MOVAH,09H

INT21H

MOVAH,01H

INT21H

SUBAL,30H

MOVBL,AL

MOVDX,OFFSETINFOR2

MOVAH,09H

INT21H

MOVAH,01H

INT21H

SUBAL,30H

XORAH,AH

ADDAL,BL

AAA

PUSHAX

MOVDX,OFFSETINFOR3

MOVAH,09H

INT21H

POPAX

PUSHAX

MOVDL,AH

ADDDL,30H

MOVAH,02H

INT21H

POPAX

MOVDL,AL

ADDDL,30H

MOVAH,02H

INT21H

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

(2)从键盘输入两个一位十进制数,计算这两个数之积,并将结果在屏幕上显示出来。

DATASEGMENT

INFOR1DB"PleaseInputtheFirstData(<10):

$"

INFOR2DB0AH,0DH,"PleaseInputtheSecondData(<10):

$"

INFOR3DB0AH,0DH,"TheResuleis:

$"

DATAENDS

STACKSEGMENTPARASTACK'STACK'

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVDX,OFFSETINFOR1

MOVAH,09H

INT21H

MOVAH,01H

INT21H

SUBAL,30H

MOVBL,AL

MOVDX,OFFSETINFOR2

MOVAH,09H

INT21H

MOVAH,01H

INT21H

SUBAL,30H

XORAH,AH

MULBX

AAM

PUSHAX

MOVDX,OFFSETINFOR3

MOVAH,09H

INT21H

POPAX

PUSHAX

MOVDL,AH

ADDDL,30H

MOVAH,02H

INT21H

POPAX

MOVDL,AL

ADDDL,30H

MOVAH,02H

INT21H

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

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

当前位置:首页 > 工程科技 > 信息与通信

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

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