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

1. 实验名称

有符号整数排序

2. 实验目的

熟悉逻辑指令,移位指令,比较指令与条件判断指令,并灵活运用这些指令。

3. 实验要求

从键盘输入多个有符号整数并进行排序,然后查找用户再次输入的任何一个整数,并以二进制编码输出其在排序结果中的下标。

4. 实验内容

  1. 从键盘接收多个有符号整数
  2. 对输入的多个整数进行排序
  3. 再次接收用户输入的一个整数,并在排序结果中查找;
  4. 以二进制编码输出下标。若未找到,则输出提示。
  5. (可选)更高要求:(涉及到乘法指令) 在第3步输入一个整数时,不使用ReadInt等别人写的过程,而是自己写一个读入有符号整数的过程(此时可以使用readkey读取输入的字符。注意从键盘读入的均是ASCII代码字符)。

提示:
可以先做1、3、4步,最后再加入第2步。

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

1. 实验步骤

查找数据成功
【汇编语言实验三】有符号整数排序 - 图1

查找数据不存在时
【汇编语言实验三】有符号整数排序 - 图2

2. 实验源代码、结果

  1. INCLUDE Irvine32.inc
  2. .data
  3. str1 BYTE "How many integers you want input? ", 0
  4. str2 BYTE "Please input a integer: ", 0
  5. str3 BYTE "The index of the integer is: ", 0
  6. str4 BYTE "The integer you want to seek is: ", 0
  7. str5 BYTE "Cannot find the integer.", 0
  8. IntegerSize DWORD 0
  9. Array DWORD 0FFFFH DUP(?)
  10. .code
  11. main PROC
  12. call InputSize
  13. call InputArray
  14. call SortIntegers
  15. mov edx, offset str4
  16. call WriteString
  17. call ReadInt
  18. call BinSeek
  19. cmp eax, -1
  20. je NotFound
  21. mov edx,offset str3
  22. call WriteString
  23. add eax, 1
  24. call WriteBinB
  25. call Crlf
  26. jmp ProcessExit
  27. NotFound:
  28. mov edx, offset str5
  29. call WriteString
  30. call Crlf
  31. ProcessExit:
  32. exit
  33. main ENDP
  34. InputSize PROC USES edx eax
  35. mov edx, offset str1
  36. call WriteString
  37. call ReadDec
  38. mov IntegerSize, eax
  39. ret
  40. InputSize ENDP
  41. InputArray PROC USES eax ecx esi
  42. mov esi, 0
  43. mov eax, 1
  44. mov ecx, IntegerSize
  45. L1:
  46. mov edx, offset str2
  47. call WriteString
  48. push eax
  49. call ReadInt
  50. mov Array[esi], eax
  51. add esi, TYPE Array
  52. pop eax
  53. loop L1
  54. InputArrayRet:
  55. ret
  56. InputArray ENDP
  57. SortIntegers PROC USES ecx eax esi edi
  58. mov ecx, IntegerSize
  59. dec ecx
  60. L1:
  61. mov esi, ecx
  62. mov eax, esi
  63. call MulTypeArray
  64. mov esi, eax
  65. mov edi, esi
  66. L2:
  67. mov eax, Array[esi]
  68. sub edi, TYPE Array
  69. cmp eax, Array[edi]
  70. jge L2Ret
  71. xchg eax, Array[edi]
  72. mov Array[esi], eax
  73. L2Ret:
  74. cmp edi, 0
  75. jg L2
  76. loop L1
  77. ret
  78. SortIntegers ENDP
  79. MulTypeArray PROC USES edx
  80. sal eax, 2
  81. ret
  82. MulTypeArray ENDP
  83. DivTypeArray PROC USES edx
  84. sar eax, 2
  85. ret
  86. DivTypeArray ENDP
  87. BinSeek PROC USES edx esi edi ecx
  88. mov ecx, eax
  89. mov esi, 0
  90. mov edi, IntegerSize
  91. dec edi
  92. L1:
  93. cmp edi, esi
  94. jb NotFound
  95. mov edx, esi
  96. add edx, edi
  97. sar edx, 1
  98. mov eax, edx
  99. call MulTypeArray
  100. mov edx, eax
  101. cmp ecx, Array[edx]
  102. jl LessDeal
  103. je Found
  104. mov eax, edx
  105. call DivTypeArray
  106. inc eax
  107. mov esi, eax
  108. jmp L1
  109. LessDeal:
  110. mov eax, edx
  111. dec eax
  112. call DivTypeArray
  113. mov edi, eax
  114. jmp L1
  115. Found:
  116. mov eax, edx
  117. call DivTypeArray
  118. jmp BinSeekRet
  119. NotFound:
  120. mov eax, -1
  121. BinSeekRet:
  122. ret
  123. BinSeek ENDP
  124. end main

6. 实验结论和心得体会

  • 通过输入想要输入的数字个数来确定数组的大小,不能像高级语言那种一次性输完;
  • 熟悉了逻辑指令,移位指令,比较指令与条件判断指令,并灵活运用这些指令;
  • 数组的索引以4字节增加;
  • 冒泡排序中要注意保存和恢复外循环计数器;
  • 确定了索引值后以二进制值方式输出,但是作者提供的WriteBinB是输出eax的值,不能从第一个1开始输出,这里下来还需要考虑进行重写。