zoukankan      html  css  js  c++  java
  • 汇编语言-求X的阶乘

    1. 题目:求X的阶乘值

    2. 要求:输入一个整型数(不超过10),求出其阶乘值后输出,求阶乘的算法用子程序来实现。

    3. 提示:可以用递归来实现,也可以用简单的循环来实现。

    这里使用循环来实现:

    对于汇编新手,最好通过高级语言的编程测试,然后再写汇编代码,这样效果会好一些、

    求阶乘的C++代码如下:

     1 //The program is to find the factorial from 1 to 10
     2 //author:Karllen
     3 //Date:  05/21/2014
     4 
     5 #include <iostream>
     6 
     7 int factorial(int n);
     8 
     9 int main()
    10 {
    11     int n;
    12     std::cin>>n;
    13     std::cout<<factorial(n)<<std::endl;
    14 
    15     system("pause");
    16     return 0;
    17 }
    18 
    19 int factorial(int n)
    20 {
    21     int sum = 1;
    22     while (n!=1)
    23     {
    24         sum*=n;
    25         --n;
    26     }
    27     return sum;
    28 }

    汇编代码如下:

     1 ; Example assembly language program -- adds two numbers
     2 ; Author:  Karllen
     3 ; Date:    revised 05/2014
     4 
     5 .386
     6 .MODEL FLAT
     7 
     8 ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
     9 
    10 INCLUDE io.h            ; header file for input/output
    11 
    12 cr      EQU     0dh     ; carriage return character
    13 Lf      EQU     0ah     ; line feed
    14 
    15 .STACK  4096            ; reserve 4096-byte stack
    16         
    17 .DATA                   ; reserve storage for data
    18         prompt   BYTE "The program is to find the factorial from 1 to 10",cr,Lf,0
    19         numInput BYTE "Please enter a number from 1 to 10",cr,Lf,0
    20         answer   BYTE "The number factorial is"
    21         value    BYTE 11 DUP(?)
    22                  BYTE cr,Lf,0
    23 
    24 PUBLIC _start         
    25 .CODE 
    26 _start:
    27                                 ; start of main program code
    28         output prompt 
    29         
    30         doInput:
    31            output numInput
    32            input  value,11
    33            atod   value
    34            cmp    eax,1
    35            jl     doInput
    36            cmp    eax,10
    37            jg     doInput
    38         push   eax
    39         call   findFactorial
    40         add    esp,4
    41         
    42         dtoa   value,eax
    43         output answer 
    44         
    45         INVOKE  ExitProcess, 0  ; exit with return code 0
    46                   ; make entry point public
    47         
    48  findFactorial  PROC NEAR32
    49                   push ebp
    50                   mov  ebp,esp
    51                   
    52                   mov  eax,[ebp+8]
    53                   mov  ebx,eax
    54                   cmp  eax,1
    55                   je   endFindWhile     
    56                   doFindWhile:
    57                            dec ebx
    58                            cmp ebx,1
    59                            je  endFindWhile
    60                            mul ebx
    61                            jmp doFindWhile
    62                   endFindWhile:          
    63                   pop  ebp
    64                   ret
    65    findFactorial  ENDP
    66 END                             ; end of source code

    测试结果:

  • 相关阅读:
    MapReduce —— MapTask阶段源码分析(Output环节)
    MapReduce——移动数据不如移动计算
    MapReduce —— MapTask阶段源码分析(Input环节)
    MapReduce——客户端提交任务源码分析
    NameNode和SecondaryNameNode角色功能分析
    线程的实现原理
    RTFSC:SpringBoot 源码惊鸿一瞥
    垃圾收集器学习笔记
    常见的六种OOM异常和错误
    简单类型多线程加锁
  • 原文地址:https://www.cnblogs.com/Forever-Kenlen-Ja/p/3744109.html
Copyright © 2011-2022 走看看