汇编语言之计算器设计
<p>题目描述: </p><p> 计算器设计。在PC机上实现从键盘读入数据,并完成加、减、乘、除的计算。要求:1)屏幕上显示一个主菜单,提示用户输入相应的数字键,分别执行加、减、乘、除4种计算功能和结束程序的功能。若按其他键,则显示提示输入出错并要求重新输入,并继续显示主菜单。分别按数字键“1”、“2”、“3”,则执行相应子模块1、2、3,进行两个字节与两个字节的加法、减法和乘法运算,并在屏幕上显示运算结果。按数字键“4”,执行模块4,进行两字节除一个字节的除法运算。按数字键“5”,程序退出,返回DOS;2)要使用到子程序。</p>
<p> </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><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> 结果示例:</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]