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
测试结果: