汇编语言:输入10个数排序并输出
<svg xmlns="http://www.w3.org/2000/svg" style="display: none"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path>
</svg>
<p></p><div class="toc"><h3>文章目录</h3><ul><li>一:题目描述</li><li>二:伪指令的定义</li><ul><li>1.数据段</li><li>2.堆栈段</li><li>3.代码段</li></ul><li>三:模块分解与实现</li><ul><li>1. DOS输入10个数字</li><ul><li>1.1 输入函数子程序</li></ul><li>2.实现冒泡排序</li><li>3.DOS输出到屏幕</li><li>4.求累加和</li><li>5.其他函数</li></ul><li>四:流程图</li><ul><li>1. 总体流程图</li><li>2. 子程序流程图</li><ul><li>2.1 Input</li><li>2.2 Print</li><li>2.3 Bubble_Sort</li><li>2.4 Get_Sum</li></ul></ul><li>五:代码与运行截图</li><ul><li>1,完整版代码(在MASM运行通过)</li><li>2. 正确运行时截图</li><li>3. 错误输入时截图</li></ul></ul></div><p></p>
<h1>一:题目描述</h1>
<blockquote>
<p><strong>在键盘输入任意10个数</strong></p>
<ol>
<li><strong>按从小到大排序后,在计算机屏幕上先输出来。要有结果提示(字符串显示)。</strong></li>
<li><strong>将10个数做累加,结果在计算机屏幕显示累加和。</strong></li>
</ol>
</blockquote>
<h1>二:伪指令的定义</h1>
<h2>1.数据段</h2>
<pre><code class="prism language-c">DATAS SEGMENT
string_1 DB <span class="token string">'Please input a numbers(0-65536):'</span><span class="token punctuation">,</span><span class="token string">'$'</span>
string_2 DB <span class="token string">'ERROR: OVERFLOW! Please input again:'</span><span class="token punctuation">,</span><span class="token string">'$'</span>
string_3 DB <span class="token string">'The array you have input is:'</span><span class="token punctuation">,</span><span class="token number">0</span>ah<span class="token punctuation">,</span><span class="token number">0</span>dh<span class="token punctuation">,</span><span class="token string">'$'</span>
string_4 DB <span class="token string">'After Sort the num is:'</span><span class="token punctuation">,</span><span class="token number">0</span>ah<span class="token punctuation">,</span><span class="token number">0</span>dh<span class="token punctuation">,</span><span class="token string">'$'</span>
string_5 DB <span class="token string">' '</span><span class="token punctuation">,</span><span class="token string">'$'</span>
DATADW <span class="token number">10</span> <span class="token function">DUP</span><span class="token punctuation">(</span><span class="token operator">?</span><span class="token punctuation">)</span>
massegeDB <span class="token string">'The sum of the array is: '</span><span class="token punctuation">,</span><span class="token number">0</span>ah<span class="token punctuation">,</span><span class="token number">0</span>DH<span class="token punctuation">,</span><span class="token string">'$'</span>
DATAS ENDS
</code></pre>
<p><strong>说明</strong>:</p>
<table>
<thead>
<tr>
<th align="center">string_1</th>
<th align="center">输入范围提示</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"><strong>string_2</strong></td>
<td align="center"><strong>输入错误提示</strong></td>
</tr>
<tr>
<td align="center"><strong>string_3</strong></td>
<td align="center"><strong>输出原数组提示</strong></td>
</tr>
<tr>
<td align="center"><strong>string_4</strong></td>
<td align="center"><strong>输出排序后数组提示</strong></td>
</tr>
<tr>
<td align="center"><strong>string_5</strong></td>
<td align="center"><strong>空格符</strong></td>
</tr>
<tr>
<td align="center"><strong>DATA</strong></td>
<td align="center"><strong>缓冲区数组</strong></td>
</tr>
</tbody>
</table><h2>2.堆栈段</h2>
<pre><code class="prism language-c">STACKS SEGMENT
DW <span class="token number">256</span> <span class="token function">dup</span><span class="token punctuation">(</span><span class="token operator">?</span><span class="token punctuation">)</span>
STACKS ENDS
</code></pre>
<h2>3.代码段</h2>
<pre><code class="prism language-c">CODES SEGMENT
ASSUME CS<span class="token punctuation">:</span>CODES<span class="token punctuation">,</span>DS<span class="token punctuation">:</span>DATAS<span class="token punctuation">,</span>SS<span class="token punctuation">:</span>STACKS
</code></pre>
<h1>三:模块分解与实现</h1>
<h2>1. DOS输入10个数字</h2>
<ul>
<li>输入10个无符号数存入缓冲区,并且保证 <span class="katex--inline"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mi>u</mi><mi>m</mi><mo>&lt;</mo><mn>65536</mn></mrow>num &lt; 65536</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height: 0.5782em; vertical-align: -0.0391em"></span><span class="mord mathit">n</span><span class="mord mathit">u</span><span class="mord mathit">m</span><span class="mspace" style="margin-right: 0.277778em"></span><span class="mrel"><</span><span class="mspace" style="margin-right: 0.277778em"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0"></span><span class="mord">6</span><span class="mord">5</span><span class="mord">5</span><span class="mord">3</span><span class="mord">6</span></span></span></span></span></li>
</ul>
<p>为何输入范围是65536呢 一个字的最大表示范围是 <span class="katex--inline"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mi>F</mi><mi>F</mi><mi>F</mi></mrow>FFFF</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height: 0.68333em; vertical-align: 0"></span><span class="mord mathit" style="margin-right: 0.13889em">F</span><span class="mord mathit" style="margin-right: 0.13889em">F</span><span class="mord mathit" style="margin-right: 0.13889em">F</span><span class="mord mathit" style="margin-right: 0.13889em">F</span></span></span></span></span> 其在十进制的表示下为 65535</p>
<table>
<thead>
<tr>
<th align="center">HEX</th>
<th align="center">FFFF</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">DEC</td>
<td align="center">65535</td>
</tr>
<tr>
<td align="center">BIN</td>
<td align="center">1111 1111 1111 1111</td>
</tr>
</tbody>
</table><h3>1.1 输入函数子程序</h3>
<pre><code class="prism language-c"><span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>输入函数(单数字输入)<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
Input PROC Near
push AX
push BX
push CX
push DX
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>输入提示<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
MOV BX<span class="token punctuation">,</span> <span class="token number">0</span>
CLC
MOV DX<span class="token punctuation">,</span> <span class="token number">0</span>
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>输入数字<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
Lp_0<span class="token punctuation">:</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">1</span>
INT <span class="token number">21</span>H
CMP AL<span class="token punctuation">,</span> <span class="token number">20</span>H <span class="token punctuation">;</span>回车
JE L_CRLF
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span> x belong to <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">9</span><span class="token punctuation">]</span> <span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
SUB AL<span class="token punctuation">,</span> <span class="token number">30</span>H <span class="token punctuation">;</span> ASCII <span class="token operator">-></span> <span class="token keyword">int</span>
JL L_ERROR
CMP AL<span class="token punctuation">,</span> <span class="token number">9</span>
JG L_ERROR
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>string <span class="token operator">-></span> <span class="token keyword">int</span> <span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">;</span>将 AL扩展成 AX
XCHG AX<span class="token punctuation">,</span> BX <span class="token punctuation">;</span>保护 AX值
MOV CX<span class="token punctuation">,</span> <span class="token number">10</span>
MUL CX <span class="token punctuation">;</span> bx <span class="token operator">*</span><span class="token operator">=</span> <span class="token number">10</span>
ADD AX <span class="token punctuation">,</span> BX
JC L_ERROR<span class="token punctuation">;</span> OVERFLOW处理
XCHG AX<span class="token punctuation">,</span> BX
JMP Lp_0
L_ERROR<span class="token punctuation">:</span>
MOV DX<span class="token punctuation">,</span> <span class="token number">0</span>
MOV BX<span class="token punctuation">,</span> <span class="token number">0</span>
CALL CRLF <span class="token punctuation">;</span> 换行
CALL ERROR<span class="token punctuation">;</span> 输出错误提示
JMP Lp_0
L_CRLF<span class="token punctuation">:</span> <span class="token punctuation">;</span> 以换行作为一个数的结束标志
MOV DX<span class="token punctuation">,</span> <span class="token number">0</span>
MOV DATA<span class="token punctuation">[</span>SI<span class="token punctuation">]</span><span class="token punctuation">,</span> BX <span class="token punctuation">;</span>
POP DX
POP CX
POP BX
POP AX
RET
Input ENDP
</code></pre>
<p>解析函数功能:</p>
<ol>
<li>
<p>本质类似于高精度计算,将读入的一个串转成数字存储在DATA数组中</p>
</li>
<li>
<p>分成三大部分</p>
<p>一: 输入提示</p>
<p>二: 错误判断及提示</p>
<p>三: 转化为数字</p>
</li>
<li>
<p>L_ERROR 错误处理</p>
</li>
<li>
<p>L_CRLF 结束处理</p>
</li>
</ol>
<blockquote>
<p>我们来举一个<span class="katex--inline"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1234</mn></mrow>1234</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0"></span><span class="mord">1</span><span class="mord">2</span><span class="mord">3</span><span class="mord">4</span></span></span></span></span> 的例子</p>
<table>
<thead>
<tr>
<th align="center">Register</th>
<th align="center">1</th>
<th align="center">2</th>
<th align="center">3</th>
<th align="center">4</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"><strong>AX</strong></td>
<td align="center"><strong>1</strong></td>
<td align="center">2</td>
<td align="center">3</td>
<td align="center">4</td>
</tr>
<tr>
<td align="center"><strong>BX</strong></td>
<td align="center">0</td>
<td align="center">1</td>
<td align="center">12</td>
<td align="center">123</td>
</tr>
<tr>
<td align="center"><strong>CX</strong></td>
<td align="center">10</td>
<td align="center">10</td>
<td align="center">10</td>
<td align="center">10</td>
</tr>
</tbody>
</table><p><span class="katex--inline"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mi>X</mi><mo>+</mo><mo>(</mo><mi>B</mi><mi>X</mi><mo>∗</mo><mi>C</mi><mi>X</mi><mo>)</mo></mrow>AX + (BX * CX)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height: 0.76666em; vertical-align: -0.08333em"></span><span class="mord mathit">A</span><span class="mord mathit" style="margin-right: 0.07847em">X</span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mopen">(</span><span class="mord mathit" style="margin-right: 0.05017em">B</span><span class="mord mathit" style="margin-right: 0.07847em">X</span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mord mathit" style="margin-right: 0.07153em">C</span><span class="mord mathit" style="margin-right: 0.07847em">X</span><span class="mclose">)</span></span></span></span></span></p>
</blockquote>
<p>最后将结果存储在DATA数组里</p>
<h2>2.实现冒泡排序</h2>
<p>冒泡排序作为一个简单的排序算法,时间复杂度 <span class="katex--inline"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo>(</mo><msup><mi>n</mi><mn>2</mn></msup><mo>)</mo></mrow>O(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height: 1.06411em; vertical-align: -0.25em"></span><span class="mord mathit" style="margin-right: 0.02778em">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathit">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em"><span class="" style="top: -3.063em; margin-right: 0.05em"><span class="pstrut" style="height: 2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span> 需要两层循环,为了提高代码的可读性,我们将内层的循环写成一个子程序每次调用</p>
<p>内层循环很简单,每次从头比到尾,遇到比它小的交换就可以了。因为是字操作数,所以循环的下标到18为结束条件。</p>
<pre><code class="prism language-c"><span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>Bubble_sort<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
Bubble_sort PROC NEAR
PUSH BX
PUSH DX
MOVSI<span class="token punctuation">,</span>DI
LOOP1<span class="token punctuation">:</span>
ADDSI<span class="token punctuation">,</span><span class="token number">2</span>
MOVBX<span class="token punctuation">,</span>DATA<span class="token punctuation">[</span>DI<span class="token punctuation">]</span>
CMPBX<span class="token punctuation">,</span>DATA<span class="token punctuation">[</span>SI<span class="token punctuation">]</span>
JA SWAP
JMPNEXT
SWAP<span class="token punctuation">:</span>
MOVDX<span class="token punctuation">,</span>DATA<span class="token punctuation">[</span>SI<span class="token punctuation">]</span>
MOVDATA<span class="token punctuation">[</span>DI<span class="token punctuation">]</span><span class="token punctuation">,</span>DX
MOVDATA<span class="token punctuation">[</span>SI<span class="token punctuation">]</span><span class="token punctuation">,</span>BX
NEXT<span class="token punctuation">:</span>
CMP SI<span class="token punctuation">,</span><span class="token number">18</span>
JL LOOP1
POPDX
POPBX
RET
Bubble_sort ENDP
</code></pre>
<p>外层调用:每次<span class="katex--inline"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>D</mi><mi>I</mi><mo>+</mo><mn>2</mn></mrow>DI + 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height: 0.76666em; vertical-align: -0.08333em"></span><span class="mord mathit" style="margin-right: 0.02778em">D</span><span class="mord mathit" style="margin-right: 0.07847em">I</span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0"></span><span class="mord">2</span></span></span></span></span></p>
<pre><code class="prism language-c"><span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>Sort<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
MOV CX<span class="token punctuation">,</span> <span class="token number">9</span>
MOV DI<span class="token punctuation">,</span> <span class="token number">0</span>
FOR1<span class="token punctuation">:</span>
CALL Bubble_sort
ADD DI<span class="token punctuation">,</span> <span class="token number">2</span>
LOOP FOR1
</code></pre>
<h2>3.DOS输出到屏幕</h2>
<pre><code class="prism language-c"> CALL CRLF
MOV DX<span class="token punctuation">,</span> OFFSET string_4 <span class="token punctuation">;</span><span class="token string">'After Sort the num is:'</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">9</span>
INT <span class="token number">21</span>H
MOV CX<span class="token punctuation">,</span> <span class="token number">10</span>
MOV DI<span class="token punctuation">,</span> <span class="token number">0</span>
FOR2<span class="token punctuation">:</span>
CALL Print
CALL Space
ADD DI <span class="token punctuation">,</span> <span class="token number">2</span>
LOOP FOR2
CALL CRLF
</code></pre>
<p>输出DATA内的数字,每次输出一个数字然后在输出一个空格</p>
<blockquote>
<p>Print函数:</p>
<ol>
<li>利用DIV函数的特点——每次除10的商放在AX, 余数放入DX</li>
<li>并利用栈的 FILO(First in Last Out)的特点</li>
</ol>
<p>依旧以1234的例子来看一下是怎么处理的</p>
<table>
<thead>
<tr>
<th align="center">DATA</th>
<th align="center">1234</th>
<th align="center">123</th>
<th align="center">12</th>
<th align="center">1</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"><strong>DX</strong></td>
<td align="center"><strong>4</strong></td>
<td align="center"><strong>3</strong></td>
<td align="center"><strong>2</strong></td>
<td align="center"><strong>1</strong></td>
</tr>
<tr>
<td align="center"><strong>Stack(PUSH DX)</strong></td>
<td align="center"><strong>4</strong></td>
<td align="center"><strong>4,3</strong></td>
<td align="center"><strong>4,3,2</strong></td>
<td align="center"><strong>4,3,2,1</strong></td>
</tr>
<tr>
<td align="center"><strong>Print(POP DX)</strong></td>
<td align="center"><strong>4</strong></td>
<td align="center"><strong>34</strong></td>
<td align="center"><strong>234</strong></td>
<td align="center"><strong>1234</strong></td>
</tr>
</tbody>
</table><p><span class="katex--inline"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>D</mi><mi>A</mi><mi>T</mi><mi>A</mi><mo>[</mo><mi>N</mi><mi>u</mi><mi>m</mi><mo>]</mo><mi mathvariant="normal">/</mi><mn>10</mn></mrow>DATA / 10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mord mathit" style="margin-right: 0.02778em">D</span><span class="mord mathit">A</span><span class="mord mathit" style="margin-right: 0.13889em">T</span><span class="mord mathit">A</span><span class="mopen">[</span><span class="mord mathit" style="margin-right: 0.10903em">N</span><span class="mord mathit">u</span><span class="mord mathit">m</span><span class="mclose">]</span><span class="mord">/</span><span class="mord">1</span><span class="mord">0</span></span></span></span></span> 的余数存入DX</p>
</blockquote>
<pre><code class="prism language-c">Print PROC Near
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX<span class="token punctuation">,</span> <span class="token number">0</span>
MOV BX<span class="token punctuation">,</span> <span class="token number">10</span>
MOV AX<span class="token punctuation">,</span> DATA<span class="token punctuation">[</span>DI<span class="token punctuation">]</span>
LAST<span class="token punctuation">:</span>
MOV DX<span class="token punctuation">,</span> <span class="token number">0</span>
DIV BX <span class="token punctuation">;</span> DIV商放AX,余数放入DX
PUSH DX
INC CX
CMP AX<span class="token punctuation">,</span> <span class="token number">0</span>
JNZ LAST
AGE<span class="token punctuation">:</span>
POP DX
OR DX<span class="token punctuation">,</span> <span class="token number">30</span>H
MOV AH<span class="token punctuation">,</span> <span class="token number">2</span>
INT <span class="token number">21</span>H
LOOP AGE
POPDX
POPCX
POPBX
POPAX
RET
Print ENDP
</code></pre>
<h2>4.求累加和</h2>
<ul>
<li>全部累加到<span class="katex--inline"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>D</mi><mi>A</mi><mi>T</mi><mi>A</mi><mo>[</mo><mn>0</mn><mo>]</mo></mrow>DATA</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mord mathit" style="margin-right: 0.02778em">D</span><span class="mord mathit">A</span><span class="mord mathit" style="margin-right: 0.13889em">T</span><span class="mord mathit">A</span><span class="mopen">[</span><span class="mord">0</span><span class="mclose">]</span></span></span></span></span> 上直接调用 Print 函数,因为Print函数是针对DATA数组设计的,所以把最后的结果存入DATA数组中不需要额外的输出函数。</li>
</ul>
<pre><code class="prism language-c"><span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>SUM<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
Get_sum PROC NEAR
PUSH BX
PUSH CX
MOV BX<span class="token punctuation">,</span> <span class="token number">0</span>
MOV CX <span class="token punctuation">,</span> <span class="token number">9</span>
MOV DI<span class="token punctuation">,</span> <span class="token number">2</span>
LOP1<span class="token punctuation">:</span>
MOV BX<span class="token punctuation">,</span> DATA<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>
ADD BX<span class="token punctuation">,</span> DATA<span class="token punctuation">[</span>DI<span class="token punctuation">]</span>
MOV DATA<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> BX
ADD DI <span class="token punctuation">,</span> <span class="token number">2</span>
LOOP LOP1
POP CX
POP BX
RET
Get_sum ENDP
</code></pre>
<h2>5.其他函数</h2>
<pre><code class="prism language-c"><span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span>换行子函数(一个数输入完毕)<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
CRLF PROC Near
push AX
push DX
MOV DL<span class="token punctuation">,</span> <span class="token number">0</span>ah
MOV AH<span class="token punctuation">,</span> <span class="token number">2</span>
INT <span class="token number">21</span>H
pop DX
pop AX
RET
CRLF ENDP
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>空格<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
Space PROC Near
push AX
push DX
MOV DX<span class="token punctuation">,</span> OFFSET string_5 <span class="token punctuation">;</span><span class="token string">' '</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">9</span>
INT <span class="token number">21</span>H
pop DX
pop AX
RET
Space ENDP
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>错误提示<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
ERROR PROC Near
push BX
push DX
MOV DX<span class="token punctuation">,</span> OFFSET string_2 <span class="token punctuation">;</span> ERROR<span class="token punctuation">:</span> OVERFLOW<span class="token operator">!</span> Please input again<span class="token punctuation">:</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">9</span>
INT <span class="token number">21</span>H
pop DX
pop BX
RET
ERROR ENDP
</code></pre>
<h1>四:流程图</h1>
<h2>1. 总体流程图</h2>
<p><img src="https://img-blog.csdnimg.cn/20190527002504199.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FzZDEyODA=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<h2>2. 子程序流程图</h2>
<h3>2.1 Input</h3>
<p><img src="https://img-blog.csdnimg.cn/2019052700255491.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FzZDEyODA=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<h3>2.2 Print</h3>
<p><img src="https://img-blog.csdnimg.cn/20190527002603555.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FzZDEyODA=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<h3>2.3 Bubble_Sort</h3>
<p><img src="https://img-blog.csdnimg.cn/20190527002610506.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FzZDEyODA=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<h3>2.4 Get_Sum</h3>
<p><img src="https://img-blog.csdnimg.cn/2019052700261813.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FzZDEyODA=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<h1>五:代码与运行截图</h1>
<h2>1,完整版代码(在MASM运行通过)</h2>
<pre><code class="prism language-c"><span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>数据段<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
DATAS SEGMENT
string_1 DB <span class="token string">'Please input 10 numbers(0-65536):'</span><span class="token punctuation">,</span><span class="token string">'$'</span>
string_2 DB <span class="token string">'ERROR: OVERFLOW! Please input again:'</span><span class="token punctuation">,</span><span class="token string">'$'</span>
string_3 DB <span class="token string">'The array you have input is:'</span><span class="token punctuation">,</span><span class="token number">0</span>ah<span class="token punctuation">,</span><span class="token number">0</span>dh<span class="token punctuation">,</span><span class="token string">'$'</span>
string_4 DB <span class="token string">'After Sort the num is:'</span><span class="token punctuation">,</span><span class="token number">0</span>ah<span class="token punctuation">,</span><span class="token number">0</span>dh<span class="token punctuation">,</span><span class="token string">'$'</span>
string_5 DB <span class="token string">' '</span><span class="token punctuation">,</span><span class="token string">'$'</span>
DATADW <span class="token number">10</span> <span class="token function">DUP</span><span class="token punctuation">(</span><span class="token operator">?</span><span class="token punctuation">)</span>
massegeDB <span class="token string">'The sum of the array is: '</span><span class="token punctuation">,</span><span class="token number">0</span>ah<span class="token punctuation">,</span><span class="token number">0</span>DH<span class="token punctuation">,</span><span class="token string">'$'</span>
DATAS ENDS
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>堆栈段<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
STACKS SEGMENT
DW <span class="token number">256</span> <span class="token function">dup</span><span class="token punctuation">(</span><span class="token operator">?</span><span class="token punctuation">)</span>
STACKS ENDS
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>代码段<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
CODES SEGMENT
ASSUME CS<span class="token punctuation">:</span>CODES<span class="token punctuation">,</span>DS<span class="token punctuation">:</span>DATAS<span class="token punctuation">,</span>SS<span class="token punctuation">:</span>STACKS
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>程序开始<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
START<span class="token punctuation">:</span>
MOV AX<span class="token punctuation">,</span>DATAS
MOV DS<span class="token punctuation">,</span>AX
MOV SI<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">;</span>指针初始化
MOV CX<span class="token punctuation">,</span> <span class="token number">10</span> <span class="token punctuation">;</span>循环次数
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>Input<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
MOV DX<span class="token punctuation">,</span> OFFSET string_1 <span class="token punctuation">;</span>Please input <span class="token number">10</span> <span class="token function">numbers</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token operator">-</span><span class="token number">65536</span><span class="token punctuation">)</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">9</span>
INT <span class="token number">21</span>H
Lp<span class="token punctuation">:</span>
CALL Input
ADD SI<span class="token punctuation">,</span> <span class="token number">2</span>
Loop Lp
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>结束输入,换行<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
CALL CRLF
MOV DX<span class="token punctuation">,</span> OFFSET string_3 <span class="token punctuation">;</span><span class="token string">'The array you have input is:'</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">9</span> <span class="token punctuation">;</span>首地址 DS<span class="token punctuation">:</span>DX
INT <span class="token number">21</span>H
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>输出 <span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
MOV CX<span class="token punctuation">,</span> <span class="token number">10</span>
MOV DI<span class="token punctuation">,</span> <span class="token number">0</span>
Again<span class="token punctuation">:</span>
CALL Print
CALL Space
ADD DI <span class="token punctuation">,</span> <span class="token number">2</span>
Loop Again
<span class="token punctuation">;</span><span class="token comment">/******************************/</span>
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>Sort<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
MOV CX<span class="token punctuation">,</span> <span class="token number">9</span>
MOV DI<span class="token punctuation">,</span> <span class="token number">0</span>
FOR1<span class="token punctuation">:</span>
CALL Sort
ADD DI<span class="token punctuation">,</span> <span class="token number">2</span>
LOOP FOR1
CALL CRLF
MOV DX<span class="token punctuation">,</span> OFFSET string_4 <span class="token punctuation">;</span><span class="token string">'After Sort the num is:'</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">9</span>
INT <span class="token number">21</span>H
MOV CX<span class="token punctuation">,</span> <span class="token number">10</span>
MOV DI<span class="token punctuation">,</span> <span class="token number">0</span>
FOR2<span class="token punctuation">:</span>
CALL Print
CALL Space
ADD DI <span class="token punctuation">,</span> <span class="token number">2</span>
LOOP FOR2
CALL CRLF
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>求和输出<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
MOV DX<span class="token punctuation">,</span> OFFSET massege<span class="token punctuation">;</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">9</span>
INT <span class="token number">21</span>H
CALL Get_sum
MOV DI<span class="token punctuation">,</span> <span class="token number">0</span>
CALL Print
EXIT<span class="token punctuation">:</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">4</span>CH
INT <span class="token number">21</span>H
<span class="token punctuation">;</span><span class="token comment">/************子程序调用****************/</span>
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>输入函数(单数字输入)<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
Input PROC Near
push AX
push BX
push CX
push DX
MOV BX<span class="token punctuation">,</span> <span class="token number">0</span>
CLC
MOV DX<span class="token punctuation">,</span> <span class="token number">0</span>
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>输入数字<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
Lp_0<span class="token punctuation">:</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">1</span>
INT <span class="token number">21</span>H
CMP AL<span class="token punctuation">,</span> <span class="token number">20</span>H <span class="token punctuation">;</span>空格
JE L_CRLF
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span> x belong to <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">9</span><span class="token punctuation">]</span> <span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>
SUB AL<span class="token punctuation">,</span> <span class="token number">30</span>H <span class="token punctuation">;</span> ASCII <span class="token operator">-></span> <span class="token keyword">int</span>
JL L_ERROR
CMP AL<span class="token punctuation">,</span> <span class="token number">9</span>
JG L_ERROR
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>string <span class="token operator">-></span> <span class="token keyword">int</span> <span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">;</span>将 AL扩展成 AX
XCHG AX<span class="token punctuation">,</span> BX <span class="token punctuation">;</span>保护 AX值
MOV CX<span class="token punctuation">,</span> <span class="token number">10</span>
MUL CX <span class="token punctuation">;</span> bx <span class="token operator">*</span><span class="token operator">=</span> <span class="token number">10</span>
ADD AX <span class="token punctuation">,</span> BX
JC L_ERROR<span class="token punctuation">;</span> OVERFLOW处理
XCHG AX<span class="token punctuation">,</span> BX
JMP Lp_0
L_ERROR<span class="token punctuation">:</span>
MOV DX<span class="token punctuation">,</span> <span class="token number">0</span>
MOV BX<span class="token punctuation">,</span> <span class="token number">0</span>
CALL CRLF <span class="token punctuation">;</span> 换行
CALL ERROR<span class="token punctuation">;</span> 输出错误提示
JMP Lp_0
L_CRLF<span class="token punctuation">:</span> <span class="token punctuation">;</span> 以换行作为一个数的结束标志
MOV DX<span class="token punctuation">,</span> <span class="token number">0</span>
MOV DATA<span class="token punctuation">[</span>SI<span class="token punctuation">]</span><span class="token punctuation">,</span> BX <span class="token punctuation">;</span>
POP DX
POP CX
POP BX
POP AX
RET
Input ENDP
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span>换行子函数(一个数输入完毕)<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
CRLF PROC Near
push AX
push DX
MOV DL<span class="token punctuation">,</span> <span class="token number">0</span>ah
MOV AH<span class="token punctuation">,</span> <span class="token number">2</span>
INT <span class="token number">21</span>H
pop DX
pop AX
RET
CRLF ENDP
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>空格<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
Space PROC Near
push AX
push DX
MOV DX<span class="token punctuation">,</span> OFFSET string_5 <span class="token punctuation">;</span><span class="token string">' '</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">9</span>
INT <span class="token number">21</span>H
pop DX
pop AX
RET
Space ENDP
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span>错误提示<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
ERROR PROC Near
push BX
push DX
MOV DX<span class="token punctuation">,</span> OFFSET string_2 <span class="token punctuation">;</span> ERROR<span class="token punctuation">:</span> OVERFLOW<span class="token operator">!</span> Please input again<span class="token punctuation">:</span>
MOV AH<span class="token punctuation">,</span> <span class="token number">9</span>
INT <span class="token number">21</span>H
pop DX
pop BX
RET
ERROR ENDP
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>输出函数(单数字输出)<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
Print PROC Near
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX<span class="token punctuation">,</span> <span class="token number">0</span>
MOV BX<span class="token punctuation">,</span> <span class="token number">10</span>
MOV AX<span class="token punctuation">,</span> DATA<span class="token punctuation">[</span>DI<span class="token punctuation">]</span>
LAST<span class="token punctuation">:</span>
MOV DX<span class="token punctuation">,</span> <span class="token number">0</span>
DIV BX <span class="token punctuation">;</span> DIV商放AX,余数放入DX
PUSH DX
INC CX
CMP AX<span class="token punctuation">,</span> <span class="token number">0</span>
JNZ LAST
AGE<span class="token punctuation">:</span>
POP DX
OR DX<span class="token punctuation">,</span> <span class="token number">30</span>H
MOV AH<span class="token punctuation">,</span> <span class="token number">2</span>
INT <span class="token number">21</span>H
LOOP AGE
POPDX
POPCX
POPBX
POPAX
RET
Print ENDP
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>SORT<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
SORT PROC NEAR
PUSH BX
PUSH DX
MOVSI<span class="token punctuation">,</span>DI
LOOP1<span class="token punctuation">:</span>
ADDSI<span class="token punctuation">,</span><span class="token number">2</span>
MOVBX<span class="token punctuation">,</span>DATA<span class="token punctuation">[</span>DI<span class="token punctuation">]</span>
CMPBX<span class="token punctuation">,</span>DATA<span class="token punctuation">[</span>SI<span class="token punctuation">]</span>
JA CHANGE
JMPNEXT
CHANGE<span class="token punctuation">:</span>
MOVDX<span class="token punctuation">,</span>DATA<span class="token punctuation">[</span>SI<span class="token punctuation">]</span>
MOVDATA<span class="token punctuation">[</span>DI<span class="token punctuation">]</span><span class="token punctuation">,</span>DX
MOVDATA<span class="token punctuation">[</span>SI<span class="token punctuation">]</span><span class="token punctuation">,</span>BX
NEXT<span class="token punctuation">:</span>
CMP SI<span class="token punctuation">,</span><span class="token number">18</span>
JL LOOP1
POPDX
POPBX
RET
SORT ENDP
<span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>SUM<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
Get_sum PROC NEAR
PUSH BX
PUSH CX
MOV BX<span class="token punctuation">,</span> <span class="token number">0</span>
MOV CX <span class="token punctuation">,</span> <span class="token number">9</span>
MOV DI<span class="token punctuation">,</span> <span class="token number">2</span>
LOP1<span class="token punctuation">:</span>
MOV BX<span class="token punctuation">,</span> DATA<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>
ADD BX<span class="token punctuation">,</span> DATA<span class="token punctuation">[</span>DI<span class="token punctuation">]</span>
MOV DATA<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> BX
ADD DI <span class="token punctuation">,</span> <span class="token number">2</span>
LOOP LOP1
POP CX
POP BX
RET
Get_sum ENDP
CODES ENDS
END START
</code></pre>
<h2>2. 正确运行时截图</h2>
<p><img src="https://img-blog.csdnimg.cn/20190527002628777.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FzZDEyODA=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<h2>3. 错误输入时截图</h2>
<p><img src="https://img-blog.csdnimg.cn/20190527002637453.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FzZDEyODA=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><br><br>
来源:https://www.cnblogs.com/Coder-L/p/11006357.html
頁:
[1]