可达可达 發表於 2021-11-27 14:13:54

汇编语言系列之汇编实现简单数学运算

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1.计算S=1+2×3+3×4+4×5+···+N(N+1)</li><ul class="second_class_ul"><li>1.1设计要求:</li><li>1.2设计思路:</li><li>1.3程序清单:</li><li>1.4程序运行结果及分析:</li></ul><li>2.计算N!</li><ul class="second_class_ul"><li>2.1设计要求:</li><li>2.2设计思路:</li><li>2.3程序清单:</li><li>2.4程序运行结果及分析:</li></ul></ul></div><p>软件:emu8086</p>
<p>语言:汇编语言(Assembly)</p>
<p>注意:本文列出了两种算术运算的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用。</p>
<p class="maodian"></p><h2>1.计算S=1+2×3+3×4+4×5+···+N(N+1)</h2>
<p class="maodian"></p><h3>1.1设计要求:</h3>
<p>设计程序,实现数学公式S=1+2×3+3×4+4×5+···+N(N+1)的算法。数值N由加键盘输入,计算结果在显示终端输出。设计要求:计算结果不超过十六位寄存器的存储能力,如有溢出提示错误。</p>
<p class="maodian"></p><h3>1.2设计思路:</h3>
<p>输入N值然后把N给BH作为循环次数,通过循环实现乘和累加计算,结果为十六进制,通过除以10得到十进制,存入堆栈再依次输出。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712464124.png" /></p>
<p class="maodian"></p><h3>1.3程序清单:</h3>
<div class="jb51code">
<pre class="brush:plain;">
DATA SEGMENT
   pkey   DB0dh,0ah,"pleas input N end by ';' :$"
   over   DB0AH,0DH,"overflow!",0dh,0ah,'$'
   resultDB0dh,0ah,'result is:','$'
   DAT1DB8 DUP(0)
DATA ENDS

STACK SEGMENT
    SSTACK DB 100 DUP(0)
STACK ENDS

CODE SEGMENT
   ASSUME CS:CODE,DS:DATA,SS:STACK
   
STATE:
    MOV AX,DATA
    MOV DS,AX
    LEA SI,DAT1   ;开辟缓冲区
    LEA DX,pkey
    MOV AH,9
    INT 21H         ;DOS功能调用,输出字符串
   
LLP:MOV AH,1
    INT 21H         ;DOS功能调用,输入N值
    SUB AL,2FH      
    INC DX          ;DX计数
    MOV ,AL   ;将输入的数据存在SI缓冲区
    INC SI
    CMP AL,0CH      ;输入为封号结束输入
    JNZ LLP
    SUB SI,2
    CMP DX,02H      ;DX不为2表示输入为两位数
    JNZ LLLP

LLP1:MOV CX,1
   MOV BL,2       ;赋初始值   
   JMP LP
LLLP:
   MOV DI,SI
   SUB DI,1         
   SUB ,1
   MOV AL,10
   MUL
   ADD ,AX   ;输入是两位数时十位乘10加个位
   SUB AH,AH
   JMP LLP1
   
LP: MOV BH,      ;把循环次数给BH
    MOV AL,BL
    INC BL
    MUL BL         ;BL(加1)和AL(原值)相乘给AX
    ADD CX,AX      ;AX和CX相加给CX,通过循环实现累加
    JOOOF         ;如果溢出重新输入
    CMP BH,BL      ;判断是否达到N值
    JNZ LP
    MOV AX,CX
    MOV CX,0AH
    MOV BX,0               
            
   
LOP:MOV DX,0
    DIV CX         ;AX表示的32位数除以10,商放在AX,余数放在DX
    INC BX
    ADD DX,30H
    PUSH DX         ;将余数依次压入栈
    CMP AX,0
    JNZ LOP         ;商不为0继续除10
    LEA DX,result
    MOV AH,9
    INT 21H         ;DOS功能调用,输出字符串
   
OUTPUT:
   POP DX
   MOV AH,2
   INT 21H          ;DX中数据依次出栈并显示
   DEC BX
   JNZ OUTPUT       ;出栈完成后停止
   JMP STATE            
   
OOF:LEA DX,over
    MOV AH,09H
    INT 21H         ;DOS功能调用,溢出显示
    JMP STATE
         
CODE ENDS

END STATE</pre>
</div>
<p class="maodian"></p><h3>1.4程序运行结果及分析:</h3>
<p>乘法和累加计算根据流程图一步步赋值即可得到,在输入两位数和结果转十进制输出时遇到了麻烦,通过查找资料不断尝试,最终找到了简单的解决办法,即输入两位时移位累加,输出除以10存入堆栈并依次输出显示。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712464225.png" /></p>
<p>图5 计算S=1+2×3+3×4+4×5+···+N(N+1)设计结果</p>
<p class="maodian"></p><h2>2.计算N!</h2>
<p class="maodian"></p><h3>2.1设计要求:</h3>
<p>掌握汇编语言实现高级语言中数学函数的方法。设计程序,实现数学公式N!=N(N-1)(N-2)······2*1的算法。数值N由键盘输入,计算结果在显示终端输出。设计要求:N的范围为0-65535,即不超出16位寄存器的存储容量。</p>
<p class="maodian"></p><h3>2.2设计思路:</h3>
<p>输入N值,通过循环实现阶乘并将计算结果存入AX,然后十六进制转十进制输出。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712464226.png" /></p>
<p class="maodian"></p><h3>2.3程序清单:</h3>
<div class="jb51code">
<pre class="brush:plain;">
DATA SEGMENT
    pkey   DB0AH,0DH,"Please Input N(1-8):",'$'
    result DB0AH,0DH,"the results is:",'$'
    over   DB0AH,0DH,"overflow!",0AH,0DH,'$'
DATA ENDS         

STACK SEGMENT
    SSTACK DB 100 DUP(0)
STACK ENDS         

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK
   
STATE:
       MOV AX,DATA
       MOV DS,AX   ;数据段初始化

       LEA DX,pkey
       MOV AH,09H
       INT 21H       ;DOS功能调用,显示字符串
      
       MOV AH,1      
       INT 21H       ;DOS功能调用,输入N
       SUB AL,30H
       CMP AL,08H
       JAOOF       ;输入大于8溢出
      
       XOR AH,AH   
       MOV BP,AX   ;赋循环计数值N给BP
      
LP:    MOV BX,BP
       DEC BX
       JZLLP       ;阶乘次数为BX,BX为0必须马上跳转
       MUL BX      ;AX中存放阶乘结果(十六进制转十进制用)
       DEC BP
       JNZ LP

LLP:   MOV CX,0
       MOV BX,10
      
LLLP:MOV DX,0   
       DIV BX      ;AX表示的32位数除以10,商放在AX,余数放在DX
       ADD DX,30H   
       PUSH DX       ;将余数转换为ASCII码值并压入栈
       INC CX
       CMP AX,0      ;商不为0就继续除10
       JNZ LLLP

       MOV AH,09H
       LEA DX,result
       INT 21H       ;DOS功能调用,输出字符串
      
LOP:   POP DX         
       MOV AH,2                                    
       INT 21H       ;DX各位出栈并显示
       LOOP LOP   
       JMP STATE   

OOF:   LEA DX,over
       MOV AH,09H
       INT 21H      ;DOS功能调用,溢出显示
       JMP STATE
   
CODE ENDS
   END STATE</pre>
</div>
<p class="maodian"></p><h3>2.4程序运行结果及分析:</h3>
<p>阶乘部分是利用MUL指令AX中存放计算结果并实现阶乘,除阶乘计算部分外,其它部分和第五题类似,同样结果转十进制输出时遇到了麻烦,利用除以10存入堆栈再依次取出并显示来实现。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202111/2021112712464227.png" /></p>
<p>图6 计算N!设计结果</p>
<p>到此这篇关于汇编语言系列之汇编实现简单数学运算的文章就介绍到这了,更多相关汇编语言数学运算内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>汇编语言系列之汇编实现字符串操作</li><li>汇编语言系列之汇编实现各种码制的转换(思路详解)</li><li>汇编语言Debug命令详解教程</li><li>汇编语言LDR指令和LDR伪指令详解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编语言系列之汇编实现简单数学运算