实验三 代码转换
北京邮电大学微机原理软件实验报告

信息与通信工程学院微机原理软件实验报告班级:姓名:学号:班内序号:时间:微机原理软件实验·报告实验一DEBUG 的使用一、实验目的1.掌握汇编程序的编辑,编译,连接和执行的全过程;2.学习和掌握用DEBUG 调试程序的方法。
二、实验内容1. 用编辑软件,输入以下汇编语言源程序:DAT SEGMENTA DB 20 ;(自定)B DB 15 ;(自定)Y DB 3 DUP (0)Z DB 0, 0DAT ENDSSTA SEGMENT STACKDW 50 DUP (?)STA ENDSCOD SEGMENTASSUME CS: COD, DS: DATSTAR PROC FARPUSH DSXOR AX, AXPUSH AXMOV AX, DATMOV DS, AXMOV AX, STAMOV SS, AXMOV AL, AMOV Z, ALMOV Z+1, ALCALL SUB1MOV AL,B微机原理软件实验·报告MOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,AMOV Z,ALMOV AL,BMOV Z+1,ALCALL SUB1ADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSTAR ENDPSUB1 PROCMOV AL, ZMOV AH, Z+1MUL AHADD WORD PTR Y, AXADC BYTE PTR[Y+2], 0RETSUB1 ENDPCOD ENDSEND STAR2. 通过编译,连接形成可执行文件。
3. 用DEBUG 将可执行文件调入,并进行调试。
1) 用D 命令观察数据区在内存中的具体内容,记录单元A 和B 的具体地址。
2) 用U 命令对目标代码反汇编,观察反汇编后的结果。
注意发现源程序的起始位置,并记录这个起始地址。
3) 用T 命令作单步跟踪调试。
比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。
实验三 码型变换实验

实验三码型变换实验一、实验目的1.了解几种常见的数字基带信号。
2.掌握常用数字基带传输码型的编码规则。
3.掌握用FPGA实现码型变换的方法。
二、实验内容1.观察NRZ、RZ码、BRZ码、BNRZ码、AMI码、CMI码、HDB3码、BPH码的波形。
2.观察全0码或全1码时各码型波形。
3.观察HDB3码、AMI码、BNRZ码正、负极性波形。
4.观察NRZ码、RZ码、BRZ码、BNRZ码、AMI码、CMI码、HDB3码、BPH码经过码型反变换后的输出波形。
5.自行设计码型变换电路,下载并观察输出波形。
三、实验器材1.信号源模块2.码型变换模块3.20M双踪示波器一台4.频率计(可选)一台5.PC机(可选)一台6.连接线若干四、实验原理1.编码规则①NRZ码(见教材)②RZ码(见教材)③BNRZ码-双极性不归零码1 0 1 0 0 1 1 0+E-E④BRZ码-双极性归零码1 0 1 0 0 1 1 0+E-E⑤AMI码(见教材)⑥HDB3码(见教材)⑦BPH码BPH码的全称是数字双相码(Digital Diphase),又叫分相码(Biphase,Split-phase)或曼彻斯特码(Manchester),其编码规则之一是:0 01(零相位的一个周期的方波);110(π相位的一个周期的方波)。
例如:代码: 1 1 0 0 1 0 1双相码: 10 10 01 01 10 01 10这种码既能提取足够的定时分量,又无直流漂移,编码过程简单。
但带宽要宽些。
⑧CMI码CMI码的全称是传号反转码,其编码规则如下:信息码中的“1”码交替用“11”和“00”表示,“0”码用“01”表示。
例如:代码: 1 1 0 1 0 0 1 0CMI码: 11 00 01 11 01 01 00 01这种码型有较多的电平跃变,因此,含有丰富的定时信息。
该码已被ITU-T推荐为PCM四次群的接口码型。
在光纤传输系统中有时也用CMI码作线路传输码型。
实验三 汉明码编码与译码

实验三汉明码编码与译码一、实验题目1、写一个错误生成器模块,在给定的一个比特流作输入时,它的输出流的每个比特流都以概率p发生了改变,即比特错误概率为p。
2、对m=3,将汉明码编码后的比特流输入到上述模块,然后对收到的字用译码器进行译码。
二、实验目的1、理解和掌握汉明码编码与译码的原理;三、算法设计四、程序分析1、错误生成模块:任一给以p,系统任意生成一数,若比p小则让其出错,否则不出错。
2、编码:首先随机生成H矩阵,由H矩阵生成G矩阵,利用C=mG编码。
3、解码:若v*H’=0,则没有出错,直接输出v中前k位;若v*H’!=0,列出所有的e和e*H’得到伴随阵s,若能在s中找到s=v*H则c0=v-e,输出c0中前k位;若找不到s,则输出“错误位数大于纠错能力,无法解码”。
五、程序代码#include <iostream>#include <string> // 字符串处理头文件#include <iomanip> // 输入输出控制头文件#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;void Err_Pro();void Hamming_Decode();intm,n,k,t,err,r,R[100],N[100],COUNT[100],num[100][100],Th[100][100],PT_S[100][100],PT_D[1 00][100];intH[100][100],HT[100][100],Ig[100][100],P[100][100],G[100][100],Ibit[100],Cbit[100],Err_Cbit[1 00],V[100];/**************************************************************************//*函数名:void Binary_Conversion(int i) *//*功能:十-二进制转换*//*说明:该函数输出二进制数为低位在前,高位在后*//**************************************************************************/ void Binary_Conversion(int i){int j=0,temp=0;do // 生成完整n个二进制{temp = i % 2; // 判断相应最低位为0或1(若为2的倍数则为0,否则为1)i = i / 2; // 为考虑前一位为0或1做准备if(j < m) // m确定二进制的位数{N[j] = temp;j++;}}while(i != 0); // 等待i等于0(即等待十进制数为0时不进行二进制转换)}/**************************************************************************/ /*函数名:void Random_Array() */ /*功能:将数组的列随机排放*/ /**************************************************************************/ void Random_Array(){srand(unsigned(time(NULL))); // 随机生成条件(抵消rand函数伪随机效果)cout << endl << "产生随机数为:" << endl;for(int j=0;j<n;j++){loop:r= rand() % n; // 随机生成范围为0~n-1的正整数for(int i=0;i<j;i++){if(R[i] == r) // 如果随机产生的数与已产生的数相等,则重新随机产生数{goto loop;}}R[j] = r; // 产生不重复的随机数cout << setw(4) << r + 1;for(int i=0;i<m;i++){PT_D[i][j] = PT_S[i][r]; // 顺序转置系数矩阵->随机转置系数矩阵}}}/**************************************************************************/ /*函数名:void Creat_H() */ /*功能:创建系统型奇偶校验矩阵H */ /*说明:系统型奇偶校验矩阵H由转置负系数矩阵和单位矩阵组成*/ /**************************************************************************/ void Creat_H(){int i,j,count0=0,count1=0,count2=0,count3=0;/*************生成单位矩阵Ih************/ //教材P101for(i=0;i<m;i++) //i表示行j表示列{for(j=0;j<n;j++){if((j >= k) && (i+k == j))Ih[i][j] = 1;elseIh[i][j] = 0;}}/*********生成转置负系数矩阵PT**********/for(i=0;i<m;i++) // 转置二进制转换数组到PT_S{for(j=0;j<n;j++){PT_S[i][j] = num[j][i]; // 生成顺序转置系数矩阵}}Random_Array();//将数组的列随机排放for(j=0;j<n;j++){for(i=0;i<m;i++){if(PT_D[i][j] == 0)count0 ++;}count1 = count0; // count1记录每一列1的个数count0 = 0;if(count1 == (m-1)) // 将只有一位为1其余位为0的列的所有位置0{for(i=0;i<m;i++){PT_D[i][j] = 0;}}else// COUNT数组记录只有一位为1其余位为0的列为0,其余位的值为PT_D列的位置值+1 COUNT[count2] = j + 1;count2 ++;}for(int q=0;q<n;q++) // 将PT_D的至少有两个1的列赋给PT{if(COUNT[q] > 0){for(i=0;i<m;i++)PT[i][count3] = PT_D[i][q];count3 ++;}}cout << endl;/********生成系统型奇偶校验矩阵H********/for(i=0;i<m;i++){for(j=0;j<n;j++){H[i][j] = PT[i][j] + Ih[i][j];}}cout << endl << "系统型奇偶校验矩阵H为:" << endl;for(i=0;i<m;i++) // 显示系统型奇偶校验矩阵H{for(j=0;j<n;j++){cout << setw(2) << H[i][j] << setw(2);}cout << endl;}}/**************************************************************************/ /*函数名:void Creat_G() *//*功能:创建系统型生成矩阵G */ /*说明:系统型生成矩阵G由单位矩阵和系数矩阵组成*/ /**************************************************************************/ void Creat_G(){int i,j;/*************生成单位矩阵Ig************/for(i=0;i<k;i++){for(j=0;j<n;j++){if(i == j)Ig[i][j] = 1;elseIg[i][j] = 0;}}/*************生成系数矩阵P*************/for(j=0;j<n;j++){for(i=0;i<k;i++){if(j>k-1)P[i][j] = PT[j-k][i];}}/**********生成系统型生成矩阵G**********/for(i=0;i<k;i++){for(j=0;j<n;j++){G[i][j] = P[i][j] + Ig[i][j];}}cout << endl << "系统型生成矩阵G为:" << endl;for(i=0;i<k;i++) // 显示系统型奇偶校验矩阵H{for(j=0;j<n;j++){cout << setw(2) << G[i][j] << setw(2);}cout << endl;}}/*******************************主函数*************************************/ int main(){int i,j;cout << setw(30) << "汉明码" << endl;cout << "请输入校验元位数m = ";cin >> m;n = pow(2,m) - 1; //码长k = pow(2,m) - 1 -m; //信息源位数cout << "提示:" << setw(10) << "您输入的为(" <<n<< "," <<k<< ")汉明码,可纠正" << t << "个错误" << endl;cout << endl;for(i=0;i<n;i++) // 将n个转换二进制数组存入二维数组{Binary_Conversion(i+1);for(j=0;j<m;j++){num[i][j] = N[j];//num[i][m-j-1] = N[j]; // m-j-1意义在于将二进制高位在前,低位在后}}cout << "n个二进制转换表为:" << endl;for(i=0;i<n;i++) // 输出二进制转换对应表低位在前高位在后{for(j=0;j<m;j++){cout << num[i][j] << setw(2);}cout << setw(4);}cout << endl;Creat_H();Creat_G();cout << endl << "请输入" << k << "位信息比特流:" << endl;for(i=0;i<k;i++)cin >> Ibit[i];for(i=0;i<n;i++){for(j=0;j<k;j++){Cbit[i] += (Ibit[j] * G[j][i]); // 十进制加法Cbit[i] = Cbit[i] % 2; // 将十进制转换二进制}}cout << endl << "输出" << n << "位码字比特流:" << endl;for(i=0;i<n;i++) //输出编码后的码字cout << setw(3) << Cbit[i];cout << endl;Err_Pro(); //错误概率函数Hamming_Decode(); //汉明译码return 0;}/**************************************************************************/ /*函数名:void Err_Pro() */ /*功能:产生错误概率函数*/ /**************************************************************************/ void Err_Pro(){float p;cout << endl << "请输入错误概率p = ";cin >> p;for(int x=0;x<n;x++){if((float)((rand() % 1001) * 0.001) < p) // 如果小于概率,则原码0与1互换{err ++;Err_Cbit[x] = (Cbit[x] + 1) % 2;}elseErr_Cbit[x] = Cbit[x]; // 如果大于错误概率,则赋值原码}cout << endl << "输出" << n << "位码字比特流(每位等概出错):" << endl;for(int y=0;y<n;y++)cout << setw(3) << Err_Cbit[y];cout << endl;}/**************************************************************************/ /*函数名:void Hamming_Decode() */ /*功能:汉明译码函数*//**************************************************************************/ void Hamming_Decode(){int i,j,flag=0,d;for(i=0;i<n;i++) // 得到H的转置矩阵HT{for(j=0;j<m;j++){HT[i][j] = H[j][i];}cout << endl << "输出转置奇偶校验矩阵HT为:" << endl;for(i=0;i<n;i++){for(j=0;j<m;j++){cout << setw(3) << HT[i][j] << setw(3);}cout << endl;}for(i=0;i<m;i++) // 计算伴随矩阵{for(j=0;j<n;j++){V[i] += Err_Cbit[j] * HT[j][i];}if(V[i] % 2 == 0) // 将十进制转换二进制V[i] = 0;elseV[i] = 1;}cout << endl << "输出伴随矩阵为:" << endl;for(i=0;i<m;i++)cout << V[i] << setw(2);cout << endl;for(i=0;i<m;i++){if(V[i] == 0) // 如果伴随矩阵为零矩阵,则直接输出原码流{if(i == m-1){cout << endl << "<译码正确!>输出码流为:" << endl;for(j=0;j<n;j++)cout << Err_Cbit[j] << setw(3);cout << endl;}}else{flag ++; // 如果伴随矩阵为非零矩阵,则标志位自加1break;}if(flag != 0){if(err == 1) // 伴随矩阵为非零矩阵时执行{for(i=0;i<n;i++){for(j=0;j<m;j++){if(V[j] == HT[i][j]){if(j == (m-1)) d = i;//d记录行}elsebreak;}}cout << endl << "<译码正确!>输出码流为:"<< endl;Err_Cbit[d] = (Err_Cbit[d] + 1) % 2;for(i=0;i<n;i++)cout << setw(3) << Err_Cbit[i] << setw(3);cout << endl;}elsecout << endl << "由于本次编码有" << err << "个错误位,大于纠错能力" << t << ",故<译码错误!>" << endl;}}六、程序运行结果。
实验三 数据转换实验

实验三数据转换实验一、实验目的掌握数据格式转换程序编写方法。
二、实验原理及实验内容将2字节二进制数转换成3字节压缩BCD数(5位十进制数)。
编写并调试一个二翻十程序,其功能为将40H,50H两单元中的二进制数转换为十进制数,并将转换结果存放在R4,R5,R6单元中。
将二进制转换成十进制的方法有多种,此实验采用左移二进制数,加倍十进制数并加入二进制数的移出位的方法来实现。
具体算法是,先将存放十进制数的3单元清0,再将二进制数左移1位,最高位移入进位。
然后,十进制数存放单元中的BCD数按BCD 数的规则加倍并加入进位。
如此连续移位、加倍、校正,直到所有的二进制数位均移出为止。
下面是程序流程图。
BP1BP2调试方法:⑴断点设在BP1,程序运行至BP1,检查40H、50H内容是否与输入值正确对应。
⑵断点设在BP2,程序运行至BP2,检查R4、R5、R6 内容是否为二进制所对应的十进制转换结果。
⑶程序连续运行,若有错误应改用单步或断点分段调试程序,排除软件错误,直至正确为止。
⑷改动40H、50H中的内容。
连续运行观察结果正确与否。
三、参考程序汇编程序:ORG 0000HAJMP MAINMAIN:MOV 40H,#60H /*将数据送到RAM的40H单元*/MOV 50H,#3CH /*将数据送到RAM的50H单元*/CLR A/*清累加器*/MOV R4,A/*存放转换后数据的寄存器R4,R5,R6*/MOV R5,AMOV R6,AMOV R7,#16BITBCD:CLR C /*C清零*/MOV A,50H /*将50H中的内容左移一位*/RLC AMOV 50H,AMOV A,40H /*将40H中的内容左移一位*/RLC AMOV 40H,AMOV A,R6 /*(R6)+(R6)+(C),和进行二-十进制调整,调整后的BCD码送R6中*/ADDC A,R6DA AMOV R6,AMOV A,R5 /*(R5)+(R5)+(C),和进行二-十进制调整,调整后的BCD码送R5中*/ADDC A,R5DA AMOV R5,AMOV A,R4 /*(R4)+(R4)+(C),和进行二-十进制调整,调整后的BCD码送R4中*/ADDC A,R4DA AMOV R4,ADJNZ R7,BITBCD /*判断循环完没*/END假设2字节二进制数存放在内部RAM0x35和0x36单元中(0x35放高位),转换结果存入0x37~0x39这3个单元中。
实验三 代码转换程序设计

MOV CH,AL;是则更新CH的值
INPUT
JUDGE
CMP AL,CL
JB K;
MOV CL,AL
JMP LOOP1
EXIT:PRESENT 0DH,0AH
MOV AH,09H
MOV DX,SEG STRING
MOV DS,DX
LEA DX,STRING
INT 21H
CMP CH,'0';判断最小数的符号是否为负(通过负数最高位是否被修改判断)
INT 21H
ILLEGAL PROC;显示不合法字符串
MOV AH,09H
MOV DX,SEG STRING1
MOபைடு நூலகம் DS,DX
LEA DX,STRING1
INT 21H
RET
ILLEGAL ENDP
CODE ENDS
END START
七、程序设计思路与总结
程序分为字符输入模块、字符显示模块、判断合法模块、以及主程序的比较模块。
CMP AL,'-';判断数的符号
JZ NEAR PTR NEGT;负数则转去NEGT处执行
JUDGE;判断数的合法性
CMP AL,BH;输入的值与最小正数的十位相比较
JNA NEXT;当前输入的值有可能比得到的最小数小
K: INPUT;把下一个不符合条件的字符读出
JMP NEAR PTR LOOP1
MOV CL,'0';CL中存放负的最小值的十位
MOV AH,09H
MOV DX,SEG STRING3
MOV DS,DX
LEA DX,STRING3
INT 21H
LOOP1: INPUT
试验报告数据转换代码

凝聚力: ^SCd; 内摩擦角: ^SJd;
有效凝聚力: ^SCd';内摩擦角: ^SJd';
八大参数:^SRb,^SRm,^SRk,^SRn,^SRf,^SRC,^SRJ,^SRd,^SRF,^SRG;
注: 以上X,Y分别为纵横比例或尺寸;
三、固结试验参数代码:
报告页号: ^GPn; 报告总页数: ^GMn;
工程编号: ^GSn; 土样编号: ^GTn; 钻孔编号: ^GKn;
试验方法: ^GMd; 试验日期: ^GDt; 仪 器 号: ^GYn;
筛孔直径: ^Ksd[n]; 留筛土重: ^Ksm[n];
吸取直径: ^Kpd[n]; 吸取质量: ^Kpm[n];
比重计编号: ^Khn; 量筒编号: ^Kcn;
比重试验所用试样干土重: ^Khm; 占总土质量百分数: ^Khd;
读数时间: ^Kht[n]; 悬液温度: ^KhT[n]; 比重计读数: ^KhR[n];
内排水与轴向应变关系曲线: ^PC:v-e(XxY);
轴向应变与侧向应变关系曲线: ^PC:e-e3(XxY), ^PC:h-e3(XxY) (变换纵轴);
Ei~σ3关系曲线: ^PC:Ei-s3(XxY);μi~σ3关系曲线: ^PC:ui-s3(XxY);
Bi~σ3关系曲线: ^PC:Bi-s3(XxY);
试后高度: ^sh'; 试后直经: ^sd'; 试后面积: ^sA'; 试后体积: ^sV';
竖向线缩率: ^sel; 竖向收缩系数: ^sCl; 体缩: ^ses;
代码转换实验报告

一、实验背景随着计算机技术的飞速发展,编程语言在各个领域得到了广泛的应用。
然而,不同的编程语言在语法、语义和功能上存在差异,使得程序员在编写程序时需要不断学习和适应新的语言。
为了提高编程效率和减少学习成本,代码转换技术应运而生。
代码转换技术可以将一种编程语言的代码自动或半自动地转换为另一种编程语言的代码,从而实现不同编程语言之间的代码共享和复用。
本实验旨在通过代码转换技术,实现C语言代码向Java语言的转换,并验证转换效果。
二、实验目的1. 熟悉代码转换技术的基本原理和方法。
2. 掌握C语言和Java语言的基本语法和特性。
3. 实现C语言代码向Java语言的转换,并验证转换效果。
4. 分析代码转换过程中可能存在的问题,并提出相应的解决方案。
三、实验内容1. 熟悉C语言和Java语言的基本语法和特性。
2. 分析C语言代码,确定其功能和结构。
3. 根据C语言代码的功能和结构,设计相应的Java代码。
4. 实现C语言代码向Java语言的转换,并进行验证。
四、实验步骤1. 选择一个简单的C语言程序作为实验对象。
2. 分析C语言程序的语法和功能,确定其结构。
3. 根据C语言程序的结构,设计相应的Java代码。
4. 实现C语言代码向Java语言的转换,包括以下步骤:a. 定义Java类和成员变量;b. 实现C语言程序中的函数,转换为Java方法;c. 调整C语言程序中的控制语句,转换为Java的控制语句;d. 转换C语言程序中的输入输出操作,转换为Java的输入输出操作;5. 编译Java代码,运行程序,验证转换效果。
五、实验结果与分析1. 实验结果本实验以一个简单的C语言程序为例,实现了其向Java语言的转换。
以下是C 语言和Java语言的代码对比:C语言代码:```c#include <stdio.h>int main() {int a = 10, b = 20;printf("The sum of a and b is: %d\n", a + b);return 0;}```Java语言代码:```javapublic class Sum {public static void main(String[] args) {int a = 10, b = 20;System.out.println("The sum of a and b is: " + (a + b));}}```2. 实验分析通过对比C语言和Java语言的代码,我们可以发现以下差异:a. 语法差异:C语言使用分号作为语句结束符,而Java使用大括号。
北理工大学计算机实验三 字符编码与信息交换

北理工大学计算机实验三字符编码与信息交换----d6624366-6eab-11ec-b02a-7cb59b590d7d北理工大学计算机实验三字符编码与信息交换实验报告实验名称:学生编号姓名班级实验时间年月日实验报告表3-1西文字符显示过程编码记录表输入字符5a,<ASCII码(十进制数)536560内存信息(二进制)0011010101000000111100显示字体码(十六进制)0FE008000800000008001400000060018实验报告表3-2汉字显示过程代码记录表编码类型汉字输入法汉字输入码机内码(十六进制)国标码(十六进制)区位码(十六进制)字形码(十六进制)输入字符1:“字”全拼输入zid7d6h5756373600080000000600000001c0000000c0000000c0000400800c07fffffe0c00001 c0c0000101c000020380001c01输入字符2:“形状”双输入XD0BEH503E301E0000000000000000000000000002000100000703C1FFF803018300600018300C 001830183018001830100018302000018304000FFC000000038000000700000000000000000000 0000000000000000E7FFFFFFF0000600000000600000000600000000600000000600000000fe000000FC0000001C0000018308040183201E0183701C3FFFFFFFFF8380010060018300C00183 08030003030400030318060303202203000E0630301C060300380403000000E0630300C0080308 01C060300380403000C008030801001C3000FFFFFFFF380010060018300C008030000C000实验报告表3-3不同字体的字体代码“字”的字形码字体(十六进制表示)宋体00080000000600000001c0000000c0000000c0000400800c二“形”的字形码(十六进制表示)0000000000000000000020210000703c1fff80300183006007fffffe0c00001c0c0000101c0000 20380001c001ffffc0000003800000070000000c000000180000006000000060040000600e7fff ffff00006000000060000000600000006000000060000000600000006000000060000000600000 3fe000000fc0000001c000018300c001830180018301000183020001830400018308040183201e 0183701c3ffff83801830060018300c001830180018303000303040003031806030320210303000e0603001c0603003804030060040300c0080303801003060030030c00000030000000c000黑体00080000000600000001c0000000c0000000000000000000000020210000703c三0000c0000400800c07fffffe0c00001c0c0000101c000020380001c001ffffc000000380000007 0000000c000000180000006000000060040000600e7fffffff0000600000006000隶书1FF8030001830060018300C00183018001830100018302000018304000018308040183201E0183 701C3FF83801830060018300C0018301800183030003030400030318060320224。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电工电子实验中心
实验报告
课程名称:计算机硬件技术基础实验名称:代码转换
姓名:学号:
评定成绩:审阅教师:实验时间:2017.05.02
南京航空航天大学
—
一、实验目的要求
1) 掌握 ASCII 码转换的基本方法。
2) 学会 INT21 功能调用, 掌握人机对话的设计方法。
3) 进一歩熟悉 Tddebug 调试环境和 Turbo Debugger 的使用。
二、实验任务
从键盘输入小写字母(最多 20 个),以“.”号作为结束标志, 将其变换成相应的大写字母输岀在屏幕上。
三、实验代码
CRLF MACRO
MOV DL, 0DH
MOV AH, 02H
INT 21H
MOV DL, 0AH ;宏定义回车,换行
MOV AH, 02H
INT 21H
ENDM
DATA SEGMENT
MES1 DB 'PLEASE INPUT THE SMALL LETTER,ENDED WITH ".":$'
MES2 DB 'THE CAPTAL LETTER IS:$'
SMALL DB 50 ;?预留键盘输入缓冲区长度为50个
DB 0 ;?预留实际键盘输入字符数的个数
DB 50 DUP(0)
CAPITAL DB 50 DUP('$') ;?预留大写字母缓冲区长度为50个
DATA ENDS
STACK1 SEGMENT STACK
DB 100 DUP (0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START PROC FAR
PUSH DS
MOV AX, 0
PUSH AX
—
MOV AX, DATA
MOV DS, AX
MOV AH, 9
LEA DX, MES1 ;输岀提示信息MES1
INT 21H
CRLF ;宏调用
MOV AH, 0AH
LEA DX, SMALL;接收小写字符串
INT 21H
CRLF ;宏调用
MOV BX,2
LABEL:
MOV AL, SMALL[BX]
CMP AL,'a'
JL LABEL1
CMP AL,'z'
JG LABEL1
MOV CAPITAL[BX-2], AL
SUB CAPITAL[BX-2], 20H
JMP LABEL2
LABEL1:
MOV CAPITAL[BX-2],AL
LABEL2:
INC BX
CMP SMALL[BX],46
JNE LABEL
KE: MOV AL,'$';大写字符串后加“$”
MOV SMALL[BX], AL
MOV DX, OFFSET MES2 ;?输岀提示信息MES2
MOV AH, 9
INT 21H
CRLF ;宏调用
MOV DX, OFFSET CAPITAL
MOV AH, 9 ;?输岀大写字符串
INT 21H
RET
START ENDP
CODE ENDS
END START
—四、实验数据
五、探究内容
1) 若从键盘输入的字符非小写字母,其 ASCII 码减去 20H 后输出为无关字符,如何在程序中避免以上问题?
在程序中,先做了判断是否非小写字符,如果是就过滤掉该字符,用空格占位六、实验讨论及心得体会
宏定义的使用省去了许多重复的工作,简化了代码的书写,有利于在编程过程中保持清晰的思路。
学会了ASCII 码转换的基本方法。