汇编实验-输入自己的名字后输出


实验环境

  • Intel 8086 CPU的汇编语言
  • Masm611 和 debug 调试器
  • DOSBox0.74 免费开源跨平台 MS-DOS 模拟器

题目

  • 在屏幕上显示”What is your name?”,输入自己姓名后显示”My name is XXXX”。

第一版实验

实验结果

在这里插入图片描述

存在的问题

  • 问题:实验结果有一点小瑕疵,最后输出的结果:My name is (这里会有一个乱码的字符)XXXXX,大家可以拿去源码运行,发现了问题在哪里,麻烦评论或者私信告诉我哦,感谢!!!
  • 原因:
    • 由于输入字符串的时候当前首地址用来存放该字符串可以存放的最大字符数,第二个位置用来存放当前实际存放的字符数,读取数据的时候会修改第二个位置的数值,然后第三个位置才开始读取字符串
    • 所以真实姓名前多了一个非法的字符是实际字符数对应的 ASCII 对应的字符。
    • 这里还有一个问题是,这里最多只能输入 32 个字符。
      • 因为当前的首地址存储的是 一个 空格(ASCII码为32),将这个值作为了最大能够输入的字符数。
        在这里插入图片描述
  • 解决办法:将 “My name is ” 单独用一个字符串存放,读取的数据再单独用一个字符串来存放,见版本二。

源代码

;exp7_4.txt(文件名,分号后面就是注释)
	.model small
	.stack
	.data	;定义数据段
		string DB 'What is your name ?',0DH, 0AH, '$'  ;字符串应当以 $ 符号结束,0DH, 0AH, 回车换行的作用
		buffer DB 255, 14, 0DH, 0AH, 'My name is '  ;  ;第一个字符存储该字符最多存储的字符数,第二个位置表示当前存储的字符个数
		       DB 200 DUP('$')  ;确保字符串是以 $ 符号结尾的
	.code
		.startup	;程序起始点,建立DS、SS
			;设置欲显示字符串在主存中的首地址
			mov DX, seg string  ;获取段地址,因为mov指令不能直接将立即数送到段寄存器中,所以使用中间寄存器
			mov DS, DX
			mov DX, offset string  ;获取偏移地址
			mov AH, 09H   ;输出一个以DS:DX首地址开始,以$结尾的字符串
			INT 21H
			
			;读取一个字符串
			mov DX, seg buffer 
			mov DS, DX
			mov DX, offset buffer  ;获取偏移地址
			mov BX, DX   ;因为寄存器相对寻址方式的基地址只能是 BX/BP
			MOV AL, [BX + 1]  ;获取到当前字符串实际已经存储的字符数,由于只占一个字节,所以使用AL
			mov AH, 0H   ;后面的 ADD DX, AX要求位数相匹配,不能直接和AL相加,所以将AH设置为0防止影响结果
			ADD DX, AX   ;获取已有字符串的末尾继续增加字符
			mov AH, 0AH   
			INT 21H

			;输出一个字符串
			mov DX, offset buffer
			ADD DX, 2
			mov AH, 09H   ;输出一个以DS:DX首地址开始,以$结尾的字符串
			INT 21H
		.exit 0
	end

第二版实验

实验结果

在这里插入图片描述

源代码

;exp7_4.txt(文件名,分号后面就是注释)
	.model small
	.stack
	.data	;定义数据段
		string DB 'What is your name ?',0DH, 0AH, '$'  ;字符串应当以 $ 符号结束,0DH, 0AH, 回车换行的作用
		buffer DB 'My name is ', '$'  ;确保字符串是以 $ 符号结尾的
		input_str  DB 255, 0
			   DB 253 DUP ('$')
	.code
		.startup	;程序起始点,建立DS、SS
			;设置欲显示字符串在主存中的首地址
			mov DX, seg string  ;获取段地址,因为mov指令不能直接将立即数送到段寄存器中,所以使用中间寄存器
			mov DS, DX
			mov DX, offset string  ;获取偏移地址
			mov AH, 09H   ;输出一个以DS:DX首地址开始,以$结尾的字符串
			INT 21H
			
			;读取一个字符串
			mov DX, seg input_str 
			mov DS, DX
			mov DX, offset input_str  ;获取偏移地址
			mov BX, DX   ;因为寄存器相对寻址方式的基地址只能是 BX/BP
			MOV AL, [BX + 1]  ;获取到当前字符串实际已经存储的字符数,由于只占一个字节,所以使用AL
			mov AH, 0H   ;后面的 ADD DX, AX要求位数相匹配,不能直接和AL相加,所以将AH设置为0防止影响结果
			ADD DX, AX   ;获取已有字符串的末尾继续增加字符
			mov AH, 0AH   
			INT 21H

			;输出一个字符串
			mov AH, 09H   ;输出一个以DS:DX首地址开始,以$结尾的字符串
			mov DX, offset buffer
			INT 21H
			LEA DX, input_str+2 
			INT 21H
		.exit 0
	end

总结

  • 实验的关键要点都在源代码中的注释中,里面有很多的细节,大家可以阅读源代码。
  • 输入字符串的时候第一个位置用来存储最大的字符数,第二个位置用来存储实际存储的字符数,第三个位置才开始读取输入的字符串, 并且会根据实际输入的字符数来修改第二个位置的值。
  • 最大字符数是自己事先设置好了的,在输入字符的时候会判断是否超过了允许输入的最大字符数。
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
微机原理与汇编语言-实验报告(中北大学大数据学院)(前4个实验都可以直接运行,后面的几个需要用到proteus,这个要自己根据自己的情况搞,咱就不能保证在你电脑上能不能运行了) 实验一 简单程序设计 1. 编制一个简单的运算程序,并且调试完成。 2. 编制一个计算x=a2+b2 3. 验证上述结果的正确 实验二 循环、分支程序设计 1. 编制一个统计数组中正负数个数及均值的程序,并且调试完成得到正确的结果。 2. 设计计算Y=1+2+3+....,直到累加和刚好大于10000的程序并且调试完成。 3. 对给定数组中的所有元素,按从大到小的顺序排序,并且加以验证。 实验三 系统功能调用实验 1.编制一个具有屏幕提示和键盘输入的程序,键盘输入一个人名,在屏幕上显示“Hello 人名!”; 2.通过键盘输入一串包含大小写字母和数字的字符串,统计其中大写、小写字母和数字字符的个数,并将结果显示在屏幕上。 实验四 8255并行接口实验 1.将8255一个端口接8个发光二极管,用不同工作方式控制其逐次点亮发光二极管。 2.将8255另一个端口接开关,用不同工作方式,编程将开关信息在发光二极管上显示出来。 3.验证上述操作的正确性,对实验结果进行解释 实验五 键盘、LED实验 1.在实验箱上,连接小键盘和LED显示器。 2.编程将键盘输入的数字,显示在显示器上,在按键时,原来显示的数字左移一位,新按的键值显示在最右端。 3.考虑两个键组合时的输入方法 4.对实验结果进行说明 实验六 中断实验 1.连接实验箱上的数码管,通过消抖开关作为中断源。 2.编写程序,完成在中断服务程序中记录中断次数,在主程序中显示按键次数。 3.将消抖开关换成一般开关,用同样的程序,再测试,仔细观察,发现了什么,为什么? 实验七 定时/计数器实验 1.使用计数器对消抖开关的按动次数进行计数,显示当前的计数值。 2.对实验箱中系统时钟进行计数,改变计数初值(两个初值要相差很大),观察有什么不同。 3.8253的初值用0和1,观察结果,并加以分析。 4.分析实验结果,并对实验结果进行说明。 实验八 综合实验 1.将实验箱设计成一个电子表,该表能分时(或按键切换)显示年月日、时分秒; 2.设置按键,通过按键可以修正日期和时间,在修正日期、时间时,电子表仍然可以继续工作。 3.AD实验,用显示器显示当前AD的输入电压值,要求精确到小数点后2位数(选做)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小宝945

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值