没有合适的资源?快使用搜索试试~ 我知道了~
这次再发一个ASM程序:计算圆周率,比上一个难度大了点儿,主要是完成了N(N>1000000000)位十进制大数的加、减、除运算及显示输出。编写代码用了我一天的业余时间,调试则用了两天,惨啊,明明是4*4*5*DATAMAX/1000==04C4B400h,DATAMAX=1000000000,我写成 mov dword ptr[eax],4*4*5*DATAMAX/1000 竟然没编译出我想要的 mov dword ptr[eax],04C4B400h 让我费了很多时间才发现,编译器有bug?? 总算调试通过了,了了我多年的一个心愿。在还没有见过计算机为何物时就知道可以用它计算圆周率,后来用VC++编写了一个计算程序,速度一直不够快,就想着哪一天能用ASM写一个多好,现在总算完成了,速度也比较满意。如果我有时间有精力,而且兴趣还没有消失的话,以后会再写一些东西,希望大家不要打击我,我会慢慢进步的。
资源推荐
资源详情
资源评论
【原创】再发一个asm源码:计算圆周率
--------------------------------------------------------------------------------
标 题: 【原创】再发一个asm源码:计算圆周率
作 者: 王仁军
时 间: 2007-04-25,12:40
链 接: http://bbs.pediy.com/showthread.php?t=43316
[编程工具]masm32(9.00)+RadAsm2.2.0.9
[调试工具]OD1.10
[调试平台]WinXP/SP2
这次再发一个ASM程序:计算圆周率,比上一个难度大了点儿,主要是完成了N(N>1000000000)位十进制大数的加、减、除运算及显示输出。编写代码用了我一天的业余时间,调试则用了两天,惨啊,明明是4*4*5*DATAMAX/1000==04C4B400h,DATAMAX=1000000000,我写成
mov dword ptr[eax],4*4*5*DATAMAX/1000 竟然没编译出我想要的
mov dword ptr[eax],04C4B400h 让我费了很多时间才发现,编译器有bug??
总算调试通过了,了了我多年的一个心愿。在还没有见过计算机为何物时就知道可以用它计算圆周率,后来用VC++编写了一个计算程序,速度一直不够快,就想着哪一天能用ASM写一个多好,现在总算完成了,速度也比较满意。如果我有时间有精力,而且兴趣还没有消失的话,以后会再写一些东西,希望大家不要打击我,我会慢慢进步的。
;***********************************************************************************************************
;计算原理:
;PI=PI=16x(1/5-1/(5^3/3)+1/(5^5/5)-1/(5^7/7)+...)-4x(1/239-1/(239^3/3)+1/(239^5/5)-1/(239^7/7)+...)
;PI=4x(4x5/25-239/57121)/1-4x(4x5/25^2-239/57121^2)/3+4x(4x5/25^3-239/57121^3)/5-...
;每一个dword型数据只能放9位十进制数,用N个dword数存储9N位计算结果
;y=(4*4*5/25^a),z=(4*239/57121^a),c=(y-z)/a,x+=c 或 x-=c,a+=2(a初始为1),循环计算直到y=0结束
;***********************************************************************************************************
;“计算圆周率.Asm”文件
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
--------------------------------------------------------------------------------
标 题: 【原创】再发一个asm源码:计算圆周率
作 者: 王仁军
时 间: 2007-04-25,12:40
链 接: http://bbs.pediy.com/showthread.php?t=43316
[编程工具]masm32(9.00)+RadAsm2.2.0.9
[调试工具]OD1.10
[调试平台]WinXP/SP2
这次再发一个ASM程序:计算圆周率,比上一个难度大了点儿,主要是完成了N(N>1000000000)位十进制大数的加、减、除运算及显示输出。编写代码用了我一天的业余时间,调试则用了两天,惨啊,明明是4*4*5*DATAMAX/1000==04C4B400h,DATAMAX=1000000000,我写成
mov dword ptr[eax],4*4*5*DATAMAX/1000 竟然没编译出我想要的
mov dword ptr[eax],04C4B400h 让我费了很多时间才发现,编译器有bug??
总算调试通过了,了了我多年的一个心愿。在还没有见过计算机为何物时就知道可以用它计算圆周率,后来用VC++编写了一个计算程序,速度一直不够快,就想着哪一天能用ASM写一个多好,现在总算完成了,速度也比较满意。如果我有时间有精力,而且兴趣还没有消失的话,以后会再写一些东西,希望大家不要打击我,我会慢慢进步的。
;***********************************************************************************************************
;计算原理:
;PI=PI=16x(1/5-1/(5^3/3)+1/(5^5/5)-1/(5^7/7)+...)-4x(1/239-1/(239^3/3)+1/(239^5/5)-1/(239^7/7)+...)
;PI=4x(4x5/25-239/57121)/1-4x(4x5/25^2-239/57121^2)/3+4x(4x5/25^3-239/57121^3)/5-...
;每一个dword型数据只能放9位十进制数,用N个dword数存储9N位计算结果
;y=(4*4*5/25^a),z=(4*239/57121^a),c=(y-z)/a,x+=c 或 x-=c,a+=2(a初始为1),循环计算直到y=0结束
;***********************************************************************************************************
;“计算圆周率.Asm”文件
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
include 计算圆周率.inc
.code
start:
invoke InitCommonControls
invoke GetModuleHandle,NULL
invoke DialogBoxParam,eax,IDD_DIALOG_MAIN,NULL,addr DlgProc,NULL
invoke ExitProcess,0
;########################################################################
_CalPI proc uses edi esi ebx
LOCAL @hMemX,@pMemX,@hMemY,@pMemY,@hMemZ,@pMemZ,@hMemC,@pMemC
LOCAL @dwDigit,@dwCalLen,@dwA,@dwI,@dwTime
invoke GetDlgItemInt,hWndDlg,IDC_DIGIT,0,0
.if eax<1
invoke SetDlgItemInt,hWndDlg,IDC_DIGIT,1000,0
mov eax,1000
.endif
add eax,4
mov @dwDigit,eax ;要计算的位数
;mov ecx,eax
;shr ecx,7
;add eax,ecx ;要多算几位,因为最后若干位不准确
mov ecx,DATALEN ;要多算几位,因为最后若干位不准确
add eax,ecx
div ecx ;每四字节存放 DATALEN 位十进制的结果
.code
start:
invoke InitCommonControls
invoke GetModuleHandle,NULL
invoke DialogBoxParam,eax,IDD_DIALOG_MAIN,NULL,addr DlgProc,NULL
invoke ExitProcess,0
;########################################################################
_CalPI proc uses edi esi ebx
LOCAL @hMemX,@pMemX,@hMemY,@pMemY,@hMemZ,@pMemZ,@hMemC,@pMemC
LOCAL @dwDigit,@dwCalLen,@dwA,@dwI,@dwTime
invoke GetDlgItemInt,hWndDlg,IDC_DIGIT,0,0
.if eax<1
invoke SetDlgItemInt,hWndDlg,IDC_DIGIT,1000,0
mov eax,1000
.endif
add eax,4
mov @dwDigit,eax ;要计算的位数
;mov ecx,eax
;shr ecx,7
;add eax,ecx ;要多算几位,因为最后若干位不准确
mov ecx,DATALEN ;要多算几位,因为最后若干位不准确
add eax,ecx
div ecx ;每四字节存放 DATALEN 位十进制的结果
剩余12页未读,继续阅读
资源评论
ghi0001
- 粉丝: 4
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功