博物馆的黎明 發表於 2020-4-7 19:44:00

汇编语言之计算器设计

<p>题目描述:  </p>
<p>  计算器设计。在PC机上实现从键盘读入数据,并完成加、减、乘、除的计算。要求:1)屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除4种计算功能和结束程序的功能。若按其他键,则显示提示输入出错并要求重新输入,并继续显示主菜单。分别按数字键“1”、“2”、“3”,则执行相应子模块1、2、3,进行两个字节与两个字节的加法、减法和乘法运算,并在屏幕上显示运算结果。按数字键“4”,执行模块4,进行两字节除一个字节的除法运算。按数字键“5”,程序退出,返回DOS;2)要使用到子程序。</p>
<p>&nbsp;</p>
<p>代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">enterline macro      ;定义回车换行的宏指令
</span><span style="color: rgba(0, 128, 128, 1)">2</span>   mov dl,<span style="color: rgba(128, 0, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">3</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">4</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">5</span>   mov dl,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">6</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">7</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">8</span> <span style="color: rgba(0, 0, 0, 1)">endm
</span><span style="color: rgba(0, 128, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)"> 10</span> <span style="color: rgba(0, 0, 0, 1)">DATAS SEGMENT
</span><span style="color: rgba(0, 128, 128, 1)"> 11</span>   menus db<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">                         MENU$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 12</span>   input db<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">            Please select a function!$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 13</span>   number db<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">         1-add, 2-sub, 3-mult, 4-div, 5-exit$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 14</span>   a db<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">You are adding. Please enter two numbers separated by a space$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 15</span>   s db<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">You are subtracting. Please enter two numbers separated by a space$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 16</span>   m db<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">You are in the process of multiplication. Please enter two numbers separated by a space$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 17</span>   d db<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">You are in the process of division.Please enter two numbers separated by a space$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 18</span>   e db<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Exiting program$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 19</span>   
<span style="color: rgba(0, 128, 128, 1)"> 20</span>   err db <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Illegal input! Please Try Again$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 21</span>   again db<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Invalid input, try again.$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 22</span>   overout db<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">The number overflowed, try again$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 23</span>   err1 db<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">The result is overflowed, try again$</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 24</span>   command db ?
<span style="color: rgba(0, 128, 128, 1)"> 25</span>   flag db ?
<span style="color: rgba(0, 128, 128, 1)"> 26</span>   temp dw <span style="color: rgba(128, 0, 128, 1)">0</span>
<span style="color: rgba(0, 128, 128, 1)"> 27</span>   buf db <span style="color: rgba(128, 0, 128, 1)">20</span>,?,<span style="color: rgba(128, 0, 128, 1)">20</span> dup(<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)    ;定义键盘接收字符缓冲区,最多接收19个字符
</span><span style="color: rgba(0, 128, 128, 1)"> 28</span>   ff db ?<span style="color: rgba(0, 0, 0, 1)">      ;输出的判断前导0的标志
</span><span style="color: rgba(0, 128, 128, 1)"> 29</span>   
<span style="color: rgba(0, 128, 128, 1)"> 30</span>   op1 dw ?<span style="color: rgba(0, 0, 0, 1)">    ;定义两个操作数(16位)
</span><span style="color: rgba(0, 128, 128, 1)"> 31</span>   op2 dw ?
<span style="color: rgba(0, 128, 128, 1)"> 32</span>   
<span style="color: rgba(0, 128, 128, 1)"> 33</span>   hex_buf db <span style="color: rgba(128, 0, 128, 1)">4</span> dup(30h),<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">H</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 34</span>   crlf db <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">            ;这是一个字符串的结尾符号,紧跟在缓冲区后可形成字符串,丢失后会产生
</span><span style="color: rgba(0, 128, 128, 1)"> 35</span> <span style="color: rgba(0, 0, 0, 1)">DATAS ENDS
</span><span style="color: rgba(0, 128, 128, 1)"> 36</span>
<span style="color: rgba(0, 128, 128, 1)"> 37</span> <span style="color: rgba(0, 0, 0, 1)">STACKS SEGMENT
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span> <span style="color: rgba(0, 0, 0, 1)">    ;此处输入堆栈段代码
</span><span style="color: rgba(0, 128, 128, 1)"> 39</span> <span style="color: rgba(0, 0, 0, 1)">STACKS ENDS
</span><span style="color: rgba(0, 128, 128, 1)"> 40</span>
<span style="color: rgba(0, 128, 128, 1)"> 41</span> <span style="color: rgba(0, 0, 0, 1)">CODES SEGMENT
</span><span style="color: rgba(0, 128, 128, 1)"> 42</span> <span style="color: rgba(0, 0, 0, 1)">    ASSUME CS:CODES,DS:DATAS,SS:STACKS
</span><span style="color: rgba(0, 128, 128, 1)"> 43</span> <span style="color: rgba(0, 0, 0, 1)">START:
</span><span style="color: rgba(0, 128, 128, 1)"> 44</span> <span style="color: rgba(0, 0, 0, 1)">    MOV AX,DATAS
</span><span style="color: rgba(0, 128, 128, 1)"> 45</span> <span style="color: rgba(0, 0, 0, 1)">    MOV DS,AX
</span><span style="color: rgba(0, 128, 128, 1)"> 46</span> <span style="color: rgba(0, 0, 0, 1)">    ;此处输入代码段代码
</span><span style="color: rgba(0, 128, 128, 1)"> 47</span>   
<span style="color: rgba(0, 128, 128, 1)"> 48</span> <span style="color: rgba(0, 0, 0, 1)">;注意每次做完了计算都要回到主菜单
</span><span style="color: rgba(0, 128, 128, 1)"> 49</span> <span style="color: rgba(0, 0, 0, 1)">menu:      ;菜单部分
</span><span style="color: rgba(0, 128, 128, 1)"> 50</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,menus
</span><span style="color: rgba(0, 128, 128, 1)"> 51</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)"> 52</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)"> 53</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)"> 54</span>   
<span style="color: rgba(0, 128, 128, 1)"> 55</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,input
</span><span style="color: rgba(0, 128, 128, 1)"> 56</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)"> 57</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)"> 58</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)"> 59</span>   
<span style="color: rgba(0, 128, 128, 1)"> 60</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,number
</span><span style="color: rgba(0, 128, 128, 1)"> 61</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)"> 62</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)"> 63</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)"> 64</span>   
<span style="color: rgba(0, 128, 128, 1)"> 65</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">            ;字符存在AL里面
</span><span style="color: rgba(0, 128, 128, 1)"> 66</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)"> 67</span>   
<span style="color: rgba(0, 128, 128, 1)"> 68</span> <span style="color: rgba(0, 0, 0, 1)">judge:                  ;判断执行哪个功能
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span>   cmp al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 70</span> <span style="color: rgba(0, 0, 0, 1)">    je a1
</span><span style="color: rgba(0, 128, 128, 1)"> 71</span>   
<span style="color: rgba(0, 128, 128, 1)"> 72</span>   cmp al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 73</span> <span style="color: rgba(0, 0, 0, 1)">    je a2
</span><span style="color: rgba(0, 128, 128, 1)"> 74</span>   
<span style="color: rgba(0, 128, 128, 1)"> 75</span>   cmp al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">3</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 76</span> <span style="color: rgba(0, 0, 0, 1)">    je a3
</span><span style="color: rgba(0, 128, 128, 1)"> 77</span>   
<span style="color: rgba(0, 128, 128, 1)"> 78</span>   cmp al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">4</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 79</span> <span style="color: rgba(0, 0, 0, 1)">    je a4
</span><span style="color: rgba(0, 128, 128, 1)"> 80</span>   
<span style="color: rgba(0, 128, 128, 1)"> 81</span>   cmp al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">5</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 82</span> <span style="color: rgba(0, 0, 0, 1)">    je stop
</span><span style="color: rgba(0, 128, 128, 1)"> 83</span>   
<span style="color: rgba(0, 128, 128, 1)"> 84</span> <span style="color: rgba(0, 0, 0, 1)">    ;上面匹配都不成功,则把输入当成无效的输入,要求重新输入
</span><span style="color: rgba(0, 128, 128, 1)"> 85</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)"> 86</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,again
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)"> 88</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)"> 89</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)"> 90</span> <span style="color: rgba(0, 0, 0, 1)">    jmp menu
</span><span style="color: rgba(0, 128, 128, 1)"> 91</span>   
<span style="color: rgba(0, 128, 128, 1)"> 92</span> <span style="color: rgba(0, 0, 0, 1)">a1:                  ;加法模块      ;设计完加法子程序后把下面这部分也封装进去
</span><span style="color: rgba(0, 128, 128, 1)"> 93</span> <span style="color: rgba(0, 0, 0, 1)">    enterline      ;这部分是输出提示性语句
</span><span style="color: rgba(0, 128, 128, 1)"> 94</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,a
</span><span style="color: rgba(0, 128, 128, 1)"> 95</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)"> 96</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)"> 97</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span>   
<span style="color: rgba(0, 128, 128, 1)"> 99</span> <span style="color: rgba(0, 0, 0, 1)">    call inputi      ;调用输入的子程序
</span><span style="color: rgba(0, 128, 128, 1)">100</span>   cmp flag,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)">101</span> <span style="color: rgba(0, 0, 0, 1)">    je a1            ;由于错误输入跳回a1重新进行加法操作
</span><span style="color: rgba(0, 128, 128, 1)">102</span>   cmp flag,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">103</span> <span style="color: rgba(0, 0, 0, 1)">    je a1            ;由于溢出跳回a1重新输入
</span><span style="color: rgba(0, 128, 128, 1)">104</span>   
<span style="color: rgba(0, 128, 128, 1)">105</span> <span style="color: rgba(0, 0, 0, 1)">    call addi      ;调用加法子程序
</span><span style="color: rgba(0, 128, 128, 1)">106</span>   cmp flag,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">107</span> <span style="color: rgba(0, 0, 0, 1)">    je over
</span><span style="color: rgba(0, 128, 128, 1)">108</span> <span style="color: rgba(0, 0, 0, 1)">    call outi
</span><span style="color: rgba(0, 128, 128, 1)">109</span> <span style="color: rgba(0, 0, 0, 1)">    jmp menu      ;执行完后跳回主菜单
</span><span style="color: rgba(0, 128, 128, 1)">110</span>   
<span style="color: rgba(0, 128, 128, 1)">111</span> <span style="color: rgba(0, 0, 0, 1)">over:
</span><span style="color: rgba(0, 128, 128, 1)">112</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,op1
</span><span style="color: rgba(0, 128, 128, 1)">113</span> <span style="color: rgba(0, 0, 0, 1)">    call to16str;将十进制转化为十六进制
</span><span style="color: rgba(0, 128, 128, 1)">114</span> <span style="color: rgba(0, 0, 0, 1)">    mov dx,offset hex_buf
</span><span style="color: rgba(0, 128, 128, 1)">115</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">116</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">117</span>   
<span style="color: rgba(0, 128, 128, 1)">118</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,op2
</span><span style="color: rgba(0, 128, 128, 1)">119</span> <span style="color: rgba(0, 0, 0, 1)">    call to16str;将十进制转化为十六进制
</span><span style="color: rgba(0, 128, 128, 1)">120</span> <span style="color: rgba(0, 0, 0, 1)">    mov dx,offset hex_buf
</span><span style="color: rgba(0, 128, 128, 1)">121</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">122</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">123</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">124</span> <span style="color: rgba(0, 0, 0, 1)">    jmp menu      ;执行完后跳回主菜单
</span><span style="color: rgba(0, 128, 128, 1)">125</span> <span style="color: rgba(0, 0, 0, 1)">a2:                  ;减法模块
</span><span style="color: rgba(0, 128, 128, 1)">126</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">127</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,s
</span><span style="color: rgba(0, 128, 128, 1)">128</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">129</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">130</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">131</span>   
<span style="color: rgba(0, 128, 128, 1)">132</span> <span style="color: rgba(0, 0, 0, 1)">    call inputi      ;调用输入的子程序
</span><span style="color: rgba(0, 128, 128, 1)">133</span>   cmp flag,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)">134</span> <span style="color: rgba(0, 0, 0, 1)">    je a2            ;由于错误输入跳回a1重新进行加法操作
</span><span style="color: rgba(0, 128, 128, 1)">135</span>   cmp flag,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">136</span> <span style="color: rgba(0, 0, 0, 1)">    je a2            ;由于溢出跳回a1重新输入
</span><span style="color: rgba(0, 128, 128, 1)">137</span>   
<span style="color: rgba(0, 128, 128, 1)">138</span> <span style="color: rgba(0, 0, 0, 1)">    call subi
</span><span style="color: rgba(0, 128, 128, 1)">139</span> <span style="color: rgba(0, 0, 0, 1)">    call outi
</span><span style="color: rgba(0, 128, 128, 1)">140</span> <span style="color: rgba(0, 0, 0, 1)">    jmp menu      ;执行完后跳回主菜单
</span><span style="color: rgba(0, 128, 128, 1)">141</span>
<span style="color: rgba(0, 128, 128, 1)">142</span> <span style="color: rgba(0, 0, 0, 1)">a3:                  ;乘法模块
</span><span style="color: rgba(0, 128, 128, 1)">143</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">144</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,m
</span><span style="color: rgba(0, 128, 128, 1)">145</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">146</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">147</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">148</span>   
<span style="color: rgba(0, 128, 128, 1)">149</span> <span style="color: rgba(0, 0, 0, 1)">    call inputi      ;调用输入的子程序
</span><span style="color: rgba(0, 128, 128, 1)">150</span>   cmp flag,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)">151</span> <span style="color: rgba(0, 0, 0, 1)">    je a3            ;由于错误输入跳回a1重新进行加法操作
</span><span style="color: rgba(0, 128, 128, 1)">152</span>   cmp flag,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">153</span> <span style="color: rgba(0, 0, 0, 1)">    je a3            ;由于溢出跳回a1重新输入
</span><span style="color: rgba(0, 128, 128, 1)">154</span>   
<span style="color: rgba(0, 128, 128, 1)">155</span> <span style="color: rgba(0, 0, 0, 1)">    call multi
</span><span style="color: rgba(0, 128, 128, 1)">156</span>   
<span style="color: rgba(0, 128, 128, 1)">157</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,op1
</span><span style="color: rgba(0, 128, 128, 1)">158</span> <span style="color: rgba(0, 0, 0, 1)">    call to16str;将十进制转化为十六进制
</span><span style="color: rgba(0, 128, 128, 1)">159</span> <span style="color: rgba(0, 0, 0, 1)">    mov dx,offset hex_buf
</span><span style="color: rgba(0, 128, 128, 1)">160</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">161</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">162</span>   
<span style="color: rgba(0, 128, 128, 1)">163</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,op2
</span><span style="color: rgba(0, 128, 128, 1)">164</span> <span style="color: rgba(0, 0, 0, 1)">    call to16str;将十进制转化为十六进制
</span><span style="color: rgba(0, 128, 128, 1)">165</span> <span style="color: rgba(0, 0, 0, 1)">    mov dx,offset hex_buf
</span><span style="color: rgba(0, 128, 128, 1)">166</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">167</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">168</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">169</span>   
<span style="color: rgba(0, 128, 128, 1)">170</span> <span style="color: rgba(0, 0, 0, 1)">    jmp menu      ;执行完后跳回主菜单
</span><span style="color: rgba(0, 128, 128, 1)">171</span>
<span style="color: rgba(0, 128, 128, 1)">172</span> <span style="color: rgba(0, 0, 0, 1)">a4:                  ;除法模块
</span><span style="color: rgba(0, 128, 128, 1)">173</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">174</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,d
</span><span style="color: rgba(0, 128, 128, 1)">175</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">176</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">177</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">178</span>   
<span style="color: rgba(0, 128, 128, 1)">179</span> <span style="color: rgba(0, 0, 0, 1)">    call inputi      ;调用输入的子程序
</span><span style="color: rgba(0, 128, 128, 1)">180</span>   cmp flag,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)">181</span> <span style="color: rgba(0, 0, 0, 1)">    je a4            ;由于错误输入跳回a1重新进行加法操作
</span><span style="color: rgba(0, 128, 128, 1)">182</span>   cmp flag,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">183</span> <span style="color: rgba(0, 0, 0, 1)">    je a4            ;由于溢出跳回a1重新输入
</span><span style="color: rgba(0, 128, 128, 1)">184</span>   
<span style="color: rgba(0, 128, 128, 1)">185</span> <span style="color: rgba(0, 0, 0, 1)">    call divi
</span><span style="color: rgba(0, 128, 128, 1)">186</span>   cmp flag,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)">187</span> <span style="color: rgba(0, 0, 0, 1)">    je a4            ;由于除数可能输0导致重新输入
</span><span style="color: rgba(0, 128, 128, 1)">188</span> <span style="color: rgba(0, 0, 0, 1)">    call outi
</span><span style="color: rgba(0, 128, 128, 1)">189</span> <span style="color: rgba(0, 0, 0, 1)">    jmp menu      ;执行完后跳回主菜单
</span><span style="color: rgba(0, 128, 128, 1)">190</span>
<span style="color: rgba(0, 128, 128, 1)">191</span> <span style="color: rgba(0, 0, 0, 1)">stop:      ;程序的结束
</span><span style="color: rgba(0, 128, 128, 1)">192</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">193</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,e
</span><span style="color: rgba(0, 128, 128, 1)">194</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">195</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">196</span>   
<span style="color: rgba(0, 128, 128, 1)">197</span> <span style="color: rgba(0, 0, 0, 1)">    MOV AH,4CH
</span><span style="color: rgba(0, 128, 128, 1)">198</span> <span style="color: rgba(0, 0, 0, 1)">    INT 21H
</span><span style="color: rgba(0, 128, 128, 1)">199</span>
<span style="color: rgba(0, 128, 128, 1)">200</span>
<span style="color: rgba(0, 128, 128, 1)">201</span> <span style="color: rgba(0, 0, 0, 1)">inputi proc            ;输入子程序如下
</span><span style="color: rgba(0, 128, 128, 1)">202</span>   mov flag,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">      ;初始化flag
</span><span style="color: rgba(0, 128, 128, 1)">203</span>   
<span style="color: rgba(0, 128, 128, 1)">204</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,buf      ;从键盘接收输入数值放入buf缓冲区(输入操作)
</span><span style="color: rgba(0, 128, 128, 1)">205</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">206</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">207</span> <span style="color: rgba(0, 0, 0, 1)">    enterline      ;回车换行
</span><span style="color: rgba(0, 128, 128, 1)">208</span>   
<span style="color: rgba(0, 128, 128, 1)">209</span>   
<span style="color: rgba(0, 128, 128, 1)">210</span>   mov cl,buf+<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">    ;获取实际键入字符数,置于CX寄存器中
</span><span style="color: rgba(0, 128, 128, 1)">211</span> <span style="color: rgba(0, 0, 0, 1)">    xor ch,ch      ;ch清0
</span><span style="color: rgba(0, 128, 128, 1)">212</span>   
<span style="color: rgba(0, 128, 128, 1)">213</span> <span style="color: rgba(0, 0, 0, 1)">    xor di,di      ;累加器清0
</span><span style="color: rgba(0, 128, 128, 1)">214</span> <span style="color: rgba(0, 0, 0, 1)">    xor dx,dx      ;dX寄存器清0
</span><span style="color: rgba(0, 128, 128, 1)">215</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">      ;由于从个位数开始算起,因而将所乘权值设为1
</span><span style="color: rgba(0, 128, 128, 1)">216</span>   
<span style="color: rgba(0, 128, 128, 1)">217</span>   lea si,buf+<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">    ;将si指向接收到的第1个字符位置
</span><span style="color: rgba(0, 128, 128, 1)">218</span> <span style="color: rgba(0, 0, 0, 1)">    add si,cx      ;因为从个位算起,所以将si指向最后1个接收到的个位数
</span><span style="color: rgba(0, 128, 128, 1)">219</span> <span style="color: rgba(0, 0, 0, 1)">    dec si            ;往回减1使其指向字串最后一个元素
</span><span style="color: rgba(0, 128, 128, 1)">220</span>
<span style="color: rgba(0, 128, 128, 1)">221</span> <span style="color: rgba(0, 0, 0, 1)">;cov是检测并生成第一个数字的步骤
</span><span style="color: rgba(0, 128, 128, 1)">222</span> <span style="color: rgba(0, 0, 0, 1)">cov:mov al,      ;取出个位数给al
</span><span style="color: rgba(0, 128, 128, 1)">223</span>   cmp al,<span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(128, 0, 0, 1)">'</span>      
<span style="color: rgba(0, 128, 128, 1)">224</span> <span style="color: rgba(0, 0, 0, 1)">    jz next1      ;遇见空格则跳转
</span><span style="color: rgba(0, 128, 128, 1)">225</span>   
<span style="color: rgba(0, 128, 128, 1)">226</span>   cmp al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>      ;边界检查:如果输入不是0-<span style="color: rgba(0, 0, 0, 1)">9的数字,就报错
</span><span style="color: rgba(0, 128, 128, 1)">227</span> <span style="color: rgba(0, 0, 0, 1)">    jb wrong
</span><span style="color: rgba(0, 128, 128, 1)">228</span>   cmp al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">229</span> <span style="color: rgba(0, 0, 0, 1)">    ja wrong
</span><span style="color: rgba(0, 128, 128, 1)">230</span>   
<span style="color: rgba(0, 128, 128, 1)">231</span> <span style="color: rgba(0, 0, 0, 1)">    sub al,30h      ;将al中的ascii码转为数字
</span><span style="color: rgba(0, 128, 128, 1)">232</span> <span style="color: rgba(0, 0, 0, 1)">    xor ah,ah
</span><span style="color: rgba(0, 128, 128, 1)">233</span> <span style="color: rgba(0, 0, 0, 1)">    mul bx            ;乘以所处数位的权值
</span><span style="color: rgba(0, 128, 128, 1)">234</span>   cmp dx,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">      ;判断结果是否超出16位数范围,如超出则报错
</span><span style="color: rgba(0, 128, 128, 1)">235</span> <span style="color: rgba(0, 0, 0, 1)">    jne yichu
</span><span style="color: rgba(0, 128, 128, 1)">236</span>   
<span style="color: rgba(0, 128, 128, 1)">237</span> <span style="color: rgba(0, 0, 0, 1)">    add di,ax      ;将形成的数值叠加放在累加器di中
</span><span style="color: rgba(0, 128, 128, 1)">238</span> <span style="color: rgba(0, 0, 0, 1)">    jc yichu      ;CF是进位标志
</span><span style="color: rgba(0, 128, 128, 1)">239</span>
<span style="color: rgba(0, 128, 128, 1)">240</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,bx      ;将BX中的数位权值扩大10倍,此处需要借助ax来实现
</span><span style="color: rgba(0, 128, 128, 1)">241</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">242</span> <span style="color: rgba(0, 0, 0, 1)">    mul bx
</span><span style="color: rgba(0, 128, 128, 1)">243</span> <span style="color: rgba(0, 0, 0, 1)">    mov bx,ax
</span><span style="color: rgba(0, 128, 128, 1)">244</span>   
<span style="color: rgba(0, 128, 128, 1)">245</span> <span style="color: rgba(0, 0, 0, 1)">    dec si            ;si指针减1,指向前一数位
</span><span style="color: rgba(0, 128, 128, 1)">246</span> <span style="color: rgba(0, 0, 0, 1)">    loop cov      ;按CX中的字符个数计数循环
</span><span style="color: rgba(0, 128, 128, 1)">247</span>      
<span style="color: rgba(0, 128, 128, 1)">248</span> <span style="color: rgba(0, 0, 0, 1)">;跳到次处表明第一个数字已经生成,接着去检测第二个数字   
</span><span style="color: rgba(0, 128, 128, 1)">249</span> <span style="color: rgba(0, 0, 0, 1)">next1:
</span><span style="color: rgba(0, 128, 128, 1)">250</span> <span style="color: rgba(0, 0, 0, 1)">    mov op1,di      ;将结果储存在op1中4
</span><span style="color: rgba(0, 128, 128, 1)">251</span> <span style="color: rgba(0, 0, 0, 1)">    xor ax,ax
</span><span style="color: rgba(0, 128, 128, 1)">252</span> <span style="color: rgba(0, 0, 0, 1)">    xor di,di      ;累加器清0
</span><span style="color: rgba(0, 128, 128, 1)">253</span> <span style="color: rgba(0, 0, 0, 1)">    xor bx,bx
</span><span style="color: rgba(0, 128, 128, 1)">254</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">      ;由于从个位数开始算起,因而将所乘权值设为1
</span><span style="color: rgba(0, 128, 128, 1)">255</span> <span style="color: rgba(0, 0, 0, 1)">    dec si      ;向前移动一格位置
</span><span style="color: rgba(0, 128, 128, 1)">256</span> <span style="color: rgba(0, 0, 0, 1)">    dec cx      ;遇到空格cx相应的减少1
</span><span style="color: rgba(0, 128, 128, 1)">257</span>
<span style="color: rgba(0, 128, 128, 1)">258</span>
<span style="color: rgba(0, 128, 128, 1)">259</span> <span style="color: rgba(0, 0, 0, 1)">;cov2是检测并生成第2个数字
</span><span style="color: rgba(0, 128, 128, 1)">260</span> <span style="color: rgba(0, 0, 0, 1)">cov2:
</span><span style="color: rgba(0, 128, 128, 1)">261</span> <span style="color: rgba(0, 0, 0, 1)">    mov al,      ;取出个位数给al
</span><span style="color: rgba(0, 128, 128, 1)">262</span>
<span style="color: rgba(0, 128, 128, 1)">263</span>   cmp al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>      ;边界检查:如果输入不是0-<span style="color: rgba(0, 0, 0, 1)">9的数字,就报错
</span><span style="color: rgba(0, 128, 128, 1)">264</span> <span style="color: rgba(0, 0, 0, 1)">    jb wrong
</span><span style="color: rgba(0, 128, 128, 1)">265</span>   cmp al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">266</span> <span style="color: rgba(0, 0, 0, 1)">    ja wrong
</span><span style="color: rgba(0, 128, 128, 1)">267</span>   
<span style="color: rgba(0, 128, 128, 1)">268</span> <span style="color: rgba(0, 0, 0, 1)">    sub al,30h      ;将al中的ascii码转为数字
</span><span style="color: rgba(0, 128, 128, 1)">269</span> <span style="color: rgba(0, 0, 0, 1)">    xor ah,ah
</span><span style="color: rgba(0, 128, 128, 1)">270</span> <span style="color: rgba(0, 0, 0, 1)">    mul bx            ;乘以所处数位的权值
</span><span style="color: rgba(0, 128, 128, 1)">271</span>   cmp dx,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">      ;判断结果是否超出16位数范围,如超出则报错
</span><span style="color: rgba(0, 128, 128, 1)">272</span> <span style="color: rgba(0, 0, 0, 1)">    jne yichu
</span><span style="color: rgba(0, 128, 128, 1)">273</span>   
<span style="color: rgba(0, 128, 128, 1)">274</span> <span style="color: rgba(0, 0, 0, 1)">    add di,ax      ;将形成的数值放在累加器di中
</span><span style="color: rgba(0, 128, 128, 1)">275</span> <span style="color: rgba(0, 0, 0, 1)">    jc yichu      ;CF是进位标志
</span><span style="color: rgba(0, 128, 128, 1)">276</span>         
<span style="color: rgba(0, 128, 128, 1)">277</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,bx      ;将BX中的数位权值扩大10倍,此处需要借助ax来实现
</span><span style="color: rgba(0, 128, 128, 1)">278</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">279</span> <span style="color: rgba(0, 0, 0, 1)">    mul bx
</span><span style="color: rgba(0, 128, 128, 1)">280</span> <span style="color: rgba(0, 0, 0, 1)">    mov bx,ax
</span><span style="color: rgba(0, 128, 128, 1)">281</span>   
<span style="color: rgba(0, 128, 128, 1)">282</span> <span style="color: rgba(0, 0, 0, 1)">    dec si            ;si指针减1,指向前一数位
</span><span style="color: rgba(0, 128, 128, 1)">283</span> <span style="color: rgba(0, 0, 0, 1)">    loop cov2      ;按CX中的字符个数计数循环
</span><span style="color: rgba(0, 128, 128, 1)">284</span>   
<span style="color: rgba(0, 128, 128, 1)">285</span> <span style="color: rgba(0, 0, 0, 1)">next2:
</span><span style="color: rgba(0, 128, 128, 1)">286</span> <span style="color: rgba(0, 0, 0, 1)">    mov op2,di      ;将结果储存在op2中
</span><span style="color: rgba(0, 128, 128, 1)">287</span>   jmp <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">      ;结束后跳到return部分
</span><span style="color: rgba(0, 128, 128, 1)">288</span>   
<span style="color: rgba(0, 128, 128, 1)">289</span> <span style="color: rgba(0, 0, 0, 1)">wrong:
</span><span style="color: rgba(0, 128, 128, 1)">290</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,err
</span><span style="color: rgba(0, 128, 128, 1)">291</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">292</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">293</span>   mov flag,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)">294</span>   jmp <span style="color: rgba(0, 0, 255, 1)">return</span>
<span style="color: rgba(0, 128, 128, 1)">295</span>   
<span style="color: rgba(0, 128, 128, 1)">296</span> <span style="color: rgba(0, 0, 0, 1)">yichu:
</span><span style="color: rgba(0, 128, 128, 1)">297</span>   mov flag,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">298</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,overout
</span><span style="color: rgba(0, 128, 128, 1)">299</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">300</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">301</span>   
<span style="color: rgba(0, 128, 128, 1)">302</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">303</span> <span style="color: rgba(0, 0, 0, 1)">    ret
</span><span style="color: rgba(0, 128, 128, 1)">304</span> <span style="color: rgba(0, 0, 0, 1)">inputi endp
</span><span style="color: rgba(0, 128, 128, 1)">305</span>
<span style="color: rgba(0, 128, 128, 1)">306</span> <span style="color: rgba(0, 0, 0, 1)">addi proc    ;加法子程序(16位数相加)
</span><span style="color: rgba(0, 128, 128, 1)">307</span> <span style="color: rgba(0, 0, 0, 1)">    xor bx,bx
</span><span style="color: rgba(0, 128, 128, 1)">308</span> <span style="color: rgba(0, 0, 0, 1)">    xor cx,cx
</span><span style="color: rgba(0, 128, 128, 1)">309</span> <span style="color: rgba(0, 0, 0, 1)">    mov bx,op2
</span><span style="color: rgba(0, 128, 128, 1)">310</span> <span style="color: rgba(0, 0, 0, 1)">    mov cx,op1
</span><span style="color: rgba(0, 128, 128, 1)">311</span> <span style="color: rgba(0, 0, 0, 1)">    add bx,cx
</span><span style="color: rgba(0, 128, 128, 1)">312</span> <span style="color: rgba(0, 0, 0, 1)">    cmp bx,op1
</span><span style="color: rgba(0, 128, 128, 1)">313</span> <span style="color: rgba(0, 0, 0, 1)">    jb ex
</span><span style="color: rgba(0, 128, 128, 1)">314</span> <span style="color: rgba(0, 0, 0, 1)">    cmp bx,op2
</span><span style="color: rgba(0, 128, 128, 1)">315</span> <span style="color: rgba(0, 0, 0, 1)">    jb ex
</span><span style="color: rgba(0, 128, 128, 1)">316</span> <span style="color: rgba(0, 0, 0, 1)">    jmp addret
</span><span style="color: rgba(0, 128, 128, 1)">317</span> <span style="color: rgba(0, 0, 0, 1)">ex:                  ;表示结果高于16位的加法操作
</span><span style="color: rgba(0, 128, 128, 1)">318</span>   mov flag,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">319</span> <span style="color: rgba(0, 0, 0, 1)">    mov op2,bx
</span><span style="color: rgba(0, 128, 128, 1)">320</span>   mov op1,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">      ;表示进位
</span><span style="color: rgba(0, 128, 128, 1)">321</span>   
<span style="color: rgba(0, 128, 128, 1)">322</span> <span style="color: rgba(0, 0, 0, 1)">addret:
</span><span style="color: rgba(0, 128, 128, 1)">323</span> <span style="color: rgba(0, 0, 0, 1)">    ret
</span><span style="color: rgba(0, 128, 128, 1)">324</span> <span style="color: rgba(0, 0, 0, 1)">addi endp
</span><span style="color: rgba(0, 128, 128, 1)">325</span>
<span style="color: rgba(0, 128, 128, 1)">326</span> <span style="color: rgba(0, 0, 0, 1)">subi proc    ;减法子程序(16位数相减)
</span><span style="color: rgba(0, 128, 128, 1)">327</span> <span style="color: rgba(0, 0, 0, 1)">    xor bx,bx
</span><span style="color: rgba(0, 128, 128, 1)">328</span> <span style="color: rgba(0, 0, 0, 1)">    xor cx,cx
</span><span style="color: rgba(0, 128, 128, 1)">329</span> <span style="color: rgba(0, 0, 0, 1)">    mov bx,op2
</span><span style="color: rgba(0, 128, 128, 1)">330</span> <span style="color: rgba(0, 0, 0, 1)">    mov cx,op1
</span><span style="color: rgba(0, 128, 128, 1)">331</span> <span style="color: rgba(0, 0, 0, 1)">    cmp bx,cx      ;比较大小
</span><span style="color: rgba(0, 128, 128, 1)">332</span> <span style="color: rgba(0, 0, 0, 1)">    jb fuhao
</span><span style="color: rgba(0, 128, 128, 1)">333</span> <span style="color: rgba(0, 0, 0, 1)">    sub bx,cx      ;结果储存在bx中      
</span><span style="color: rgba(0, 128, 128, 1)">334</span> <span style="color: rgba(0, 0, 0, 1)">    jmp subret
</span><span style="color: rgba(0, 128, 128, 1)">335</span> <span style="color: rgba(0, 0, 0, 1)">fuhao:   
</span><span style="color: rgba(0, 128, 128, 1)">336</span>   mov dx,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">-</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">337</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">338</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">339</span> <span style="color: rgba(0, 0, 0, 1)">    sub cx,bx
</span><span style="color: rgba(0, 128, 128, 1)">340</span> <span style="color: rgba(0, 0, 0, 1)">    mov bx,cx
</span><span style="color: rgba(0, 128, 128, 1)">341</span> <span style="color: rgba(0, 0, 0, 1)">subret:
</span><span style="color: rgba(0, 128, 128, 1)">342</span> <span style="color: rgba(0, 0, 0, 1)">    ret
</span><span style="color: rgba(0, 128, 128, 1)">343</span> <span style="color: rgba(0, 0, 0, 1)">subi endp
</span><span style="color: rgba(0, 128, 128, 1)">344</span>
<span style="color: rgba(0, 128, 128, 1)">345</span> <span style="color: rgba(0, 0, 0, 1)">multi proc    ;乘法子程序(16位数相乘)
</span><span style="color: rgba(0, 128, 128, 1)">346</span> <span style="color: rgba(0, 0, 0, 1)">    xor ax,ax
</span><span style="color: rgba(0, 128, 128, 1)">347</span> <span style="color: rgba(0, 0, 0, 1)">    xor cx,cx
</span><span style="color: rgba(0, 128, 128, 1)">348</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,op2
</span><span style="color: rgba(0, 128, 128, 1)">349</span> <span style="color: rgba(0, 0, 0, 1)">    mov cx,op1
</span><span style="color: rgba(0, 128, 128, 1)">350</span> <span style="color: rgba(0, 0, 0, 1)">    mul cx            ;结果存在dx:ax里面
</span><span style="color: rgba(0, 128, 128, 1)">351</span> <span style="color: rgba(0, 0, 0, 1)">    mov op1,dx
</span><span style="color: rgba(0, 128, 128, 1)">352</span> <span style="color: rgba(0, 0, 0, 1)">    mov op2,ax      ;暂存在op1和op2
</span><span style="color: rgba(0, 128, 128, 1)">353</span> <span style="color: rgba(0, 0, 0, 1)">    ret
</span><span style="color: rgba(0, 128, 128, 1)">354</span> <span style="color: rgba(0, 0, 0, 1)">multi endp
</span><span style="color: rgba(0, 128, 128, 1)">355</span>
<span style="color: rgba(0, 128, 128, 1)">356</span> <span style="color: rgba(0, 0, 0, 1)">divi proc    ;除法子程序(16位数除以8位数)
</span><span style="color: rgba(0, 128, 128, 1)">357</span> <span style="color: rgba(0, 0, 0, 1)">    xor bx,bx            ;注意 该程序的除数不能超过255 并且商也不能超过255 他们的承载能力只有8位
</span><span style="color: rgba(0, 128, 128, 1)">358</span> <span style="color: rgba(0, 0, 0, 1)">    xor cx,cx
</span><span style="color: rgba(0, 128, 128, 1)">359</span> <span style="color: rgba(0, 0, 0, 1)">    xor ax,ax
</span><span style="color: rgba(0, 128, 128, 1)">360</span> <span style="color: rgba(0, 0, 0, 1)">    mov cx,op1            ;实际上存在cl中
</span><span style="color: rgba(0, 128, 128, 1)">361</span>   cmp cx,<span style="color: rgba(128, 0, 128, 1)">255</span>            ;让cx的值处于0~<span style="color: rgba(0, 0, 0, 1)">255之间(因为寄存器是8位的)
</span><span style="color: rgba(0, 128, 128, 1)">362</span> <span style="color: rgba(0, 0, 0, 1)">    ja divwrong
</span><span style="color: rgba(0, 128, 128, 1)">363</span>   cmp cl,<span style="color: rgba(128, 0, 128, 1)">0</span>
<span style="color: rgba(0, 128, 128, 1)">364</span> <span style="color: rgba(0, 0, 0, 1)">    je divwrong
</span><span style="color: rgba(0, 128, 128, 1)">365</span>   mov al,<span style="color: rgba(128, 0, 128, 1)">255</span><span style="color: rgba(0, 0, 0, 1)">            ;让255和op1相乘,与op2比较,若小于op2则会发生divide error因此判断非法
</span><span style="color: rgba(0, 128, 128, 1)">366</span> <span style="color: rgba(0, 0, 0, 1)">    mul cl
</span><span style="color: rgba(0, 128, 128, 1)">367</span> <span style="color: rgba(0, 0, 0, 1)">    cmp ax,op2
</span><span style="color: rgba(0, 128, 128, 1)">368</span> <span style="color: rgba(0, 0, 0, 1)">    jb overflow
</span><span style="color: rgba(0, 128, 128, 1)">369</span>   
<span style="color: rgba(0, 128, 128, 1)">370</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,op2
</span><span style="color: rgba(0, 128, 128, 1)">371</span> <span style="color: rgba(0, 0, 0, 1)">    div cl                ;字除以1字节型除法,商存在al中
</span><span style="color: rgba(0, 128, 128, 1)">372</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;清除ah中的内容
</span><span style="color: rgba(0, 128, 128, 1)">373</span> <span style="color: rgba(0, 0, 0, 1)">    mov bx,ax
</span><span style="color: rgba(0, 128, 128, 1)">374</span> <span style="color: rgba(0, 0, 0, 1)">    jmp divret
</span><span style="color: rgba(0, 128, 128, 1)">375</span> <span style="color: rgba(0, 0, 0, 1)">divwrong:
</span><span style="color: rgba(0, 128, 128, 1)">376</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,err
</span><span style="color: rgba(0, 128, 128, 1)">377</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">378</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">379</span>   mov flag,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)">380</span> <span style="color: rgba(0, 0, 0, 1)">overflow:
</span><span style="color: rgba(0, 128, 128, 1)">381</span> <span style="color: rgba(0, 0, 0, 1)">    lea dx,err1
</span><span style="color: rgba(0, 128, 128, 1)">382</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
<span style="color: rgba(0, 128, 128, 1)">383</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">384</span>   mov flag,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)">385</span> <span style="color: rgba(0, 0, 0, 1)">divret:
</span><span style="color: rgba(0, 128, 128, 1)">386</span> <span style="color: rgba(0, 0, 0, 1)">    ret
</span><span style="color: rgba(0, 128, 128, 1)">387</span> <span style="color: rgba(0, 0, 0, 1)">divi endp
</span><span style="color: rgba(0, 128, 128, 1)">388</span>
<span style="color: rgba(0, 128, 128, 1)">389</span> <span style="color: rgba(0, 0, 0, 1)">outi proc
</span><span style="color: rgba(0, 128, 128, 1)">390</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,bx            ;待输出的数先存在bx里面,在给ax
</span><span style="color: rgba(0, 128, 128, 1)">391</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">10000</span><span style="color: rgba(0, 0, 0, 1)">      ;初始数位权值为10000
</span><span style="color: rgba(0, 128, 128, 1)">392</span>   mov ff,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;每次都赋初值0
</span><span style="color: rgba(0, 128, 128, 1)">393</span>   
<span style="color: rgba(0, 128, 128, 1)">394</span> <span style="color: rgba(0, 0, 0, 1)">cov1:xor dx,dx            ;将dx:ax中的数值除以权值
</span><span style="color: rgba(0, 128, 128, 1)">395</span> <span style="color: rgba(0, 0, 0, 1)">    div bx
</span><span style="color: rgba(0, 128, 128, 1)">396</span> <span style="color: rgba(0, 0, 0, 1)">    mov cx,dx            ;余数备份到CX寄存器中
</span><span style="color: rgba(0, 128, 128, 1)">397</span>   
<span style="color: rgba(0, 128, 128, 1)">398</span>   cmp ff,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;检测是否曾遇到非0商值
</span><span style="color: rgba(0, 128, 128, 1)">399</span> <span style="color: rgba(0, 0, 0, 1)">    jne nor1            ;如遇到过,则不管商是否为0都输出显示
</span><span style="color: rgba(0, 128, 128, 1)">400</span>   cmp ax,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">            ;如未遇到过,则检测商是否为0
</span><span style="color: rgba(0, 128, 128, 1)">401</span> <span style="color: rgba(0, 0, 0, 1)">    je cont                ;为0则不输出显示   
</span><span style="color: rgba(0, 128, 128, 1)">402</span> <span style="color: rgba(0, 0, 0, 1)">nor1:
</span><span style="color: rgba(0, 128, 128, 1)">403</span> <span style="color: rgba(0, 0, 0, 1)">    mov dl,al            ;将商转换为ascii码输出显示
</span><span style="color: rgba(0, 128, 128, 1)">404</span> <span style="color: rgba(0, 0, 0, 1)">    add dl,30h
</span><span style="color: rgba(0, 128, 128, 1)">405</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">406</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 128, 128, 1)">407</span>   
<span style="color: rgba(0, 128, 128, 1)">408</span>   mov ff,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">            ;曾遇到非0商,则将标志置1
</span><span style="color: rgba(0, 128, 128, 1)">409</span> <span style="color: rgba(0, 0, 0, 1)">cont:
</span><span style="color: rgba(0, 128, 128, 1)">410</span>   cmp bx,<span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">            ;检测权值是否已经修改到十位了
</span><span style="color: rgba(0, 128, 128, 1)">411</span> <span style="color: rgba(0, 0, 0, 1)">    je outer            ;如果相等,则完成最后的个位数输出显示
</span><span style="color: rgba(0, 128, 128, 1)">412</span>   
<span style="color: rgba(0, 128, 128, 1)">413</span> <span style="color: rgba(0, 0, 0, 1)">    xor dx,dx            ;将数位权值除以10
</span><span style="color: rgba(0, 128, 128, 1)">414</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,bx
</span><span style="color: rgba(0, 128, 128, 1)">415</span>   mov bx,<span style="color: rgba(128, 0, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">416</span> <span style="color: rgba(0, 0, 0, 1)">    div bx
</span><span style="color: rgba(0, 128, 128, 1)">417</span> <span style="color: rgba(0, 0, 0, 1)">    mov bx,ax
</span><span style="color: rgba(0, 128, 128, 1)">418</span>
<span style="color: rgba(0, 128, 128, 1)">419</span> <span style="color: rgba(0, 0, 0, 1)">    mov ax,cx            ;将备份的余数送入AX
</span><span style="color: rgba(0, 128, 128, 1)">420</span> <span style="color: rgba(0, 0, 0, 1)">    jmp cov1                ;继续循环
</span><span style="color: rgba(0, 128, 128, 1)">421</span> <span style="color: rgba(0, 0, 0, 1)">outer:
</span><span style="color: rgba(0, 128, 128, 1)">422</span> <span style="color: rgba(0, 0, 0, 1)">    mov dl,cl            ;最后的个位数变为ascii码输出显示
</span><span style="color: rgba(0, 128, 128, 1)">423</span> <span style="color: rgba(0, 0, 0, 1)">    add dl,30h
</span><span style="color: rgba(0, 128, 128, 1)">424</span>   mov ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">425</span>   <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h   
</span><span style="color: rgba(0, 128, 128, 1)">426</span> <span style="color: rgba(0, 0, 0, 1)">    enterline
</span><span style="color: rgba(0, 128, 128, 1)">427</span> <span style="color: rgba(0, 0, 0, 1)">ret
</span><span style="color: rgba(0, 128, 128, 1)">428</span> <span style="color: rgba(0, 0, 0, 1)">outi endp
</span><span style="color: rgba(0, 128, 128, 1)">429</span>
<span style="color: rgba(0, 128, 128, 1)">430</span> <span style="color: rgba(0, 0, 0, 1)">to16str proc;功能:将十进制转化为十六进制
</span><span style="color: rgba(0, 128, 128, 1)">431</span> <span style="color: rgba(0, 0, 0, 1)">    mov bx,ax;将带转换的十进制数赋值给bx
</span><span style="color: rgba(0, 128, 128, 1)">432</span> <span style="color: rgba(0, 0, 0, 1)">    mov si,offset hex_buf    ;将字符串的首地址赋值给si
</span><span style="color: rgba(0, 128, 128, 1)">433</span>
<span style="color: rgba(0, 128, 128, 1)">434</span>   mov ch,<span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)"> ;将10进制转为4位16进制数,每次操作1位,ch为当前还需要转换的位数
</span><span style="color: rgba(0, 128, 128, 1)">435</span> <span style="color: rgba(0, 0, 0, 1)">    loop_trans:
</span><span style="color: rgba(0, 128, 128, 1)">436</span>   mov cl,<span style="color: rgba(128, 0, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">437</span> <span style="color: rgba(0, 0, 0, 1)">    rol bx,cl;此处cl的值为4,代表将BX中的值循环左移4位,bx中做该4位移动到最低4位
</span><span style="color: rgba(0, 128, 128, 1)">438</span>   
<span style="color: rgba(0, 128, 128, 1)">439</span> <span style="color: rgba(0, 0, 0, 1)">    mov al,bl;从高到低提取四位二进制数送入al,和0fh进行与操作得bl中低4位
</span><span style="color: rgba(0, 128, 128, 1)">440</span> <span style="color: rgba(0, 0, 0, 1)">    and al,0fh
</span><span style="color: rgba(0, 128, 128, 1)">441</span>   
<span style="color: rgba(0, 128, 128, 1)">442</span>   add al,30h;al=<span style="color: rgba(128, 0, 128, 1)">0</span>~<span style="color: rgba(128, 0, 128, 1)">9</span><span style="color: rgba(0, 0, 0, 1)">,加30h转化为ascii码
</span><span style="color: rgba(0, 128, 128, 1)">443</span> <span style="color: rgba(0, 0, 0, 1)">    cmp al,3ah
</span><span style="color: rgba(0, 128, 128, 1)">444</span> <span style="color: rgba(0, 0, 0, 1)">    jl next_trans
</span><span style="color: rgba(0, 128, 128, 1)">445</span>   add al,<span style="color: rgba(128, 0, 128, 1)">7</span>;al&gt;<span style="color: rgba(128, 0, 128, 1)">9</span>,加37h转化为ascii码,转换为字母A~<span style="color: rgba(0, 0, 0, 1)">F
</span><span style="color: rgba(0, 128, 128, 1)">446</span>   
<span style="color: rgba(0, 128, 128, 1)">447</span> <span style="color: rgba(0, 0, 0, 1)">    next_trans:
</span><span style="color: rgba(0, 128, 128, 1)">448</span> <span style="color: rgba(0, 0, 0, 1)">    mov ,al    ;将转换好的ascii码赋值给字符串的si位置处
</span><span style="color: rgba(0, 128, 128, 1)">449</span> <span style="color: rgba(0, 0, 0, 1)">    inc si    ;si向后移动一位
</span><span style="color: rgba(0, 128, 128, 1)">450</span> <span style="color: rgba(0, 0, 0, 1)">    dec ch    ;代表还需转换的位数减1
</span><span style="color: rgba(0, 128, 128, 1)">451</span> <span style="color: rgba(0, 0, 0, 1)">    jnz loop_trans;注意,这儿只能用dec运算对标志位的设置来判断循环与否
</span><span style="color: rgba(0, 128, 128, 1)">452</span> <span style="color: rgba(0, 0, 0, 1)">    ;因为cl被用来存放位移数了
</span><span style="color: rgba(0, 128, 128, 1)">453</span> <span style="color: rgba(0, 0, 0, 1)">ret
</span><span style="color: rgba(0, 128, 128, 1)">454</span> <span style="color: rgba(0, 0, 0, 1)">to16str endp
</span><span style="color: rgba(0, 128, 128, 1)">455</span> <span style="color: rgba(0, 0, 0, 1)">CODES ENDS
</span><span style="color: rgba(0, 128, 128, 1)">456</span>   END START</pre>
</div>
<p>&nbsp;结果示例:</p>
<p><img src="https://img2020.cnblogs.com/blog/1729453/202004/1729453-20200411203537148-515630374.png" alt=""></p><br><br>
来源:https://www.cnblogs.com/xwh-blogs/p/12655543.html
頁: [1]
查看完整版本: 汇编语言之计算器设计