【汇编语言实验四】串处理与通过栈传参数的使用

本文介绍了一个关于串处理和栈传参数的实验,旨在掌握串处理指令在数组中的运用,具体包括从键盘接收字符串,将大写字母转换为小写字母并输出结果。实验涉及汇编语言编程,使用了串操作指令和通过栈传递参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 实验名称

串处理与通过栈传参数的使用

2. 实验目的

掌握串处理指令在数组中的运用。

2. 实验要求

从键盘接收一个字符串,然后将字符串中的大写字母转为小写字母,最后将转换以后的结果输出。
要求:
1) 将字符串中的大写字母转为小写字母实现为一个过程(procedure),且通过栈来传递参数,一个参数为字符串首地址,一个参数为字符串长度。该过程(procedure)不要求字符串以0结尾。注意:传递参数不能使用MASM简化编程的版本(因为它会简化参数的使用),即不能使用下面的格式的方法:
name_Func PROC,
参数1名: 参数1类型,
参数2名: 参数2类型
2) 程序中要求用到串操作指令。
3) 字符串可以为任意的ASCII码可显示字符。如‘0’,逗号’,’,‘!’等。均要求能正确处理。

3. 实验内容

  1. 从键盘接收一个字符串。 (提示:可以使用irvine32库中的过程ReadString。该过程除了读入字符串以外,还会返回读入的字节数,最后还会在字符串末尾插入一个空字符(0,也即’\0’)。更为详细的说明请参见教材相关章节);
  2. 将接收到的字符串输出。该输出为转换之前的结果,可以测试是否正确输入了字符串。
  3. 编写将字符串中的大写字母转为小写字母的过程。注意通过栈来传递参数的处理。
  4. 将转换后的结果输出。该输出为转换之后的结果,可以测试整个程序的功能是否正确。

对整个程序的提示:
1) 请依次完成1)、2)、3)、4),每一步完成了且测试正确了才进行下一步。特别是对于编程基础一般或不太好的同学。前2步可以确定程序的输入功能是否正确,后2步可以确定整个程序的功能是否正确。在实现难度上,第3步较其它几个要难不少。
2) 第3步的过程可以参考教材第287页(第五版教材为第261页),但该过程与我们的要求稍有不同(如它未使用串操作指令、它要求字符串以0结尾等),主要功能类似。注意:教材上的代码 pString: PTR BYTE使用了proc参数(本次实验不允许使用这种方法来使用参数)。

4. 实验步骤或源代码、结果

1. 实验步骤

运行结果:

1

2. 实验源代码、结果

INCLUDE Irvine32.inc

.data
str1 BYTE "Please input string: ", 0
str2 BYTE "The end of string is: ", 0
buffer BYTE 21 DUP(0)
byteCount DWORD ?

.code

main PROC
	call InputString
	push OFFSET buffer
	push byteCount
	call UpperToLower
	mov edx, OFFSET str2
	call WriteString
	mov edx, OFFSET buffer
	call WriteString
	call Crlf
	exit
main ENDP

InputString PROC USES eax edx ecx
	mov edx, OFFSET str1
	call WriteString
	mov edx, OFFSET buffer
	mov ecx, SIZEOF buffer
	call ReadString
	mov byteCount, eax	
	ret
InputString ENDP

UpperToLower PROC
	push ebp
	mov ebp, esp
	cld
	mov ecx, [ebp+8]
	mov esi, [ebp+12]
	mov edi, [ebp+12]
L1:
	lodsb
	cmp al, 'A'
	jl RetProc
	cmp al, 'Z'
	jg RetProc
	or al, 20h
RetProc:
	stosb
	loop L1
	pop ebp
	ret 8
UpperToLower ENDP

END main

5. 实验结论和心得体会

  • 学会了串处理的几个函数;
  • 学会了通过栈来传递参数,而不是简化传参;
  • 在编程中我遇到了运行时程序崩溃,后面发现是调用UpperToLower函数时保护eax edx ecx将它们也压栈了,从而导致了栈不只是我输入的数据,使得错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值