汇编语言实验4涉压缩BCD码数据的转换程序DEBUG练习
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2)、非压缩型BCD码:它用8位二进制数,即一个字节表示一位十进制数。其高4位固定为0,而低4位采用二进制数0000~1001分别表示十进制数中的0~9。亦即用0000 0000~0000 1001分别表示十进制数中的0~9。而其余组合则不允许出现。
表1列出了十进制数与BCD编码的对应关系。
表1 BCD编码表
ASSUME CS:CODE,DS:DATA,ES:DATA
START: MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET ASC_BUF
MOV DI,OFFSET BCDBUF
MOV CX,COUNT
MOV BX,CX
SHR BX,1 ;BX右移一位,等效于除2
JNC EVEN1 ;(CF)=0,则CX为偶数
本程序中因有的位置使用了中文符号,在编译时会报错,观察是如何报错的?检查问题出现在什么地方,将之改正后重新编译直到通过。
DATA SEGMENT
ASC_BUF DB‘71542185’
COUNT EQU $-ASC_BUF
BCDBUF DB 10 DUP(?)
DATA ENDS
CODE SEGMENT
MOV [DI],AL
ADD SI,2
INC DI
DEC CX
JNZ EVEN1
MOV AH,4CH
INT 21H
CODE ENDS
END START
(1)画出本程序程序流程图。
(2)将‘71542185’改为‘471542185’,观察结果有何不同,分析程序中判断数字个数奇偶并“对首位单独进行处理”的意义与程序设计方法。
MOV AL,E
MOV BL,3
IMUL BL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?
MOV BL,-1
MUL BL ;-1=ffh,cf=1。为什么?
MOVAL,58h
MOV BL,-1
iMUL BL ;-1,cf=0,高位全1。为什么?
MOVAL,90h
MOV BL,-1
MUL BL ;-1=ffh,cf=1。为什么?
(4)用命令 F110:11F 'A' 重复上二项实验,设法用D命令找到并观察结果,进行比较。
(5)用命令 E100 30 31 32 …… 3F将30H-3FH写入地址为100开始的内存单元中,再用D命令观察结果,看键入的16进制数是什么字符的ASCII码?
(6)用H命令检查下列各组16进制数加减结果并和你的手算结果比较:
本试验未体现
2.在编译与连接生成执行程序之后利用DEBUG调试该程序,了解不同变量数据存储情况,了解变量的三种含义及用法,了解加法、乘法运算方法及对标志位的影响。(在某些句后给出了单步执行该句后需要思考与记录的问题)。
DATA SEGMENT
A DW 35H,9AC9H
DB 34H
B DW 4CBEH,8872H
MOVAL,90h
MOV BL,-1
IMUL BL ;-1,cf=0,高位全0。为什么?
MOVAL,58h
MOV BL,1
MUL BL ;*1,cf=0,高位全0。为什么?
MOVAL,58h
MOV BL,1
iMUL BL ;*1,cf=0,高位全0。为什么?
MOVAL,90h
MOV BL,1
MUL BL ;*1,cf=0,高位全0。为什么?
①34H,22H②56H,78H③A5,79H④1284H,5678H⑤A758,347FH
例如: H 34 22
(7)用R 命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF 和AF的内容。
(8)用R命令将AX,BX内容改写为1050H及23A8H。
(9)用A命令在内存100H处键入下列内容:
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
MAIN PROC NEAR
PUSH DS
SUB AX,AX
MOV AX,DATA
MOV DS,AX
LEA AX,A+2; AX中值是多少?意义是什么?
MOV AX,A+2
ADD AX,B+2;多少加多少,结果在那里?等于多少?有没有标志改变?
MOV BX,A
ADC BX,B;多少加多少,结果在那里?等于多少?有没有标志改变?
MOV AX,WORD PTR C
ADD AX,WORD PTR D;多少加多少
MOVAL,90h
MOV BL,1
IMUL BL ;*1,cf=0,高位全1。为什么?
MOV AH,4CH
INT 21H
CODE ENDS
END START
(1)乘法运算时使CF与OF为0的情况其实不多见,你能否总结一下大致在什么情况下会出现它们为0的情况?
(2)如果要看到数据中数据的存放情况,一种方法是用D<段地址> <偏移地址>,另一种方法是用DDS:< 偏移地址>。你用什么方法得到段地址?试用这二种方法观察数据区中数据存放情况,A、B、C、D、E的地址各是多少,为什么?
DB 34H
C DD 8A607H
DB 34H
D DD 98AB457H
DB 34H
E DB -48H
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:MOV AX,DATA;数据段在那里?怎样看数据段中的内容?
(2)用命令 F100 10F 'A' 将'A'的ASCII码填入内存。
(3)用命令 D100 10F 观察内存中的16进制码及屏幕右边的ASCII字符。再用命令 D100 观察内存情况,之后接用二个命令D 观察内存情况。再用命令D100:10F 观察内存区的情况,说明这次与上次内存区各个段地址是什么,为什么?
3.检查下面那些指令是错误的,说明原因并改正。(用MASM对该程序进行编译,观察那些语句报错,报的是什么错?再看语句,根据语法与句法分析实际是什么错,在语句后加简单注释,说明错误原因,尝试进行修改,要求尽量使修改结果符合原设计意图。最终要求全部修改后能通过编译。)
DATA SEGMENT
BUF DB 3
MOV BX, 8275H
MOV AX,3412H
ADD BX,92A5H
ADC AX,2F65H
ADD BX,EAE6H
ADC AX,9C88H
用U命令检查键入的程序并记录,特别注意左边的机器码。
用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。并注意标志位有无变化。
标志位显示10
MOV DS,AX
MOV DL,255H
INCCOUNT
MOV CS,DX
CMP280,BL
PUSHDX
LEA AL,C
MOVBX,DA1[DX]
SUB [DI],[SI]
ADD[DX],BX
MOV80H,AX
MOV DA1,AX
ADD[DI],10H
MOVBX,OFFSET DA1
MOV[SI+DI],BX
BCD编码
十进制数
BCD编码
十进制数
0000
0001
0010
0011
0100
0101
0110
0111
0
1
2
3
4
5
6
7
1000
1001
1010
1011
1100
1101
1110
1111
8
9
这六种
情况在
BCD码
中不允
许出现
实验程序
1.按如下步骤操作,了解DEBUG 命令及其使用方法。
(1)打 DEBUG 进入 DEBUG 控制,显示提示符 '_ '。
DA1 DB ?
C DB 'B',0DH,0AH,'$'
COUNT EQU $-C
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:MOV AX,DATA
MOV DS,AX
;在执行一次单步后查看数据区,记录数据是怎样存放的。
;对以下每句运行后分析:这一句的意义是什么?
; 如果是加法,相加的数据是什么?在存储区什么位置?
; 处理的结果在那里?
; 对标志位的影响如何?
; 观察一下,如果去掉“WORD PTR ”编译时会如何?
MOV AX,OFFSET A+2;AX中值是多少?意义是什么?
常用字符的ASCII码表见表1.2。
2)、十进制数的BCD码表示
BCD码(Binary Code Decimal),又称“二进制表示的十进制数”,是一种非常适合数据输出的编码。一般而言,它可分为如下两种:
(1)、压缩型BCD码:它用4位二进制数表示一位十进制数。即采用二进制数0000~1001分别表示十进制数中的0~9,而另6种组合1010~1111在BCD中则不允许出现;
(3)总结将二个十六进制字符拼成一个八位二进制数的程序设计方法。
5.压缩BCD码转换为十进制数的ASCII码
将数据段中字节变量BCD_BUF为首地址的缓冲区中一个八位十进制数对应的压缩BCD码转换为ASCII码,并显示。
DATA SEGMENT
BCD_BUF DB 34H,25H,12H,97H ;十进制数97122534
MOV AX,WORD PTR C+2
ADC AX,WORD PTR D+2;多少加多少
;对以下每句分析:数据是如何存放的?
; 相乘结果在那里?
; 对CF与OF的影响如何?特别注意进位与符号扩展并不完全对应
MOV AL,E
百度文库MOV BL,-3
MUL BL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?
ASCII码与BCD码之间的转换
1)字符的ASCII码表示
计算机中存储的信息很多,其中一部分是用于数学计算的数据,另一部分则是表示某种含义的字符或字符串。由于从键盘输入的或屏幕显示的信息,都是用字符串的形式表示的。因此,微机中必须能够存储和处理字符和字符串。
计算机中使用的字符包括有如下4类:
·字母:A、B、C、…、Y、Z、a、b、c、…、y和z。
MOV BL,[SI] ;对首位单独进行处理
AND BL,0FH
MOV [DI],BL
DEC CX
INC SI
INC DI
EVEN1: MOV AL,[SI]
AND AL,0FH ;清高4位为0
MOV BL,[SI+1]
AND BL,0FH ;清高4位为0
MOV DL,16
MUL DL
ADD AL,BL
MOV AL,E
MOV BL,3
MUL BL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?
MOV AL,E
MOV BL,-3
IMUL BL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?
MOV AL,E
MOV BL,-1
IMUL BL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?
·数字:0、1、2、3、…、9。
·专用符号:!、@、+、-、﹡、/、……
·控制字符:BEL(响铃)、LF(换行)、CR(回车)……
这些字符在计算机内部都由特定的二进制数表示。目前在微机中,最常用的字符表示法是ASCII码(American Standard Code for Information Interchange,美国标准信息交换码)。在这种表示法中,每一个字符可以表示为一个8位的二进制数,即一个字节。其中。低7位用于表示该字符的ASCII值,最高位未定义,一般可用作奇偶校验位。
INCCS
MOV ES,DS
POP AH
ROL AX,2
MOV BX,DA1[DI]
MOV AH,4CH
INT 21H
CODE ENDS
END START
ASCII码与压缩型BCD码的相互转换
4.十进制数的ASCII码转换为压缩型BCD码
令数据段中自ASC_BUF开始的缓冲区内存放着若干个ASCII码表示的十进制数(每个单元存放一位十进制数),要求将这些ASCII码表示的十进制数转换为BCD码,并把两个相邻单元的BCD码合并在一个存储单元(若ASCII码的个数为奇数,则将首地址单元的十进制数对应的BCD码单独存放一个单元,其余的按统一的方法处理)。应用DEBUG跟踪执行程序,当程序执行到语句MOV AH,4CH 时,查看数据区的内容,分析运行结果。通过执行过程深入理解内存储器分段的概念。
CFCYNC
ZFZRNZ
SFNGPL
AFACNA
OFOVNV
PFPEPO
DFDNUP
IFEIDI
(1)对照书本中关于 debug操作的介绍对以上实验内容进行总结。
(2)G命令的功能是什么?有那几种格式?
(3)D命令的功能是什么?有那几种格式?
(4)用P命令逐条运行上述指令,与T命令进行比较,阅看书本中关于这二个命令的说明,它们之间有什么不同,在本实验中为什么没有体现?
表1列出了十进制数与BCD编码的对应关系。
表1 BCD编码表
ASSUME CS:CODE,DS:DATA,ES:DATA
START: MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET ASC_BUF
MOV DI,OFFSET BCDBUF
MOV CX,COUNT
MOV BX,CX
SHR BX,1 ;BX右移一位,等效于除2
JNC EVEN1 ;(CF)=0,则CX为偶数
本程序中因有的位置使用了中文符号,在编译时会报错,观察是如何报错的?检查问题出现在什么地方,将之改正后重新编译直到通过。
DATA SEGMENT
ASC_BUF DB‘71542185’
COUNT EQU $-ASC_BUF
BCDBUF DB 10 DUP(?)
DATA ENDS
CODE SEGMENT
MOV [DI],AL
ADD SI,2
INC DI
DEC CX
JNZ EVEN1
MOV AH,4CH
INT 21H
CODE ENDS
END START
(1)画出本程序程序流程图。
(2)将‘71542185’改为‘471542185’,观察结果有何不同,分析程序中判断数字个数奇偶并“对首位单独进行处理”的意义与程序设计方法。
MOV AL,E
MOV BL,3
IMUL BL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?
MOV BL,-1
MUL BL ;-1=ffh,cf=1。为什么?
MOVAL,58h
MOV BL,-1
iMUL BL ;-1,cf=0,高位全1。为什么?
MOVAL,90h
MOV BL,-1
MUL BL ;-1=ffh,cf=1。为什么?
(4)用命令 F110:11F 'A' 重复上二项实验,设法用D命令找到并观察结果,进行比较。
(5)用命令 E100 30 31 32 …… 3F将30H-3FH写入地址为100开始的内存单元中,再用D命令观察结果,看键入的16进制数是什么字符的ASCII码?
(6)用H命令检查下列各组16进制数加减结果并和你的手算结果比较:
本试验未体现
2.在编译与连接生成执行程序之后利用DEBUG调试该程序,了解不同变量数据存储情况,了解变量的三种含义及用法,了解加法、乘法运算方法及对标志位的影响。(在某些句后给出了单步执行该句后需要思考与记录的问题)。
DATA SEGMENT
A DW 35H,9AC9H
DB 34H
B DW 4CBEH,8872H
MOVAL,90h
MOV BL,-1
IMUL BL ;-1,cf=0,高位全0。为什么?
MOVAL,58h
MOV BL,1
MUL BL ;*1,cf=0,高位全0。为什么?
MOVAL,58h
MOV BL,1
iMUL BL ;*1,cf=0,高位全0。为什么?
MOVAL,90h
MOV BL,1
MUL BL ;*1,cf=0,高位全0。为什么?
①34H,22H②56H,78H③A5,79H④1284H,5678H⑤A758,347FH
例如: H 34 22
(7)用R 命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF 和AF的内容。
(8)用R命令将AX,BX内容改写为1050H及23A8H。
(9)用A命令在内存100H处键入下列内容:
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
MAIN PROC NEAR
PUSH DS
SUB AX,AX
MOV AX,DATA
MOV DS,AX
LEA AX,A+2; AX中值是多少?意义是什么?
MOV AX,A+2
ADD AX,B+2;多少加多少,结果在那里?等于多少?有没有标志改变?
MOV BX,A
ADC BX,B;多少加多少,结果在那里?等于多少?有没有标志改变?
MOV AX,WORD PTR C
ADD AX,WORD PTR D;多少加多少
MOVAL,90h
MOV BL,1
IMUL BL ;*1,cf=0,高位全1。为什么?
MOV AH,4CH
INT 21H
CODE ENDS
END START
(1)乘法运算时使CF与OF为0的情况其实不多见,你能否总结一下大致在什么情况下会出现它们为0的情况?
(2)如果要看到数据中数据的存放情况,一种方法是用D<段地址> <偏移地址>,另一种方法是用DDS:< 偏移地址>。你用什么方法得到段地址?试用这二种方法观察数据区中数据存放情况,A、B、C、D、E的地址各是多少,为什么?
DB 34H
C DD 8A607H
DB 34H
D DD 98AB457H
DB 34H
E DB -48H
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:MOV AX,DATA;数据段在那里?怎样看数据段中的内容?
(2)用命令 F100 10F 'A' 将'A'的ASCII码填入内存。
(3)用命令 D100 10F 观察内存中的16进制码及屏幕右边的ASCII字符。再用命令 D100 观察内存情况,之后接用二个命令D 观察内存情况。再用命令D100:10F 观察内存区的情况,说明这次与上次内存区各个段地址是什么,为什么?
3.检查下面那些指令是错误的,说明原因并改正。(用MASM对该程序进行编译,观察那些语句报错,报的是什么错?再看语句,根据语法与句法分析实际是什么错,在语句后加简单注释,说明错误原因,尝试进行修改,要求尽量使修改结果符合原设计意图。最终要求全部修改后能通过编译。)
DATA SEGMENT
BUF DB 3
MOV BX, 8275H
MOV AX,3412H
ADD BX,92A5H
ADC AX,2F65H
ADD BX,EAE6H
ADC AX,9C88H
用U命令检查键入的程序并记录,特别注意左边的机器码。
用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。并注意标志位有无变化。
标志位显示10
MOV DS,AX
MOV DL,255H
INCCOUNT
MOV CS,DX
CMP280,BL
PUSHDX
LEA AL,C
MOVBX,DA1[DX]
SUB [DI],[SI]
ADD[DX],BX
MOV80H,AX
MOV DA1,AX
ADD[DI],10H
MOVBX,OFFSET DA1
MOV[SI+DI],BX
BCD编码
十进制数
BCD编码
十进制数
0000
0001
0010
0011
0100
0101
0110
0111
0
1
2
3
4
5
6
7
1000
1001
1010
1011
1100
1101
1110
1111
8
9
这六种
情况在
BCD码
中不允
许出现
实验程序
1.按如下步骤操作,了解DEBUG 命令及其使用方法。
(1)打 DEBUG 进入 DEBUG 控制,显示提示符 '_ '。
DA1 DB ?
C DB 'B',0DH,0AH,'$'
COUNT EQU $-C
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:MOV AX,DATA
MOV DS,AX
;在执行一次单步后查看数据区,记录数据是怎样存放的。
;对以下每句运行后分析:这一句的意义是什么?
; 如果是加法,相加的数据是什么?在存储区什么位置?
; 处理的结果在那里?
; 对标志位的影响如何?
; 观察一下,如果去掉“WORD PTR ”编译时会如何?
MOV AX,OFFSET A+2;AX中值是多少?意义是什么?
常用字符的ASCII码表见表1.2。
2)、十进制数的BCD码表示
BCD码(Binary Code Decimal),又称“二进制表示的十进制数”,是一种非常适合数据输出的编码。一般而言,它可分为如下两种:
(1)、压缩型BCD码:它用4位二进制数表示一位十进制数。即采用二进制数0000~1001分别表示十进制数中的0~9,而另6种组合1010~1111在BCD中则不允许出现;
(3)总结将二个十六进制字符拼成一个八位二进制数的程序设计方法。
5.压缩BCD码转换为十进制数的ASCII码
将数据段中字节变量BCD_BUF为首地址的缓冲区中一个八位十进制数对应的压缩BCD码转换为ASCII码,并显示。
DATA SEGMENT
BCD_BUF DB 34H,25H,12H,97H ;十进制数97122534
MOV AX,WORD PTR C+2
ADC AX,WORD PTR D+2;多少加多少
;对以下每句分析:数据是如何存放的?
; 相乘结果在那里?
; 对CF与OF的影响如何?特别注意进位与符号扩展并不完全对应
MOV AL,E
百度文库MOV BL,-3
MUL BL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?
ASCII码与BCD码之间的转换
1)字符的ASCII码表示
计算机中存储的信息很多,其中一部分是用于数学计算的数据,另一部分则是表示某种含义的字符或字符串。由于从键盘输入的或屏幕显示的信息,都是用字符串的形式表示的。因此,微机中必须能够存储和处理字符和字符串。
计算机中使用的字符包括有如下4类:
·字母:A、B、C、…、Y、Z、a、b、c、…、y和z。
MOV BL,[SI] ;对首位单独进行处理
AND BL,0FH
MOV [DI],BL
DEC CX
INC SI
INC DI
EVEN1: MOV AL,[SI]
AND AL,0FH ;清高4位为0
MOV BL,[SI+1]
AND BL,0FH ;清高4位为0
MOV DL,16
MUL DL
ADD AL,BL
MOV AL,E
MOV BL,3
MUL BL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?
MOV AL,E
MOV BL,-3
IMUL BL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?
MOV AL,E
MOV BL,-1
IMUL BL;多少乘多少,结果在那里?等于多少?有没有标志改变?为什么?
·数字:0、1、2、3、…、9。
·专用符号:!、@、+、-、﹡、/、……
·控制字符:BEL(响铃)、LF(换行)、CR(回车)……
这些字符在计算机内部都由特定的二进制数表示。目前在微机中,最常用的字符表示法是ASCII码(American Standard Code for Information Interchange,美国标准信息交换码)。在这种表示法中,每一个字符可以表示为一个8位的二进制数,即一个字节。其中。低7位用于表示该字符的ASCII值,最高位未定义,一般可用作奇偶校验位。
INCCS
MOV ES,DS
POP AH
ROL AX,2
MOV BX,DA1[DI]
MOV AH,4CH
INT 21H
CODE ENDS
END START
ASCII码与压缩型BCD码的相互转换
4.十进制数的ASCII码转换为压缩型BCD码
令数据段中自ASC_BUF开始的缓冲区内存放着若干个ASCII码表示的十进制数(每个单元存放一位十进制数),要求将这些ASCII码表示的十进制数转换为BCD码,并把两个相邻单元的BCD码合并在一个存储单元(若ASCII码的个数为奇数,则将首地址单元的十进制数对应的BCD码单独存放一个单元,其余的按统一的方法处理)。应用DEBUG跟踪执行程序,当程序执行到语句MOV AH,4CH 时,查看数据区的内容,分析运行结果。通过执行过程深入理解内存储器分段的概念。
CFCYNC
ZFZRNZ
SFNGPL
AFACNA
OFOVNV
PFPEPO
DFDNUP
IFEIDI
(1)对照书本中关于 debug操作的介绍对以上实验内容进行总结。
(2)G命令的功能是什么?有那几种格式?
(3)D命令的功能是什么?有那几种格式?
(4)用P命令逐条运行上述指令,与T命令进行比较,阅看书本中关于这二个命令的说明,它们之间有什么不同,在本实验中为什么没有体现?