语言编程实验报告

上传人:第*** 文档编号:61736278 上传时间:2018-12-11 格式:PDF 页数:23 大小:663.99KB
返回 下载 相关 举报
语言编程实验报告_第1页
第1页 / 共23页
语言编程实验报告_第2页
第2页 / 共23页
语言编程实验报告_第3页
第3页 / 共23页
语言编程实验报告_第4页
第4页 / 共23页
语言编程实验报告_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《语言编程实验报告》由会员分享,可在线阅读,更多相关《语言编程实验报告(23页珍藏版)》请在金锄头文库上搜索。

1、汇编语言编程 实验报告 学号:学号: 姓名:姓名: 成绩:成绩: - 2 - 目录 一、实验一:错误!未定义书签。错误!未定义书签。 二、实验二:.4 三、实验三:.8 四、实验四:.10 五、实验五:错误!未定义书签。错误!未定义书签。 六、实验六:.19 七、汇编实验总结.23 - 3 - 实验一实验一 一一实验题目实验题目 【汇编语言补充作业 T20】编写完整程序,利用 DOS 系统功能调用,从键盘输入 一个字符串,并将该字符串从屏幕上换行后并输出。 二二程序流程及思路程序流程及思路 实现字符串输入,需要分成三个步骤: 1、在数据段中定义一个缓存区为存放字符串做准备; 2、DOS 系统功

2、能调用 0AH 号子功能, (DS:DX)= 输入缓冲区首址; 3、在输入的字符串尾加上$字符,以作为输出结束条件。 实现字符串输出,则需要注意的问题是: 1、缓冲区第三个字节才开始存放输入的字符,前两个字节分别存放缓冲区长度 和字符串实际字符数; 2、输出回车换行可利用字符串:CR DB 0AH,0DH,$。 三三源程序清单源程序清单 DATASEGMENT NEQU50 MAXLEN DB N;缓冲区字符的最大长度 ACTLEN DB ?;实际字符个数 STRING DB N DUP(?);字符空间 CR DB 0AH,0DH,$ DATA ENDS CODESEGMENT ASSUME

3、CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX LEA DX,MAXLEN MOV AH,0AH INT 21H;字符串输入 MOV AH,09H LEA DX,CR INT 21H;回车换行 MOV BL,MAXLEN+1;取实际的字符长度 MOV BH,0 LEA SI,MAXLEN+2;取字符开始的首地址 - 4 - MOV BYTE PTR SI+BX,$;输出结尾要加上$ MOV DX,SI;把开始存放字符的首地址赋给 DX MOV AH,09H INT 21H MOV AH,4CH INT 21H CODE ENDS END

4、 START 四四结果拷屏结果拷屏 实验二实验二 一一. . 实验题目实验题目 【汇编语言补充作业 T23】假设 CX:BX 中存放了 4 为非压缩的 BCD 码表示的十进 制数 4386,请编写完整程序将这个数转化成 2 进制数并存放到 DI 寄存器中。 二二. . 程序流程及思路程序流程及思路 首先,要解决以上问题需分三个步骤进行: 1、将 CX:BX 中的非压缩 BCD 码调整成压缩 BCD 码。这有两种方法: - 5 - a、利用非压缩 BCD 码调整指令 AAD,达到以上目的; b、利用移位指令,将两个非压缩 BCD 码进行整合,达到以上目的; (注:以下程序采用 b 方法) 2、将

5、调整后的压缩 BCD 码转化为十进制数。调整后 b3b2=43,b1b0=86。转化方 法为 b3b2*100+b1b0 DI。计算结果送入 DI 寄存器中。 由于 100=64+32+4,因此考虑用移位指令进行 BCD 码的乘法运算。 3、利用移位指令编写一段代码进行结果输出,以便于在屏幕上直接进行核对检 验。 三源程序清单三源程序清单 DATASEGMENT DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK start:mov ch,04 mov cl,03 mov bh,08 mov bl,06; mov al,ch mov ah,0

6、 shl ax,1;ch 位乘 10(10=8+2) mov si,ax shl ax,1 shl ax,1 add ax,si ; mov ch,0 add ax,cx mov dx,ax;dx=43 shl dx,1 shl dx,1 mov ax,dx shl dx,1 shl dx,1 shl dx,1 add ax,dx shl dx,1; - 6 - add dx,ax;dx 乘以 100(100=64+32+4) mov al,bh mov ah,0 mov si,0 shl ax,1;bh 位乘 10 mov si,ax shl ax,1 shl ax,1 add ax,si;

7、 mov bh,0 add ax,bx add dx,ax mov di,dx show: mov cl,4;该段进行结果输出检验 mov bx,dx shr bh,cl mov dl,bh add dl,30h mov ah,2 int 21h;1 位 mov bh,dh and bh,0Fh mov dl,bh add dl,30h mov ah,2 int 21h;2 位 mov dh,bl shr dh,cl mov dl,dh add dl,30h mov ah,2 int 21h;3 位 mov dh,bl and dh,0Fh mov dl,dh add dl,30h mov a

8、h,2 int 21h;4 位 mov ah,4ch int 21h - 7 - code ends end start 五五结果拷屏结果拷屏 输出结果为 1122十六进制,将题目中 4386 换成 4096,输出如下,为 1000十 六进制: - 8 - 实验三实验三 一实验题目一实验题目 【汇编语言补充作业 T22】已知有以下数据段定义: NUM DW 3570 STRING DB 5 DUP(20H),$;20H 为空格的 ASCII 码 请编写完整程序,在屏幕上以十进制的形式将 NUM 这个数打印出来,可以借助 STRING 这个字符串。 (NUM 这个数可以定义为一个任意字型数) 二

9、程序流程及思路二程序流程及思路 考虑到 NUM 在寄存器中以十六进制数的形式进行存放, 转化成十进制数可能最大 值为 65535,则输出刚好输出的十进制数位数为 5 位。 因此,需要除以 10000d,1000d,100d,10d,1d 来分别取出该数各位数值,并 在屏幕上连续打印。其过程为: 1、将 NUM 先存入寄存器 SI 中,除数为 10000d; 2、除法完成后,商直接输出,余数保留并且存入 SI 中; 3、依次将除数换成 1000d,100d,10d,1d,重复 2 操作,直到程序结束。 另外, 程序打印每一位所执行的动作需要重复五次,因此将该过程写成一个子程 序(chufa)进行

10、调用,可以简化代码,使得程序可读性更强,程序健壮性更好。 三源程序清单三源程序清单 DATASEGMENT NUM DW 3570 DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK start:MOV AX,DATA MOV DS,AX mov si,num mov cx,10000d call chufa mov cx,1000d call chufa mov cx,100d - 9 - call chufa mov cx,10d call chufa mov cx,1d call chufa mov ah,4Ch int 21h chu

11、fa:mov ax,si;si 存储的是要输出的十进制数据 mov dx,0 div cx mov si,dx;余数赋给 si 寄存器,为下一步出发做准备 mov dl,al add dl,30h mov ah,2 int 21h;除法的商直接输出 ret code ends end start 四结果拷屏四结果拷屏 以上为 NUM=3570d 时程序输出结果为 03570,若将 NUM 改为 1122H,则输出如下, 结果为 04386: - 10 - 实验四实验四 一实验题目一实验题目 【汇编语言补充作业 T13】请编写完整程序在一个升序字节数组中查找数 N,找 到后将此数从数组中删除,并

12、使得 CF=0;没找到返回 CF=1。数组的首地址和末 地址为 A_HEAD 和 A_END。 二程序流程及思路二程序流程及思路 删除升序数组中的一个数 N 的关键步骤是将这个数搜索出来。若搜索到,则进行 删除,然后对整个数组进行调整;若未搜索到,则无操作动作。其中进行搜索的 方法为逐个比较。 程序流程图如下: - 11 - 开始 初始化数组 ARRAY_HEAD, ARRAY_END,目标数 N BXARRAY_HEAD, BX=ARRAY_END BX=N DELETE:CF0,ARRAY_ENDARRAY_END-1,调整 EXIT:CF1 BXBX+1 结束 Y Y N N 三源程序清

13、单三源程序清单 DATA SEGMENT ARRAY DB 1,2,3,4,5,6,7,8,9,0 LENG EQU $-ARRAY ARRAY_END DW ? ARRAY_HEAD DW ? NUM DB 5 DATA ENDS STACK SEGMENT STACK STACK ENDS CODE SEGMENT - 12 - ASSUME DS:DATA,CS:CODE,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AL,LENG CBW MOV BX,OFFSET ARRAY MOV ARRAY_HEAD,BX ADD AX,BX MOV DI,

14、AX DEC DI MOV ARRAY_END,DI MOV AX,0 MOV AL,NUM L1:MOV DL,0 MOV DL,BX CMP DL,AL;当前数与 NUM 进行比较 JNE L2;不相等跳转至 L2 JMP DELETE;相等跳转至 DELETE L2:INC BX CMP BX,ARRAY_END JBE L1;指针+1,并循环 STC JMP EXIT DELETE:MOV DI,ARRAY_END SUB DI,BX MOV CX,DI DEL:MOV DX,BX+1;将 BX 之后的数依次前移一位 MOV BX,DX INC BX LOOP DEL DEC ARRA

15、Y_END;删除后 ARRAY_END 前移 CLC JMP EXIT EXIT:MOV CX,0 MOV CX,ARRAY_END MOV AX,OFFSET ARRAY SUB CX,AX INC CX MOV BX,0 - 13 - SHOW:MOV DL,ARRAY+BX;将删除后数组元素打印以检验 ADD DL,30H MOV AH,2 INT 21H INC BX LOOP SHOW MOV AH,4CH INT 21H CODE ENDS END START 四结果拷屏四结果拷屏 以上输出为在 1、2、3、4、5、6、7、8、9、0 数组中删去 N=5 的结果 调用 debug-

16、t 命令可以查看 CF 标志位状态: - 14 - 可见,CF 位为 0,若当 N=10,在数组里未找到目标数,则结果为: 可见数组元素不变,且 CF=1 实验五实验五 一实验题目一实验题目 【汇编语言补充作业 T14】请编写完整程序从键盘读取字符,如果是十进制的 0 9,则在屏幕上输出该数的八位二进制码,并将数字依次存放到 BUF 开头的数 组中;如果读取的字符是Q或者q ,则程序退出;其他情况在屏幕上打印 “You must input 0-9 or q or Q” 。 (如输入的字符是9 ,则输出 00001001) 提示: 输出一个数的 2 进制形式应该从最高位开始输出,可以将此段程序定义为 一个过程。 - 15 - 二程序流程及思路二程序流程及思路 总体流程: 1、 利用 DOS 系统功能调用 21H 的 01 号子功能读取键盘输入的一个字符 x, 换行, 然后将 x 与 0、9 的 ASCII 码进行比较,若在 09 范围

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号