汇编语言实验4涉与压缩BCD码数据的转换程序与DEBUG练习.docx
- 文档编号:14396252
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:19
- 大小:169.35KB
汇编语言实验4涉与压缩BCD码数据的转换程序与DEBUG练习.docx
《汇编语言实验4涉与压缩BCD码数据的转换程序与DEBUG练习.docx》由会员分享,可在线阅读,更多相关《汇编语言实验4涉与压缩BCD码数据的转换程序与DEBUG练习.docx(19页珍藏版)》请在冰点文库上搜索。
汇编语言实验汇编语言实验4涉与压缩涉与压缩BCD码数据的转换程码数据的转换程序与序与DEBUG练习练习ASCII码与BCD码之间的转换1)字符的ASCII码表示计算机中存储的信息很多,其中一部分是用于数学计算的数据,另一部分则是表示某种含义的字符或字符串。
由于从键盘输入的或屏幕显示的信息,都是用字符串的形式表示的。
因此,微机中必须能够存储和处理字符和字符串。
计算机中使用的字符包括有如下4类:
字母:
A、B、C、Y、Z、a、b、c、y和z。
数字:
0、1、2、3、9。
专用符号:
!
、控制字符:
BEL(响铃)、LF(换行)、CR(回车)这些字符在计算机内部都由特定的二进制数表示。
目前在微机中,最常用的字符表示法是ASCII码(AmericanStandardCodeforInformationInterchange,美国标准信息交换码)。
在这种表示法中,每一个字符可以表示为一个8位的二进制数,即一个字节。
其中。
低7位用于表示该字符的ASCII值,最高位未定义,一般可用作奇偶校验位。
常用字符的ASCII码表见表1.2。
2)、十进制数的BCD码表示BCD码(BinaryCodeDecimal),又称“二进制表示的十进制数”,是一种非常适合数据输出的编码。
一般而言,它可分为如下两种:
(1)、压缩型BCD码:
它用4位二进制数表示一位十进制数。
即采用二进制数00001001分别表示十进制数中的09,而另6种组合10101111在BCD中则不允许出现;
(2)、非压缩型BCD码:
它用8位二进制数,即一个字节表示一位十进制数。
其高4位固定为0,而低4位采用二进制数00001001分别表示十进制数中的09。
亦即用0000000000001001分别表示十进制数中的09。
而其余组合则不允许出现。
表1列出了十进制数与BCD编码的对应关系。
表1BCD编码表BCD编码十进制数BCD编码十进制数00000001001000110100010101100111012345671000100110101011110011011110111189这六种情况在BCD码中不允许出现实验程序1.按如下步骤操作,了解DEBUG命令及其使用方法。
(1)打DEBUG进入DEBUG控制,显示提示符_。
(2)用命令F10010FA将A的ASCII码填入内存。
(3)用命令D10010F观察内存中的16进制码及屏幕右边的ASCII字符。
再用命令D100观察内存情况,之后接用二个命令D观察内存情况。
再用命令D100:
10F观察内存区的情况,说明这次与上次内存区各个段地址是什么,为什么?
(4)用命令F110:
11FA重复上二项实验,设法用D命令找到并观察结果,进行比较。
(5)用命令E1003031323F将30H-3FH写入地址为100开始的内存单元中,再用D命令观察结果,看键入的16进制数是什么字符的ASCII码?
(6)用H命令检查下列各组16进制数加减结果并和你的手算结果比较:
34H,22H56H,78HA5,79H1284H,5678HA758,347FH例如:
H3422(7)用R命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。
(8)用R命令将AX,BX内容改写为1050H及23A8H。
(9)用A命令在内存100H处键入下列内容:
MOVBX,8275HMOVAX,3412HADDBX,92A5HADCAX,2F65HADDBX,EAE6HADCAX,9C88H用U命令检查键入的程序并记录,特别注意左边的机器码。
用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。
并注意标志位有无变化。
标志位显示10CFCYNCZFZRNZSFNGPLAFACNAOFOVNVPFPEPODFDNUPIFEIDI
(1)对照书本中关于debug操作的介绍对以上实验内容进行总结。
(2)G命令的功能是什么?
有那几种格式?
(3)D命令的功能是什么?
有那几种格式?
(4)用P命令逐条运行上述指令,与T命令进行比较,阅看书本中关于这二个命令的说明,它们之间有什么不同,在本实验中为什么没有体现?
本试验未体现2.在编译与连接生成执行程序之后利用DEBUG调试该程序,了解不同变量数据存储情况,了解变量的三种含义及用法,了解加法、乘法运算方法及对标志位的影响。
(在某些句后给出了单步执行该句后需要思考与记录的问题)。
DATASEGMENTADW35H,9AC9HDB34HBDW4CBEH,8872HDB34HCDD8A607HDB34HDDD98AB457HDB34HEDB-48HDATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:
DATA,SS:
STACK,CS:
CODESTART:
MOVAX,DATA;数据段在那里?
怎样看数据段中的内容?
MOVDS,AX;在执行一次单步后查看数据区,记录数据是怎样存放的。
;对以下每句运行后分析:
这一句的意义是什么?
;如果是加法,相加的数据是什么?
在存储区什么位置?
;处理的结果在那里?
;对标志位的影响如何?
;观察一下,如果去掉“WORDPTR”编译时会如何?
MOVAX,OFFSETA+2;AX中值是多少?
意义是什么?
LEAAX,A+2;AX中值是多少?
意义是什么?
MOVAX,A+2ADDAX,B+2;多少加多少,结果在那里?
等于多少?
有没有标志改变?
MOVBX,AADCBX,B;多少加多少,结果在那里?
等于多少?
有没有标志改变?
MOVAX,WORDPTRCADDAX,WORDPTRD;多少加多少MOVAX,WORDPTRC+2ADCAX,WORDPTRD+2;多少加多少;对以下每句分析:
数据是如何存放的?
;相乘结果在那里?
;对CF与OF的影响如何?
特别注意进位与符号扩展并不完全对应MOVAL,EMOVBL,-3MULBL;多少乘多少,结果在那里?
等于多少?
有没有标志改变?
为什么?
MOVAL,EMOVBL,3MULBL;多少乘多少,结果在那里?
等于多少?
有没有标志改变?
为什么?
MOVAL,EMOVBL,-3IMULBL;多少乘多少,结果在那里?
等于多少?
有没有标志改变?
为什么?
MOVAL,EMOVBL,-1IMULBL;多少乘多少,结果在那里?
等于多少?
有没有标志改变?
为什么?
MOVAL,EMOVBL,3IMULBL;多少乘多少,结果在那里?
等于多少?
有没有标志改变?
为什么?
MOVBL,-1MULBL;-1=ffh,cf=1。
为什么?
MOVAL,58hMOVBL,-1iMULBL;-1,cf=0,高位全1。
为什么?
MOVAL,90hMOVBL,-1MULBL;-1=ffh,cf=1。
为什么?
MOVAL,90hMOVBL,-1IMULBL;-1,cf=0,高位全0。
为什么?
MOVAL,58hMOVBL,1MULBL;*1,cf=0,高位全0。
为什么?
MOVAL,58hMOVBL,1iMULBL;*1,cf=0,高位全0。
为什么?
MOVAL,90hMOVBL,1MULBL;*1,cf=0,高位全0。
为什么?
MOVAL,90hMOVBL,1IMULBL;*1,cf=0,高位全1。
为什么?
MOVAH,4CHINT21HCODEENDSENDSTART
(1)乘法运算时使CF与OF为0的情况其实不多见,你能否总结一下大致在什么情况下会出现它们为0的情况?
(2)如果要看到数据中数据的存放情况,一种方法是用D,另一种方法是用DDS:
。
你用什么方法得到段地址?
试用这二种方法观察数据区中数据存放情况,A、B、C、D、E的地址各是多少,为什么?
3.检查下面那些指令是错误的,说明原因并改正。
(用MASM对该程序进行编译,观察那些语句报错,报的是什么错?
再看语句,根据语法与句法分析实际是什么错,在语句后加简单注释,说明错误原因,尝试进行修改,要求尽量使修改结果符合原设计意图。
最终要求全部修改后能通过编译。
)DATASEGMENTBUFDB3DA1DB?
CDBB,0DH,0AH,$COUNTEQU$-CDATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:
DATA,SS:
STACK,CS:
CODESTART:
MOVAX,DATAMOVDS,AXMOVDL,255HINCCOUNTMOVCS,DXCMP280,BLPUSHDXLEAAL,CMOVBX,DA1DXSUBDI,SIADDDX,BXMOV80H,AXMOVDA1,AXADDDI,10HMOVBX,OFFSETDA1MOVSI+DI,BXINCCSMOVES,DSPOPAHROLAX,2MOVBX,DA1DIMOVAH,4CHINT21HCODEENDSENDSTARTASCII码与压缩型BCD码的相互转换4.十进制数的ASCII码转换为压缩型BCD码令数据段中自ASC_BUF开始的缓冲区内存放着若干个ASCII码表示的十进制数(每个单元存放一位十进制数),要求将这些ASCII码表示的十进制数转换为BCD码,并把两个相邻单元的BCD码合并在一个存储单元(若ASCII码的个数为奇数,则将首地址单元的十进制数对应的BCD码单独存放一个单元,其余的按统一的方法处理)。
应用DEBUG跟踪执行程序,当程序执行到语句MOVAH,4CH时,查看数据区的内容,分析运行结果。
通过执行过程深入理解内存储器分段的概念。
本程序中因有的位置使用了中文符号,在编译时会报错,观察是如何报错的?
检查问题出现在什么地方,将之改正后重新编译直到通过。
DATASEGMENTASC_BUFDB71542185COUNTEQU$-ASC_BUFBCDBUFDB10DUP(?
)DATAENDSCODESEGMENTASSUMECS:
CODE,DS:
DATA,ES:
DATASTART:
MOVAX,DATAMOVDS,AXMOVSI,OFFSETASC_BUFMOVDI,OFFSETBCDBUFMOVCX,COUNTMOVBX,CXSHRBX,1;BX右移一位,等效于除2JNCEVEN1;(CF)=0,则CX为偶数MOVBL,SI;对首位单独进行处理ANDBL,0FHMOVDI,BLDECCXINCSIINCDIEVEN1:
MOVAL,SIANDAL,0FH;清高4位为0MOVBL,SI+1ANDBL,0FH;清高4位为0MOVDL,16MULDLADDAL,BLMOVDI,ALADDSI,2INCDIDECCXJNZEVEN1MOVAH,4CHINT21HCODEENDSENDSTART
(1)画出本程序程序流程图。
(2)将71542185改为471542185,观察结果有何不同,分析程序中判断数字个数奇偶并“对首位单独进行处理”的意义与程序设计方法。
(3)总结将二个十六进制字符拼成一个八位二进制数的程序设计方法。
5.压缩BCD码转换为十进制数的ASCII码将数据段中字节变量BCD_BUF为首地址的缓冲区中一个八位十进制数对应的压缩BCD码转换为ASCII码,并显示。
DATASEGMENTBCD_BUFDB34H,25H,12H,97H;十进制数97122534DATAENDSCODESEGMENTASSUMECS:
CODE,DS:
DATAMAINPROCNEARPUSHDSSUBAX,AXMOVAX,DATAMOVDS,AXMOVCX,4MOVSI,OFFSETBCD_BUFADDSI,3MOVDH,0CHG_OUT1:
PUSHCXMOVAL,SI;取压缩BCD码DECSI;修改指针MOVBL,AL;保存ALMOVCL,4RORAL,CLANDAL,0FH;取高半字节BCD码ADDAL,30H;生成ASCII码MOVDL,ALMOVAH,2INT21H;标准设备输出MOVAL,BL;从BL所保存的AL恢复ALANDAL,0FH;取低半字节BCD码ADDAL,30H;生成ASCII码MOVDL,ALMOVAH,2INT21H;标准设备输出POPCXDECCXJNZCHG_OUT1RETMAINENDPCODEENDSEND
(1)对本程序不用执行执行文件的方式,而分别用DEBUG单步跟踪、分断点运行等二种方式操作,记录操作过程与执行结果。
(2)总结从一个字节16进制数据获得其二个16进制数码的程序设计方法。
二进制数与BCD码之间的转换6.二进制数转换为压缩BCD码将DX寄存器中存放的无符号二进制数(065535)转换为压缩BCD码(在程序中自行加一条语句,将一个数保存到DX中),保存在BCD_BUF缓冲区中。
应用DEBUG跟踪执行程序,查看数据区的内容,分析运行结果DATASEGMENTBCD_BUFDB3DUP(0)DATAENDSCODESEGMENTASSUMECS:
CODE,DS:
DATAMAINPROCNEARPUSHDSSUBAX,AXMOVAX,DATAMOVDS,AXMOVDI,OFFSETBCD_BUFMOVAL,0MOVCX,5CLEAR_BUF:
MOVDI,AL;初始化缓冲区INCDIDECCXJNZCLEAR_BUFMOVDI,OFFSETBCD_BUFCHG_BCD1:
MOVAX,DX;转换开始MOVDX,0MOVCX,10DIVCXMOVBL,DLMOVDX,0MOVCX,10DIVCXMOVCL,4SHLDL,CL;左移4位,等效于乘以16ANDDL,0F0HORDL,BL;组合BCD码MOVDI,DL;存储BCD码INCDIMOVDX,AXCMPDX,0JNZCHG_BCD1RETMAINENDPCODEENDSEND
(1)假如保持在DX中数为6440,用debug调试,运行G=040,再用DDS:
0观察结果。
又更换DX中数为26440,用同样方法再看结果。
说明结果是怎样存放的。
7.压缩BCD码转换为二进制数将BX寄存器中的四位压缩型BCD码转换为二进制数,并存放到DX中。
应用DEBUG跟踪执行程序,分析运行结果CODESEGMENTASSUMECS:
CODESTART:
MOVBX,3698HMOVSI,BXXORAX,AXMOVCX,4;BCD码共4位CHG_AGAIN1:
MOVDI,0PUSHCXMOVCX,4;每个BCD码对应四位2进制数CHG_AGAIN2:
SHLSI,1;SI左移,最高位送CFRCLDI,1;CF最高位送DIDECCXJNZCHG_AGAIN2;将某位BCD码送DIMOVCX,10MULCXADDAX,DI;二进制数合并POPCXDECCXJNZCHG_AGAIN1MOVDX,AXMOVAH,4CHINT21HCODEENDSENDSTART
(1)将以上实验3、4、5、6所要求的压缩BCD码改为要求非压缩BCD码,求设计程序。
(2)第5、6题提到的数说明为二进制数,如果提到的数说明为十六进制数,意义是否相同?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 实验 压缩 BCD 数据 转换 程序 DEBUG 练习