汇编语言系列文章仅作为实验报告和汇编学习参考,不作为任何技术文章,还望大佬们勿喷。

1. 实验名称

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

2. 实验目的

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

3. 实验要求

从键盘接收一个字符串,然后将字符串中的大写字母转为小写字母,最后将转换以后的结果输出。
要求:

  1. 将字符串中的大写字母转为小写字母实现为一个过程(procedure),且通过栈来传递参数,一个参数为字符串首地址,一个参数为字符串长度。该过程(procedure)不要求字符串以0结尾。注意:传递参数不能使用MASM简化编程的版本(因为它会简化参数的使用),即不能使用下面的格式的方法:

name_Func PROC,
参数1名: 参数1类型,
参数2名: 参数2类型

  1. 程序中要求用到串操作指令。
  2. 字符串可以为任意的ASCII码可显示字符。如‘0’,逗号’,’,‘!’等。均要求能正确处理。

4. 实验内容

  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参数(本次实验不允许使用这种方法来使用参数)。

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

1. 实验步骤

运行结果:
【汇编语言实验四】串处理与通过栈传参数的使用 - 图1

2. 实验源代码、结果

  1. INCLUDE Irvine32.inc
  2. .data
  3. str1 BYTE "Please input string: ", 0
  4. str2 BYTE "The end of string is: ", 0
  5. buffer BYTE 21 DUP(0)
  6. byteCount DWORD ?
  7. .code
  8. main PROC
  9. call InputString
  10. push OFFSET buffer
  11. push byteCount
  12. call UpperToLower
  13. mov edx, OFFSET str2
  14. call WriteString
  15. mov edx, OFFSET buffer
  16. call WriteString
  17. call Crlf
  18. exit
  19. main ENDP
  20. InputString PROC USES eax edx ecx
  21. mov edx, OFFSET str1
  22. call WriteString
  23. mov edx, OFFSET buffer
  24. mov ecx, SIZEOF buffer
  25. call ReadString
  26. mov byteCount, eax
  27. ret
  28. InputString ENDP
  29. UpperToLower PROC
  30. push ebp
  31. mov ebp, esp
  32. cld
  33. mov ecx, [ebp+8]
  34. mov esi, [ebp+12]
  35. mov edi, [ebp+12]
  36. L1:
  37. lodsb
  38. cmp al, 'A'
  39. jl RetProc
  40. cmp al, 'Z'
  41. jg RetProc
  42. or al, 20h
  43. RetProc:
  44. stosb
  45. loop L1
  46. pop ebp
  47. ret 8
  48. UpperToLower ENDP
  49. END main

6. 实验结论和心得体会

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